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

Виртуальная машина KVM не может получить доступ в Интернет

У меня есть 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 перезапуск