我有一个 kvm 设置,其中有多个运行 ubuntu 的客户 vm。
由于某种原因,我无法再通过端口 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 与本地托管域名的通信则可行。
Ping 的工作原理:
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
经过这 2 项更改(可能有帮助,也可能没有帮助)并重新启动 curl 后,将不再遇到超时和“网络无法访问”错误,而是生成来自本地 apache 的结果。很明显,这是我自己在 iptables 中的端口转发造成的。我没有为端口 80 和 443 的端口转发指定传入接口。我添加了 br0,然后一切正常。
以下是我的端口转发 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 时手动输入这些相同的规则不会产生有效的端口转发配置。)