
我有一個 kvm 設置,其中有幾個運行 ubuntu 的來賓虛擬機。
由於某種原因,我無法再透過連接埠 80 從客人到外部的流量。反之亦然,apache 以其應有的方式提供託管網頁。其他連接埠(例如 ssh)也可以正常運作。
這是一個例子:
me@guest:~$ curl heise.de
curl: (7) Failed to connect to 2a02:2e0:3fe:100::8: Network is unreachable
Curl 在較長的超時後失敗,網路無法訪問,似乎嘗試使用 IPv6 位址,但它不應該這樣做。 Curl 與本機託管網域相比有效。
平作品:
me@guest:~$ ping heise.de
PING heise.de (193.99.144.80) 56(84) bytes of data.
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=1 ttl=245 time=6.92 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=2 ttl=245 time=7.05 ms
由於這件事同時發生在我所有的客人身上,我想這一定是我對主人做了什麼。但即使我關閉所有自製 iptables 規則,它仍然不起作用。
因此,在 kvm/libvirt 網路內部的某個地方,我的 http 請求去了不該去的地方。這是我的 KVM 網路配置
<network>
<name>network_nat</name>
<uuid>....</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:30:9B:D6'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.128' end='192.168.100.254' />
<host mac='52:54:00:e4:71:f5' name='web' ip='192.168.100.210' />
</dhcp>
</ip>
</network>
我的客人配置為使用該網路。 Dhcp 似乎可以工作:至少來賓具有我配置的 IP 位址。
那麼為什麼我無法造訪訪客的任何網站呢?
答案1
重啟後部分問題解決。也許遵循這裡的建議:http://wiki.libvirt.org/page/Networking幫助修復網路介面。
我將這些行添加到/etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
我還更改了介面定義,如下/etc/network/interfaces
所示:
auto br0
iface br0 inet static
address 176.9.xxx.xxx
broadcast 176.9.xxx.xxx
netmask 255.255.255.224
gateway 176.9.xxx.xxx
bridge_ports eth0
bridge_fd 0
bridge_maxage 0
bridge_stp off
在這兩個變更(可能有幫助或沒有幫助)之後,重新啟動curl將不再遇到超時和「網路無法存取」錯誤,而是從我的本機apache產生結果。很明顯,罪魁禍首是我自己在 iptables 中的連接埠轉送。我沒有為連接埠 80 和 443 的連接埠轉送指定傳入介面。
這是我的連接埠轉送的 iptables 規則。我將它與 ufw 結合使用作為防火牆,所以我在末尾有這些行/etc/ufw/before.rules
這項被加入到過濾表中:
-I FORWARD -m state -d 192.168.100.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
這是我的 nat 表。錯誤是省略了參數--in-interface
:
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 12345 -j DNAT --to 192.168.100.210:22
-A PREROUTING -p tcp --in-interface br0 --dport 80 -j DNAT --to 192.168.100.210:80
-A PREROUTING -p tcp --in-interface br0 --dport 443 -j DNAT --to 192.168.100.210:443
-A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
COMMIT
(注意:由於某種原因,在停用 ufw 時手動輸入這些相同的規則不會產生有效的連接埠轉送配置。)