通过 VLAN 桥接操作 KVM 虚拟机时配置 iptables

通过 VLAN 桥接操作 KVM 虚拟机时配置 iptables

我目前正在使用 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 上的私有子网。然而,关闭防火墙后,一切都按预期运行!

相关内容