Networking
在 VLAN 網橋上執行 KVM 虛擬機時配置 iptables
我目前正在使用跨兩台物理主機(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 上的私有子網。但是,在關閉防火牆後,現在一切都按預期工作了!