LINUX.ORG.RU
ФорумAdmin

Как обеспечить выход виртуальной машины в сеть?

 , , ,


1

2

Всем здравствуйте.

Есть виртуальная машина (VirtualBox), далее guest.

Хочу обеспечить guest’у выход в сеть (в т. ч. интернет), поместив его/её в отдельную подсеть и настроив host как маршрутизатор, минуя стандартные средства VirtualBox (Bridged, NAT, NAT Network).

Соот-но, на самой VM поднята только host-only network, этой сети на host’е соответствует интерфейс vboxnet0:

vboxnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.138.1  netmask 255.255.255.0  broadcast 192.168.138.255
        inet6 fe80::800:27ff:fe00:0  prefixlen 64  scopeid 0x20<link>
        ether 0a:00:27:00:00:00  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11796  bytes 1496688 (1.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Host и guest прекрасно видят друг друга, guest использует в кач-ве шлюза по умолчанию 192.168.138.1 (интерфейс vboxnet0 host’а).

В /etc/networks дополнительно определена сеть vboxnet0:

vboxnet0       192.168.138.0

Далее, iptables на host’е настроены примерно так:

*nat

-A POSTROUTING -o vboxnet0 -j MASQUERADE

COMMIT


*filter

# Incoming traffic from virtual network interfaces
-A INPUT -i vboxnet0 -j ACCEPT

# Incoming traffic to virtual networks
-A INPUT --destination vboxnet0/24 -j ACCEPT

-A FORWARD -i eth0 -o vboxnet0 -j ACCEPT
-A FORWARD -i vboxnet0 -o eth0 -j ACCEPT
-A FORWARD -j DROP

-A OUTPUT -j ACCEPT

COMMIT

В результате виртуальная машина «видна» извне (из физической домашней сети 192.168.0.0/24, куда подключён host своим инрефейсом eth0), но вот сама она ничего, кроме host’а (192.168.138.1), не видит.

ЧЯДНТ?

★★★★★

В результате виртуальная машина «видна» извне

Вот причина:

-A POSTROUTING -o vboxnet0 -j MASQUERADE

По основному вопросу, только костыли приходят на ум. Например поднять на хосте tap интерфейс, его указать коробке в качестве bridged и на нём поднять отдельную сеть. Но даже не знаю взлетит ли.

anc ★★★★★
()
Ответ на: комментарий от Legioner

Хочется иметь один адаптер «для всего» и не заморачиваться с метриками интерфейсов.

В VMware Workstation/Player это, например, возможно, если использовать их собственный NAT (vmnet8).

У VirtualBox, кажется, какая-то шизофрения: с точки зрения guest-машины, адаптер «host-only» не видит интернет, а адаптер “NAT network” таки видит интернет, но не виден за пределами своей сети, т. е. достучаться к нему извне нельзя. Здесь ещё особенность в том, что vmnet1 и vmnet8 на (физической) host-машине — честные виртуальные интерфейсы (на них можно навесить правила iptables), а пресловутый «NAT network» у VirtualBox в виде адаптера на host-машине не создаётся (им можно управлять только с помощью утилиты vboxmanage).

Bass ★★★★★
() автор топика
Последнее исправление: Bass (всего исправлений: 1)
Ответ на: комментарий от anc

поднять на хосте tap интерфейс, его указать коробке в качестве bridged и на нём поднять отдельную сеть.

А это мысль. Спасибо. Попробую.

Bass ★★★★★
() автор топика
Ответ на: комментарий от Bass

Не понял про метрики. Встроенный DHCP раздаёт правильные маршруты и в любой ОС оно будет работать из коробки: интернет пойдёт по NAT, а соединение с хостом пойдёт по host-only адаптеру. Дело твоё, но лично я так решал вопрос с виртуальными машинами, которым требуется доступ и к интернету и к хосту (или к соседним виртуальным машинам), оно всё просто работало без дополнительных настроек, в том числе и в винде.

Legioner ★★★★★
()
Ответ на: комментарий от Bass

VirtualBox тут не при чем

*nat
-A POSTROUTING -o vboxnet0 -j MASQUERADE

Это говорит о том, что для трафика, ВЫХОДЯЩЕГО в сторону гостя будет подменяться адрес источника. Поэтому виртуалка видна в локальной сети.

Тебе надо так:

-A POSTROUTING -o eth0 -j MASQUERADE

Это будет source NAT для всего трафика идущего через проводной интерфейс наружу. То есть трафик виртуалки для твоей локалки будет выглядеть как трафик твоей хостовой машины. Если этого нужно избежать и NAT-ить только трафик, направляющийся в интернет(но не трогать тот что ходит по локалке), тогда вот так:

-A POSTROUTING -o eth0 ! -d lan/mask -j MASQUERADE

где lan - адрес твоей локальной сети на проводном интерфейсе (например 192.168.1.0), а mask - маска(например 24). Но тогда клиенты твоей локалки должны будут знать маршрут до подсети виртуалки через хостовую машину - иначе ответный трафик до виртуалки не дойдет.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)

Если выход в Интернет через домашний роутер, то можно на нем добавить маршрут до подсети 192.168.138.0/24 через хост. А нат на хосте убрать.

iliyap ★★★★★
()
Ответ на: комментарий от ololoid

А IP forwarding на условном роутере включен?

net.ipv4.ip_forward = 1

Да, включён.

Bass ★★★★★
() автор топика
Ответ на: комментарий от Pinkbyte

Спасибо, исчерпывающе.

Попробую и отпишусь.

Bass ★★★★★
() автор топика
Ответ на: комментарий от iliyap

Спасибо, это действительно удобнее, чем руками писать post-up в /etc/network/interfaces (Debian).

Bass ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.