[Решено] KVM - виртуальная машина и хост, видные из внешней сети

Автор DragonVS, 16 мая 2014, 12:17:10

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

DragonVS

Здравствуйте. Всё время пользовался VirtualBox для создания виртуальных машин и никогда не испытывал проблем с настройками сети. Если надо было создать вмку с полным доступом в сеть и из сети, то ставил в настройках "Сетевой мост" на физический интерфейс и получал новый свободный IP от провайдерского DHCP. Также можно было зайти и на саму виртуалку с другой машины в другой сети.
Однако, жизнь заставила сесть за KVM (libvirt). И тут я столкнулся с проблемой - как сделать аналогичную систему? Можно было бы использовать готовый NAT интерфейс, но тогда пропадает доступ из сети. Пробовал создать руками мост (brctl addbr br0; brctl addif eth0;) и добавить его в качестве общего устройства при создании машины в virt-manager, но тогда пропадает доступ в сеть и из вне на сам хост (DHCP даёт новый IP на виртуальной машине, на хосту остаётся старый IP, но он не пингуется ниоткуда). Думал пробросить порты через nat, но даже не представляю какие нужны, т.к. виртуалка должна быть доступна по всем портам. Подключить вторую физическую сетевую на хост не вариант.
Прошу вашего совета, хоть и понимаю, что вопрос "ламерский". iptables везде (и на виртуалке, и на хосте) отключен (iptables -F, iptables -X [все_цепочки], iptables -P INPUT/OUTPUT/FORWARD ACCEPT), forwarding везде включен (sysctl -w net.ipv4.conf.all.forwarding=1), arp фильтры везде отключены (sysctl -w net.ipv4.conf.all.rp_filter=0). Выводы ip r и ip a под спойлером. И там, и там - Linux (Debian).
Открыть содержимое (спойлер)
Хост
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 54:04:a6:91:26:7b brd ff:ff:ff:ff:ff:ff
    inet 124.18.66.70/25 brd 124.18.66.127 scope global eth0
    inet6 fe80::5604:a6ff:fe91:267b/64 scope link
       valid_lft forever preferred_lft forever
9: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
    link/ether fe:54:00:d3:d0:d1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fed3:d0d1/64 scope link
       valid_lft forever preferred_lft forever
10: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
    link/ether 92:27:0e:ca:a0:11 brd ff:ff:ff:ff:ff:ff

# ip r
default via 124.18.66.1 dev eth0
169.254.0.0/16 dev eth0  scope link  metric 1000
124.18.66.0/25 dev eth0  proto kernel  scope link  src 124.18.66.70
[свернуть]

Заранее благодарю.

Сообщение объединено: 16 Май 2014, 13:35:54

Собственно, вот само решение проблемы.
На хосте при отключенном Network Manager необходимо добавить в /etc/network/interfaces:
auto br0 # автоматическое поднятие интерфейса при запуске
iface br0 inet dhcp # присваивание интерфейсу динамического ip
      bridge_ports eth0 # указываем, что мы мост и добавляем порт на физическое устройство-интерфейс
      bridge_fd 9 # добавляем задержку на forward (?)
      bridge_hello 2 # добавляем задержку на приветствие (?)
      bridge_maxage 12 # еще какая-то задержка... (?)
      bridge_stp off # выключаем протокол STP, чтобы не мешал

Потом в virt-manager при создании виртуалки выбираем в качестве устройства связи "br0 (Мост на eth0)".
И всё прекрасно!

К слову - зачем эти задержки нужны и почему у меня раньше не работало? Ведь тоже самое делал... только через brctl... и как добавить через iproute динамический адрес на интерфейс?