Работа протестирована на МиниПК на Ryzen 7 5700U с двумя HDD 3.5: https://alii.pub/71mcyu?erid=2SDnjcCC1yC
Мы часто используем для домашнего сервера всякие миниПК и устанавливаем туда Proxmox. Зачастую на этих миниПК есть wifi и дома мы используем Wifi сеть, а вот proxmox не любит wifi и практически с ним не работает. Работает только по ethernet.
Я описывал один способ по настройке wifi адаптера но для прокидывания его в одну виртуалку:
Тут опишу и покажу другой способ. Он тоже хитрый, костыльный -да, но позволит работать от одного wifi подключения все Виртуальные машины которые установлены в proxmox.
Будет это работать с помощью проброса портов (примерно так-же как Вы это делаете на роутере). То есть подключаясь на Ip адрес проксмокса и на определенный порт, попадаем на нужную нам виртуальную машину.
В чем основная суть решения:
– создаем новый мост/bridge в Proxmox с, по сути, произвольным IP-адресом на выбор. Я выбрал 10.10.10.1/24
– wifi модули в Proxmox сложно или невозможно стандартными способами использовать в мостах по аналогии с ethernet, поэтому используем iptables. iptables это модуль ядра, с помощью правил в котором мы роутим пакеты от и в наш сетевой wifi интерфейс.
См. конфигурацию /etc/network/interfaces
– к wifi подключаемся через wpa_supplicant так проще и надежнее
– через wifi не будет работать DCHP для тех LXC/VM которым в настройках добавим мост vmbr0. Поэтому нужно использовать отдельный DCHP, например dnsmasq. Он будет выдавать IP адреса всем LXC. Устанавливается на сервере Proxmox.
– отдельный аспект — это переадресация портов с и на IP выданные dnsmasq, поскольку получается NAT в котором vmbr0 выступает как бы роутером. Для того, что подключить к web-интерфейсу LXC в подсети dnsmasq нужно нужные порты пробросить до реального IP-адреса wi-fi устройства.
Для этого есть скрипт run-portforwarding.sh
Итоговая сетевая схема:
Роутер (192.168.1.1) <-> Proxmox (wifi, 192.168.1.111) <-> Proxmox + dnsmasq (vmbr0, 10.10.10.1) <-> Proxmox LXC (vmbr0, DCHP -> 10.10.10.*)
На роутере настроен фиксированный адрес для Proxmox, 192.168.1.111. На хосте Proxmox установлен dnsmasq.
Приступаем к настройке:
Ставим пакет для работы с wifi под названием wpasupplicant
apt install -y wpasupplicant
Определяем как называется у нас wi-fi интерфейс:
ip a
У меня интерфейс имеет имя -> wlp3s0
Идем редактировать файл /etc/network/interfaces
nano /etc/network/interfaces
Приводим к такому содержимому:
auto lo
iface lo inet loopback
### ethernet setup
#auto enp0s10
allow-hotplug enp0s10
iface enp0s10 inet manual
### wifi setup
auto wlp3s0
iface wlp3s0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
### default ethernet bridge setup
#auto vmbr0
#iface vmbr0 inet static
# address 192.168.1.112/24
# gateway 192.168.1.1
# bridge-ports enp0s10
# bridge-stp off
# bridge-fd 0
auto vmbr0
iface vmbr0 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up echo 1 > /proc/sys/net/ipv4/conf/vmbr0/proxy_arp
post-up iptables -t nat -A POSTROUTING -s '10.10.10.1/24' -o wlp3s0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.1/24' -o wlp3s0 -j MASQUERADE
source /etc/network/interfaces.d/*
В этом файле интерфейсы на свои нужно переименовать. а именно wlp3s0
который у меня. Так-же старый конфиг который был я заккоментил.
Далее Создаем и редактируем файл wpa_supplicant.conf
nano /etc/wpa_supplicant/wpa_supplicant.conf
Содержимое:
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="Keenetic"
psk="*******"
scan_ssid=1
}
Где в ssid – указываете SSID вашей WIFI сети, а в psk указываете пароль от неё.
После этого устанавливаем dnsmasq как внутренний DCHP на Proxmox
apt install dnsmasq dnsutils -y
Далее редактируем файл и добавляем в него содержимое в самый конец:
nano /etc/dnsmasq.conf
Содержимое:
domain=dnsmasq.local
interface=vmbr0
# Интервал выдаваемых адресов и время аренды адресов (в данном случае 12 часов).
dhcp-range=10.10.10.51,10.10.10.200,12h
# Задать значение опции DHCP с номером 1. Опция с номером 1 — это маска подсети (netmask).
dhcp-option=1,255.255.255.0
# Задать значение опции DHCP с номером 3. Опция с номером 3 — это шлюз по умолчанию (default gateway).
dhcp-option=vmbr0,3,10.10.10.1
# Read DHCP host information from the specified file. The format of a line is the same as text to the right of '=' in —dhcp-host.
dhcp-hostsfile=/etc/dnsmasq-hosts.conf
# DNS-серверы, на которые будут форвардиться запросы
server=10.10.10.1
server=1.1.1.1
server=8.8.8.8
# Файл аренды адресов
dhcp-leasefile=/var/log/dnsmasq/dnsmasq.leases
# Кеширование
cache-size=10000
all-servers
no-negcache
# Логирование
log-queries
log-facility=/var/log/dnsmasq/dnsmasq.log
После этого сохраняем файл и редактируем файл для хранения постов.
# Создаем файл для хранения хостов:
nano /etc/dnsmasq-hosts.conf
Содержимое, как пример для выдачи фиксированных адресов по MAC:
BC:24:11:DE:41:64,10.10.10.10 # OpenWRT
BC:24:11:50:BB:CC,10.10.10.11 # Alpine-Docker LXC
BC:24:11:3D:E1:6A,10.10.10.12 # Alpine-Base LXC
Как пример указаны 3 хоста, где указаны их маки и ip которые им присваивать. Меняем естественно на свои.
После этого создаем каталог для хранения лога:
mkdir /var/log/dnsmasq
Перезапускаем dnsmasq, чтобы применить изменения:
systemctl restart dnsmasq
Просмотреть лог можно командой (непрерывное чтение):
tail -f /var/log/dnsmasq/dnsmasq.log
# Проверить выданные IP адрес dnsmasq
cat /var/log/dnsmasq/dnsmasq.leases
По сути мы сейчас создали новый dhcp сервер, который будет раздавать внутри proxmox ip адреса свои из сети 10.10.10.0 , так-же настроили сетевые интерфейсы так, чтоб мост для виртуалок вел на интерфейс wifi.
Ну и получается, что после этих шагов у наших виртуалок есть выход в интернет, но они за NAT’ом находятся. И чтоб до этих виртуалок достучаться, нужно делать проброс портов. Иначе к сожалению ни как. По этому далее идут шаги по настройке проброса портов.
Переадресация портов:
Создаем файл скрипта run-portforwarding.sh
nano /root/run-portforwarding.sh
Содержимое:
#!/bin/bash
EXT_IP="192.168.1.111" # внешний, реальный IP-адрес шлюза;
INT_IP="10.10.10.1" # внутренний IP-адрес шлюза, в локальной сети;
EXT_IF=wlp3s0 # внешний и внутренний интерфейсы.
INT_IF=wlp3s0 # внутренний интерфейс шлюза, с адресом $INT_IP;
FAKE_PORT=$1 # как первый параметр, передаём скрипту "нестандартный" порт на внешнем интерфейсе,
LAN_IP=$2 # второй параметр, внутренний IP-адрес сервера, предоставляющего службы/сервисы внешнему миру;
SRV_PORT=$3 # порт службы/сервиса. Для веб-сервера равен 80, для SMTP - 25 и т.д.;
iptables -t nat -A PREROUTING -d $EXT_IP -p tcp -m tcp --dport $FAKE_PORT -j DNAT --to-destination $LAN_IP:$SRV_PORT
iptables -t nat -A POSTROUTING -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j SNAT --to-source $INT_IP
iptables -t nat -A OUTPUT -d $EXT_IP -p tcp -m tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IP
iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j ACCEPT
Даём права на запуск скрипта:
chmod +x /root/run-portforwarding.sh
# Запуск скрипта например для Home Assistant
/root/run-portforwarding.sh 8123 10.10.10.10 8123
Суть скрипта выше, пробросить 8123 порт Home Assistant с адресом (10.10.10.10) на порт 8123 реального IP адреса wi-fi устройства (192.168.1.111). На этом порту можно будет открыть luci.
Проверка через iptables
iptables -t nat -L
iptables -L
Ну и теперь у нас проброшен порт и когда мы введем 192.168.1.111:8123, то попадём в Home Assistant. Далее если например мы другой экземляр еще Home Assistant установили, то проброс портов будет вот такой:
/root/run-portforwarding.sh 8124 10.10.10.11 8123
Что означает, что введя 192.168.1.111:8124 мы попадём на адрес 10.10.10.11:8123 другой виртуалки.
Ну и так-же можно будет пробрасывать например ssh порты для других виртуалок и так далее.
Да к сожалению это все костыли и мы задолбаемся порты прокидывать. Но иначе никак. В Home Assitant надо много всего пробрасывать. Например еще порт mqtt.
Автозапуск скрипта проброса портов:
Так-же мы вручную запускали скрипт для проброса портов, а как сделать это автоматически, чтоб при запуске системы у нас все пробрасывалось.
Создаем новый сервис в systemd:
nano /etc/systemd/system/pve-home-assistant.service
Содержимое файла будет такое:
[Unit]
Description=Run Port Forwarding Script
[Service]
ExecStartPre=/bin/bash -c "sleep 30; /root/run-portforwarding.sh 23 10.10.10.145 22"
ExecStartPre=/bin/bash -c "sleep 30; /root/run-portforwarding.sh 24 10.10.10.146 22"
ExecStart=/bin/bash -c "sleep 30; /root/run-portforwarding.sh 8123 10.10.10.13 8123"
Restart=always
User=root
[Install]
WantedBy=multi-user.target
Для примера тут указан запуск скрипта 3 раза, для трёх виртуалок. В первых двух мы пробрасываем порт 23 и порт 24 на порт 22 виртуалок.
А в третьем для Home Assistant мы пробрасываем 8123 на порт 8123.
Так-же если у Вас будет 4тая виртуалка, то для неё запуск скрипта должен начинаться с ExecStartPre
и находиться выше чем последний запуск скрипта.
Так-же мы могли заметить, что тут стоит задержка sleep 30
на 30 секунд (можно меньше поставить), чтоб все успевало прогрузиться на сервере proxmox после запуска системы.
После этого сохраняем файл и добавляем его в автозагрузку:
systemctl enable pve-home-assistant.service
И запускаем его:
systemctl start pve-home-assistant.service
Настройка ESPHome для работы через NAT:
Так-же давайте покажу для примера как настроить ESPHome для такой работы.
В Home Assistant в ESPHome для начала в “Показать неиспользуемые дополнительные параметры конфигурации” включаем ” Use ping for status“.
И теперь когда создаём устройство в ESPHome, в конфигурации в блоке wifi указываем ip адрес вручную:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
use_address: 10.155.222.1