Назад | Перейти на главную страницу

Гостевая сеть Kvm недоступна

У меня есть установка kvm с несколькими гостевыми vms под управлением 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-адрес.

Так почему я не могу получить доступ к каким-либо веб-сайтам моих гостей?

Частично проблема решилась после перезагрузки. Возможно, следуя совету здесь: 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. Я добавил br0, и все заработало нормально.

Вот мои правила iptables для переадресации портов. Я использую это в сочетании с ufw в качестве брандмауэра, поэтому у меня есть эти строки в конце /etc/ufw/before.rules

Этот добавлен в таблицу фильтров:

-I FORWARD -m state -d 192.168.100.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

А это моя нат таблица. Ошибка заключалась в пропуске --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 отключен, не дает рабочей конфигурации переадресации портов.)