Вы можете использовать мост, не привязывая к нему какие-либо физические интерфейсы Ethernet на узле виртуальной машины.
Скажем, мы придерживаемся выбора подсети 10.0.2.0/24
(что НЕ обязательно):
# ip l добавить мост типа natbr0
# ip a add 10.0.2.1/24 dev natbr0
Затем создайте следующий файл:
$ echo 'разрешить natbr0' | тройник судо /etc/qemu/bridge.conf
разрешить natbr0
Затем запустите qemu, например, -nic мост,br=natbr0
или же -netdev bridge,br=natbr0,id=nb0 -device virtio-net,netdev=nb0
, который будет кран
вашу виртуальную машину к мосту динамическим образом (т. кран
интерфейс будет удален после выключения виртуальной машины).
Вам также необходимо настроить статический IP-адрес на виртуальной машине:
# ip a add 10.0.2.2/24 dev ens3
# ip r добавить по умолчанию через 10.0.2.1
Если вы также не настроили DHCP-сервер (например, с dnsmasq) на хосте. Не забудьте также настроить DNS-сервер для использования внутри виртуальной машины.
Обратите внимание, что виртуальные машины, использующие один и тот же мост, могут взаимодействовать друг с другом, если только вы не заблокируете такое взаимодействие каким-либо образом (например, с помощью ebtables).
По умолчанию
маршрут (и DNS-сервер для использования) необходимы только в том случае, если вы хотите, чтобы виртуальная машина могла достичь «снаружи». Если вам нужно только, чтобы он мог общаться с хостом виртуальной машины, вы должны пропустить вторую команду и можете прекратить чтение. (Ну, читайте P.S.
)
Вероятно, было бы лучше настроить, например. dnsmasq на хосте в качестве переадресатора DNS, если вы не хотите использовать определенный «общедоступный» DNS-сервер в виртуальной машине, хотя и используете DNAT для пересылки DNS-запросов, например. 192.168.1.1
должны работать для основных.
Затем вам нужно включить переадресацию IP:
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
Если вы хотите избежать переадресации IP-адресов с/на определенный сетевой интерфейс (например тун0
) из соображений безопасности вам необходимо настроить брандмауэр. Например:
# iptables -A ВПЕРЕД -i tun0 -j УДАЛИТЬ
# iptables -A ВПЕРЕД -o tun0 -j УДАЛИТЬ
Поскольку у вас есть (VPN) туннельные маршруты, которые практически переопределяют По умолчанию
маршрут, трафик от виртуальной машины к Интернету также будет идти в туннель (если вы не добавили примеры правил выше). Если вы хотите, чтобы трафик пошел, например. через ваш маршрутизатор, вам понадобится политика маршрутизации. Например:
# ip ru add iif natbr0 таблица поиска 123
# ip r add 192.168.1.1 dev wlan0 table 123 # возможно необязательно
# ip r добавить по умолчанию через 192.168.1.1 таблица 123
Вы также можете запретить своим виртуальным машинам доступ к хостам вашей локальной сети:
# iptables -A FORWARD -i natbr0 -d 192.168.1.0/24 -j DROP
Делайте исключения (обратите внимание на -Я
), если вы собираетесь перенаправлять DNS-запросы на свой маршрутизатор:
# iptables -I FORWARD -i natbr0 -d 192.168.1.1 -p tcp --dport 53 -j ПРИНЯТЬ
# iptables -I FORWARD -i natbr0 -d 192.168.1.1 -p udp --dport 53 -j ПРИНЯТЬ
Наконец, настройте iptables для динамического выполнения SNAT (в соответствии с исходящим интерфейсом) для вашей подсети виртуальной машины:
# iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -j MASQUERADE
Обратите внимание, что это НЕ предназначено и не будет препятствовать тому, чтобы определенный трафик извне (ваши физические хосты LAN или Интернет; хост виртуальной машины не в счет) мог достичь ваших виртуальных машин. Это просто прерывает связь как побочный эффект, когда исходный адрес отвечающего трафика от виртуальных машин изменяется до его пересылки.Для правильной изоляции вам потребуются (дополнительные) соответствующие правила в ВПЕРЕД
цепь. Если у вас есть такая необходимость, подумайте о том, чтобы установить там «с сохранением состояния».
Кроме того, вы можете перенаправить DNS-запросы к хосту с виртуальных машин на ваш маршрутизатор:
iptables -t nat -A PREROUTING -d 10.0.2.1 -p udp --dport 53 -j DNAT --к месту назначения 192.168.1.1
iptables -t nat -A PREROUTING -d 10.0.2.1 -p tcp --dport 53 -j DNAT --к месту назначения 192.168.1.1
Который более или менее позволит вам использовать 10.0.2.1
в качестве DNS-сервера в виртуальной машине.
P.S. Все манипуляции выше (кроме создания/записи в /etc/qemu/bridge.conf
) нестабильны, т. е. они исчезнут после перезагрузки (если только ваш дистрибутив не сделает что-нибудь глупое). Я не собираюсь углубляться в то, как вы можете сделать их постоянными, поскольку существуют разные способы/подходы, и они могут зависеть от дистрибутива.