我的情况

我的情况

我的情况

在此处输入图片描述

  • 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 (远程): ok
  • ping 10.62.63.1到 br1 ip (本地): ok
  • 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 (本地): ok
  • ping 10.62.63.1至 br1 ip (远程): ok
  • 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 (本地):好的

答案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 ***

相关内容