История изменений
Исправление 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 в контейнере.