
У меня настроен 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 терпит неудачу с Network unreachable после довольно долгого тайм-аута и, похоже, пытается использовать адрес 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/Сетьпомог исправить сетевой интерфейс.
Я добавил эти строки в/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 больше не сталкивался с ошибкой тайм-аута и "network unreachable", вместо этого он выдавал результат от моего локального 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 не приводит к созданию рабочей конфигурации переадресации портов.)