LINUX.ORG.RU
ФорумAdmin

Отдельный шлюз для виртуальных машин

 , ,


0

1

Добрый день коллеги!

Прошу дать совет по вот какому вопросу:

Вводные данные: Есть машина на AstraLinux c двумя внешними сетевыми интерфейсами Lan и Wlan.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether a8:a1:59:76:d2:24 brd ff:ff:ff:ff:ff:ff
    inet 10.194.100.36/24 brd 10.194.100.255 scope global dynamic noprefixroute eth0
       valid_lft 663395sec preferred_lft 663395sec
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fc:b3:bc:ce:33:94 brd ff:ff:ff:ff:ff:ff
    inet 10.194.118.192/24 brd 10.194.118.255 scope global dynamic noprefixroute wlan0
       valid_lft 58800sec preferred_lft 58800sec
4: virbr3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:35:a3:f0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.103.1/24 brd 192.168.103.255 scope global virbr3
       valid_lft forever preferred_lft forever

Lan в корпоративной сети, wi-fi в сети обычного провайдера через роутер. К роутеру доступа нет, настройки не поменять. На машине поднят QEMU с виртуалками. Виртуалки в бридже с NAT-ом на Wlan.

При загрузке система создает два маршрута по умолчанию с разными метриками.

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.194.100.1    0.0.0.0         UG    100    0        0 eth0
default         10.194.118.1    0.0.0.0         UG    600    0        0 wlan0
10.194.100.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
10.194.118.0    0.0.0.0         255.255.255.0   U     600    0        0 wlan0
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 virbr3
192.168.103.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr3 ```
Получается, что всё, что ломится в сеть идет через eth0, пока он доступен. 
Задача заставить виртуалки ходить в интернет через Wlan. Задать шлюз для моста в настройках не получается, там все коммуникации через 192.168.103.1. Добавить wf-fi в бридж с включением 4addr получается, но после этого он перестает подключаться к ТД и сеть внутри моста становиться неработоспособной . 

Что можно еще попробовать? Как правильно поступить? Что использовать? Задачи достукиваться до витруалок извне пока не стоит, просто доступ в инет.
Ответ на: комментарий от anc

А при чем тут pbr, если у человека 2 дефолта? Он даже и не сработает, т.к это взаимоисключающие методы маршрутизации. Тут либо 1 дефолт правильно сделать, либо убрать оба и таки вешать костыль

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

и управление роутером недоступно

А, верно. Но тут от уровня смелости (наглости) зависит. Прибить гвоздями последний выданный адрес и надеяться что wifi-роутер его не отдаст в ту минуту, когда хост в ребуте. А когда хост в норме, то dhcp переживет это самоуправство.

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

Если хочется совсем без PBR - нужно сделать bridge с внешней wifi картой в одной из виртуалок и запускать dhcp клиент на виртуалке в ВМ, а на самом wifi адаптере только поднимать шифрование канала, т.е. wpa_supplicant, можно ещё маки назначить, но думаю тут не нужно.

И уже внутри сети виртуалок маршрутизировать трафик через ту отдельную виртуалку, интерфейс которой в бридже с физическим wifi адаптером. На виртуалке, конечно нужны две сетевые карту.

Остальное - хоть squid поднимать в той ВМ, либо PBR, но в этом случае не нужно отказываться от DHCP шлюза и надеяться, что адресация в wifi сети не поменяется, если с хоста нужно выходить в нет.

Но это всё как-то костыльно, но возможно.

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

Так а всё. NAT у него уже есть, маршрут будет в сеть через роутер через WiFi.

Простите но вы предлагаете «просто игнорировать прилетевший по DHCP шлюз» куда по вашему мнению должны полететь пакеты при отсутствии defgw ?

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

Он может настроить отдельную таблицу маршрутизации которую использовать для трафика исходящего с виртуальных машин. У меня дома применяется сходная схема, она вполне рабочая

no-dashi-v2 ★★★★
()

Если wifi-адаптер используется только для виртуальных машин, то можно сделать wifi-маршрутизатор в отдельном сетевом пространстве имен:

# включаем передачу пакетов между сетевыми интерфейсами
sysctl -w net.ipv4.ip_forward=1

# смотрим имена беспроводного адаптера и сетевого интерфейса
iw dev

# в выводе будет что-то похожее на
phy#0
        Interface wlx112233445566
# имя адаптера - phy0, сетевого интерфейса - wlx112233445566

# создаем сетевое пространство имен vmwl0
ip netns add vmwl0

# переносим в него беспроводной адаптер
iw phy phy0 set netns name vmwl0

# создаем виртуальный сетевой интерфейс для доступа снаружи
ip link add veth-vmwl0 type veth peer name veth0

# один конец veth-vmwl0 остается снаружи, другой veth0 переносится в vmwl0
ip link set veth0 netns vmwl0

# создаем мост для виртуальных машин
ip link add br-vmwl0 type bridge
ip link set dev br-vmwl0 up

# подключаем виртуальный сетевой интерфейс к мосту
ip link set veth-vmwl0 master br-vmwl0
ip link set veth-vmwl0 up

# входим в сетевое пространство имен vmwl0
ip netns exec vmwl0 bash

# назначаем адрес для виртуального сетевого интерфейса
ip addr add 192.168.222.1/24 dev veth0
ip link set veth0 up

# подключаемся по wifi
wpa_supplicant -B -c/opt/my-wifi.conf -iwlx112233445566
dhclient wlx112233445566

# включаем NAT
nft -f /opt/vmwl0-nft.conf

# выходим из сетевого пространства имен vmwl0
exit

# запускаем vm
qemu-system-x86_64 -accel kvm -cpu host -m 1G -nic bridge,br=br-vmwl0,model=virtio-net-pci -cdrom alpine-standard-3.23.2-x86_64.iso

# т. к. dhcp-сервер не настроили, то внутри vm настраиваем сеть вручную
ip addr add 192.168.222.10/24 dev eth0
ip link set eth0 up
ip route add default via 192.168.222.1 dev eth0

# после этого должен работать доступ по ip-адресам
ping 8.8.8.8

Файл настроек /opt/my-wifi.conf для wpa_supplicant:

network={
    ssid="my-wifi-name"
    psk="my-password"
}

Файл настроек /opt/vmwl0-nft.conf для nft

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0;
    }
    chain forward {
        type filter hook forward priority 0;
    }
    chain output {
        type filter hook output priority 0;
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
    }

    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        ip saddr 192.168.222.0/24 ip daddr != 192.168.222.0/24 masquerade
    }
}

Для полноценной работы интернет в vm надо бы еще DNS настроить.

Вместо ручной настройки всего этого можно запустить OpenWRT в контейнере.

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

Если wifi-адаптер используется только для виртуальных машин, то можно сделать wifi-маршрутизатор в отдельном сетевом пространстве имен:

На br-vmwl0 назначить IP, и трафик можно роутить и с хоста.
Но wpa_supplicant, как я понял, из неймспейса vmwl0 запускается?

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

На br-vmwl0 назначить IP, и трафик можно роутить и с хоста.

Можно, но по условиям вопроса интернет есть по проводу.

Но wpa_supplicant, как я понял, из неймспейса vmwl0 запускается?

Да wpa_supplicant и dhcp-клиент запускаются в отдельном сетевом пространстве имен.

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

Отдельный шлюз для виртуальных машин можно настроить в самих виртуальных машинах. Если же он хочет, чтобы пакеты перехватывались и шли другим маршрутом сами, без настройки гостевых ВМ, тогда да, PBR.

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

Я видимо не очень понял задачу ТС. «Задача заставить виртуалки ходить в интернет через Wlan.». Для этого достаточно указать в виртуалках шлюзом 10.194.118.1 и маршрут до 10.194.118.1 напрямую через мост.

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

Для этого достаточно указать в виртуалках шлюзом 10.194.118.1

Вы перечитайте вводные указанные в теме, указать в виртуалках-то вам шлюзом хоть 8.8.8.8 никто не запрещает, но от этого оно робить не начнет.

anc ★★★★★
()