Kvm 访客网络无法访问

Kvm 访客网络无法访问

我有一个 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 时手动输入这些相同的规则不会产生有效的端口转发配置。)

相关内容