我的情况
- 2台物理机,每台有2个网络接口(eth0、eth1)。
- 它们充当虚拟机主机
- 仅对于一台机器,网络工作没有问题
- 首先,我有两个独立的网络,每台机器都有一个自己的虚拟 dhcp 服务器在运行
- 然后我尝试将分离的网络合并为一个
- 防火墙:shorewall(lan 的连接策略 = 两台机器上都允许)
- dhcp 服务器:dnsmasq
- 两台机器都可以连接到互联网
我想通过交叉电缆连接两台机器并希望它们共享一个网络,因此我只有一个带有一个网络的 dhcp 服务器,并且此 LAN 中的每台服务器都可以相互连接。这有意义吗,或者两个独立的 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 上看到 martian 日志
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
配置文件
机器1 /etc/shorewall/rules
***snip***
DNAT:debug net lan:10.62.63.20:22 tcp 5678 - xxx.xxx.xxx.xxx
***snip***
机器2 /etc/shorewall/rules
***snip***
DNAT:debug net lan:10.62.63.30:22 tcp 5678 - yyy.yyy.yyy.yyy
***snip***
机器1 /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 (远程): okping 10.62.63.1
到 br1 ip (本地): okping 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 (本地): okping 10.62.63.1
至 br1 ip (远程): okping 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 (本地):好的
答案1
问题出在出站数据包上,而不是入站数据包上。
dhcp 服务器为两台机器提供了相同的网关(10.62.63.1),因此机器 2 上的 dnat 入站数据包可以毫无问题地到达其位置(机器 2 上的网络),但返回的数据包被发送到机器 1 的网关(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 ***