Networking

在 VLAN 網橋上執行 KVM 虛擬機時配置 iptables

  • August 13, 2019

我目前正在使用跨兩台物理主機(Host1 和 Host2)的 KVM 設置虛擬化環境。兩者都連接到同一個 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-rule 啟用了 NAT:

iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE

但現在問題來了:即使我可以從 VLAN 上的任何機器 ping VLAN 上的所有主機,我似乎也無法正確連接到在 VM 內執行的 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

我什至嘗試在 Host1 ( nc -l 4444) 和 Host2 ( nc 192.168.100.2 4444) 之間建立 netcat 連接時使用 tcpdump。似乎沒有流量通過。

這是在虛擬機上設置 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

我已經為此工作了兩天,但我似乎無法弄清楚。任何幫助將不勝感激。

我自己剛剛弄清楚了這個問題。當我向我的託管服務提供商寫支持票時,我想到了他們提供的額外防火牆。我假設它只覆蓋公共 IP 而不是 VLAN 上的私有子網。但是,在關閉防火牆後,現在一切都按預期工作了!

引用自:https://serverfault.com/questions/978938