Networking
ssh-DNAT 到位於 machine2 上的虛擬機後 machine1 日誌中的火星源(machine1 和 machine2 xover 已連接)
我的場景
- 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 ***