LINUX.ORG.RU

История изменений

Исправление No, (текущая версия) :

Если 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, :

Если 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
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 в контейнере.