У меня есть KVM, настроенный для запуска виртуальной машины (Windows Home Server 2011, действующей как агент сборки) на выделенном сервере (CentOS 6.3). Недавно я запустил обновления на хосте, и виртуальная машина теперь не может подключиться к Интернету.
Виртуальная сеть работает через NAT, у хоста есть интерфейс (eth0: 0), настроенный со статическим IP-адресом (virt-manager правильно показывает сеть и ее IP-адрес), и все подключения к этому IP-адресу должны быть отправлены гостю.
Хост и гость могут пинговать друг друга, но гость не может пинговать ничего выше хоста, а я не могу пинговать гостя из любого другого места (я могу пинговать хост). Оба результата от гостя к другому серверу под моим контролем и от внешней системы к гостю возвращают «Порт назначения недоступен». Запуск tcpdump на хосте и в пункте назначения показывает, что хост отвечает на ping, но пункт назначения никогда его не видит (даже не похоже, что хост вообще беспокоится о его отправке, что заставляет меня подозревать iptables). Вывод ping соответствует этому, перечисляя ответы от 192.168.100.1.
Гость жестяная банка разрешить DNS, однако, что я считаю довольно странным. В сетевых настройках гостя (свойства TCP / IPv4 подключения) задан статический локальный IP-адрес (192.168.100.128), маска 255.255.255.0, а также шлюз и DNS на 192.168.100.1.
При первоначальной настройке vm / net я установил некоторые правила iptables для включения моста, но после того, как моя хостинговая компания пожаловалась на мост, я настроил новую виртуальную сеть с использованием NAT и считаю, что удалил все правила.
Сеть виртуальной машины работала отлично последние несколько месяцев, вплоть до вчерашнего дня. Я ничего не слышал от хостинговой компании, ничего не менял в гостевой системе, так что, насколько я знаю, больше ничего не изменилось (к сожалению, список обновленных пакетов с тех пор пропал, и я не заметил этого вниз).
Обновить:
iptables -L
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
ACCEPT tcp -- main-domain anywhere tcp dpt:mysql
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.100.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 192.168.100.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
ACCEPT all -- anywhere 192.168.100.128
ACCEPT all -- anywhere guest-subdomain
iptables -t nat -L
:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT all -- anywhere guest-subdomain to:192.168.100.128
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE tcp -- 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.100.0/24 !192.168.100.0/24
SNAT all -- 192.168.100.128 anywhere to:guest-ip
Эти строки в цепочке FORWARD:
ACCEPT all -- anywhere 192.168.100.128
ACCEPT all -- anywhere guest-subdomain
должно быть перед правила отклонения. Такой, что:
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.100.128
ACCEPT all -- anywhere guest-subdomain
ACCEPT all -- anywhere 192.168.100.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 192.168.100.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
Вы можете удалить их и использовать следующее, чтобы вставить правила вверху.
iptables -I FORWARD -d guest-subdomain -j ACCEPT
iptables -I FORWARD -d 192.168.100.128 -j ACCEPT
Кроме того, правило SNAT является избыточным, поскольку у вас уже есть правила MASQUERADE.
Может помочь перезапуск libvirtd .. Я однажды столкнулся с той же проблемой и только что перезапустил libvirtd. Правила iptables, соответствующие libvirtd, снова устанавливаются, и я могу пинговать внешний мир.
sudo service libvirtd перезапуск