![通过 VLAN 桥接操作 KVM 虚拟机时配置 iptables](https://linux22.com/image/741278/%E9%80%9A%E8%BF%87%20VLAN%20%E6%A1%A5%E6%8E%A5%E6%93%8D%E4%BD%9C%20KVM%20%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%97%B6%E9%85%8D%E7%BD%AE%20iptables.png)
我目前正在使用 KVM 设置一个跨两台物理主机(Host1 和 Host2)的虚拟化环境。两台主机都连接到同一个 VLAN。两台机器上的网络接口配置如下:
auto lo
iface lo inet loopback
auto enp4s0
iface enp4s0 inet static
address <<public-IP>>
netmask <<netmask>>
gateway <<gateway>>
auto enp4s0.4000
iface enp4s0.4000 inet manual
vlan-raw-device enp4s0
mtu 1400
auto br0
iface br0 inet static
address 192.168.100.<<1 or 2, depending on the host>>/24
bridge_ports enp4s0.4000
虚拟机像这样连接到网络:
<interface type='bridge'>
<mac address='52:54:00:91:64:64'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
和:
auto ens3
iface ens3 inet static
address 192.168.100.<<101 or 102, depending on the VM>>/24
gateway 192.168.100.<<1 or 2, depending on the host>>
到目前为止,一切都运行良好。从虚拟机,我可以 ping 通两台主机以及两台机器上的所有其他虚拟机。现在我已通过添加以下 iptables 规则启用了 NAT,因此我还可以访问互联网:
iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE
但现在出现了一个问题:尽管我可以从 VLAN 上的任何一台机器 ping VLAN 上的所有主机,但我似乎无法正确连接到虚拟机内运行的 TCP 服务。以下是我的观察结果:
- 从 Host1,我可以访问 VM1 中的 Web 服务器(在 Host1 上运行)。
- 从 Host2,我可以访问 VM2 中的 Web 服务器(在 Host2 上运行)。
- 从 VM1(在 Host1 上运行),我无法访问 VM2(在 Host2 上运行)中的 Web 服务器,反之亦然(连接似乎超时,我没有收到连接被拒绝的提示)。
- 从 Host1,我无法访问 VM2 中的 Web 服务器(在 Host2 上运行),反之亦然(同样,连接似乎超时)。
- 另外,使用 netcat,我发现我无法从 Host2 访问 Host1 上的 TCP 服务(同样,连接似乎超时了)。
真正让我吃惊的是 ping 可以工作,但 curl 却不行。对我而言(因为我对网络不是很有经验),这似乎可能是 iptables 的某种配置问题。这是目前在两台主机(运行和 )上设置 iptables 的方式iptables -t nat -L -nv
:
输出iptables -L -nv
:
Chain INPUT (policy ACCEPT 31 packets, 3143 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 5 packets, 520 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 23 packets, 4089 bytes)
pkts bytes target prot opt in out source destination
输出iptables -t nat -L -nv
:
Chain PREROUTING (policy ACCEPT 19 packets, 1313 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 6 packets, 352 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
13 961 MASQUERADE all -- * enp4s0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
我甚至尝试使用 tcpdump 在 Host1 ( nc -l 4444
) 和 Host2 ( nc 192.168.100.2 4444
) 之间建立 netcat 连接。似乎没有任何流量通过。
这是在虚拟机上设置 iptables 的方式:
输出iptables -L -nv
:
Chain INPUT (policy ACCEPT 31 packets, 3143 bytes)
pkts bytes target prot opt in out source destination
6 399 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT 5 packets, 520 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 23 packets, 4089 bytes)
pkts bytes target prot opt in out source destination
4 1066 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80 ctstate ESTABLISHED
输出iptables -t nat -L -nv
:
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
我已经研究这个问题两天了,但似乎还是搞不清楚。如能得到任何帮助我将不胜感激。
答案1
我刚刚自己解决了这个问题。当我向托管服务提供商写支持单时,我想到了他们提供的额外防火墙。我以为它只覆盖公共 IP,而不覆盖 VLAN 上的私有子网。然而,关闭防火墙后,一切都按预期运行!