Networking

ssh-DNAT 到位於 machine2 上的虛擬機後 machine1 日誌中的火星源(machine1 和 machine2 xover 已連接)

  • November 29, 2012

我的場景

在此處輸入圖像描述

  • 2 台物理機,每台都有 2 個網路介面(eth0、eth1)。
  • 它們充當虛擬機主機
  • 僅對於一台機器,網路工作沒有問題
  • 首先我有兩個獨立的網路,每台機器都有自己的虛擬 dhcp 伺服器執行
  • 然後我嘗試將分離的網路合併為一個
  • 防火牆:shorewall(區域網路的連接策略 = 兩台機器上都允許)
  • dhcp 伺服器:dnsmasq
  • 兩台機器都可以連接到網際網路

我想通過交叉電纜連接兩台機器並希望它們共享一個網路,所以我只有一個帶有一個網路的 dhcp 伺服器,並且這個區域網路中的每台伺服器都可以相互連接。這有意義還是兩個單獨的 dhcp 伺服器和網路是更好的方法?

問題

下面我添加了一些配置並進行了一些連接測試。

簡而言之

  • machine1 + machine2 可以到達 machine1 上的 ips
  • machine1 + machine2 無法訪問 machine2 上的 ips
  • machine1 + machine2 可以到達 machine2 上的 ips
  • 外部 dnat(例如 ssh)確實適用於 machine1(埠 5678 -> 10.62.63.20:22)
  • 外部 dnat(例如 ssh)不適用於 machine2(埠 5678 -> 10.62.63.30:22)

如果我 ssh 連接到 machine1 埠 5678,則到 10.62.62.20 的連接有效,我只能在 machine1 上看到來自此連接的shorewall 日誌條目。但如果我連接到 machine2 埠 5678,則連接不起作用,我可以在 machine1 上看到火星登錄

Nov 29 15:26:57 machine1 kernel: [ 7495.749894] martian source **ssh.client.ip.addr** from **yyy.yyy.yyy.yyy**, on dev br1

機器概述

machine1 虛擬機:

  • dhcp 10.62.63.2
  • web1 10.62.63.20

machine2 虛擬機:

  • web2 10.62.63.30

配置文件

machine1 /etc/shorewall/規則

***snip***
DNAT:debug  net  lan:10.62.63.20:22  tcp  5678  -  xxx.xxx.xxx.xxx
***snip***

machine2 /etc/shorewall/規則

***snip***
DNAT:debug  net  lan:10.62.63.30:22  tcp  5678  -  yyy.yyy.yyy.yyy
***snip***

machine1 /etc/networking/interfaces

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
#allow-hotplug eth0 
auto eth0
iface eth0 inet manual


# device: eth1
#allow-hotplug eth1
auto eth1
iface eth1 inet manual 

auto br0
iface br0 inet static
 address   xxx.xxx.xxx.xxx
 broadcast xxx.xxx.xxx.xxx
 netmask   xxx.xxx.xxx.xxx
 gateway   xxx.xxx.xxx.xxx
 bridge_ports eth0
 bridge_fd 0
 bridge_hello 2
 bridge_maxage 12
 bridge_maxwait 0
 bridge_stp off


auto br1
iface br1 inet static
 address 10.62.63.1
 broadcast 10.62.63.255
 netmask 255.255.255.0
 bridge_ports eth1
 bridge_fd 0
 bridge_hello 2
 bridge_maxage 12
 bridge_maxwait 0
 bridge_stp off

machine2 /etc/networking/interfaces

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
#allow-hotplug eth0 
auto eth0
iface eth0 inet manual


# device: eth1
#allow-hotplug eth1
auto eth1
iface eth1 inet manual 

auto br0
iface br0 inet static
 address   yyy.yyy.yyy.yyy
 broadcast yyy.yyy.yyy.yyy
 netmask   yyy.yyy.yyy.yyy
 gateway   yyy.yyy.yyy.yyy
 bridge_ports eth0
 bridge_fd 0
 bridge_hello 2
 bridge_maxage 12
 bridge_maxwait 0
 bridge_stp off


auto br1
iface br1 inet static
 address 10.62.63.3
 broadcast 10.62.63.255
 netmask 255.255.255.0
 bridge_ports eth1
 bridge_fd 0
 bridge_hello 2
 bridge_maxage 12
 bridge_maxwait 0
 bridge_stp off

測試

機器 1 (10.62.63.1)

路線:

ip route show
yyy.yyy.yyy.yyy/yy dev br0  proto kernel  scope link  src yyy.yyy.yyy.yyy
10.62.63.0/24 dev br1  proto kernel  scope link  src 10.62.63.1
default via yyy.yyy.yyy.yyy dev br0
  • ping 10.62.63.3到 br1 ip(遠端):好的
  • ping 10.62.63.1到 br1 ip(本地):好的
  • ping 10.62.63.2到 dns(本地):好的
  • ping 10.62.63.20到 web01(本地):好的
  • ping 10.62.63.30到 web02(遠端):好的
  • ssh 10.62.63.20到 web01(本地):好的
  • ssh 10.62.63.30到 web02(遠端):好的

機器 2 (10.62.63.3)

路線:

ip route show
yyy.yyy.yyy.yyy/yy dev br0  proto kernel  scope link  src yyy.yyy.yyy.yyy
10.62.63.0/24 dev br1  proto kernel  scope link  src 10.62.63.3
default via yyy.yyy.yyy.yyy dev br0
  • ping 10.62.63.3到 br1 ip(本地):好的
  • ping 10.62.63.1到 br1 ip(遠端):好的
  • ping 10.62.63.2到 dns(遠端):好的
  • ping 10.62.63.20到 web01(遠端):好的
  • ping 10.62.63.30到 web02(本地):好的
  • ssh 10.62.63.20到 web01(遠端):好的
  • ssh 10.62.63.30到 web02(本地):好的

問題是出站數據包,而不是入站數據包。

dhcp 伺服器為兩台機器(10.62.63.1)提供了相同的網關,因此 machine2 上的 dnat 入站數據包可以毫無問題地到達它們的位置(machine2 上的 web),但隨後返回的數據包被發送到 machine1 的網關(10.62. 63.1)而不是來自它的來源(10.62.63.3)。

所以它作為martion包登陸machine1。

解決方案是在 dns (dnsmasq) 上添加標記,以便不同主機上的虛擬機獲得不同的網關:

/etc/dnsmasq.conf

*** snip ***

dhcp-host=set:machine1,ff:ff:ff:ff:ff:ff,web01,10.62.63.20
dhcp-host=set:machine2,ee:ee:ee:ee:ee:ee,web02,10.62.63.30

dhcp-option=tag:machine1,option:router,10.62.63.1
dhcp-option=tag:machine2,option:router,10.62.63.3

*** snip ***

引用自:https://serverfault.com/questions/453155