В данной статье я расскажу как настроить работу виртуальной сети KVM в режиме bridge при использовании Wi-Fi сетевой карты. Мы спланируем адресное пространство нашей сети и произведем необходимые настройки. Также я расскажу о том, почему сложно настроить режим bridge в KVM обычном понимании.
Оглавление
- Введение
- Установка ПО
- Планирование сети
- Создание сети в Virt Manager
- Настройка VM
- Настройка Proxy ARP
- Проверка работы
Введение
Недавно один из читателей блога в комментариях к моей статье про установку и настройку QEMU/KVM в Ubuntu задал вопрос, который показался мне интересным: «А возможно ли организовать Wi-Fi bridge на QEMU/KVM?». Для понимания того, почему этот вопрос вообще возник, давайте немного углубимся в различие в передаче данных Ethernet и WiFi.
Wi-Fi требует дополнительных MAC-адресов для связи: в дополнение к адресу источника (SA) и адресу назначения (DA), которые совпадают с MAC-адресами источника и назначения, в случае работы по Ethernet, Wi-Fi также требуется адрес передатчика (TA) и адрес получателя (RA). Всего в сумме получается 4 MAC-адреса.
Поскольку, в общем случае, когда клиент (STA) отправляет TA=SA, а когда точка доступа (AP) отправляет на клиента (STA) DA=RA, то обычно требуются только 3 адреса, и именно так настраивается AP: для использования только 3-х адресов из 4-х возможных.
Клиент-же в режиме моста означает, что (в указанном выше случае) TA!=SA или DA!=RA и, соответственно, необходимы все 4 адреса, в то время как AP настроена только для 3-х адресов. Вот почему в обычных конфигурациях невозможно подключить Wi-Fi в режиме моста. Для работы соединения в режиме моста необходимо включить 4-х адресный режим как на AP, так и на STA. Такой механизм обычно это называется беспроводной распределенной системой (WDS). И, ожидаемо, существует несколько несовместимых реализаций этого механизма. Следовательно необходимо, чтобы оборудование AP и все STA использовали совместимую реализацию.
Подводя итог, можно сказать, что это довольно непростой путь. Не у каждого окажется оборудование, которое сможет работать в этих режимах. Я же предлагаю пойти другим, более простым путем, используя подсеть меньшего размера и Proxy ARP.
Установка ПО
Итак, для упрощения задачи установим пакет virt-manager:
sudo apt install -y virt-manager
Далее нам необходимо выделить подсеть внутри вашей локальной сети меньшего размера для виртуальных машин. Для удобства расчета установим программу ipcalc
:
sudo apt install -y ipcalc
Планирование сети
После установки приступим к планированию сети. Если у вас есть DHCP сервер, то потребуется его настройка. Например, вы используете сеть 192.168.5.0/24
. Вам нужно выделить из нее часть адресов для подсети, которая будет обслуживать виртуальные машины, а часть оставить для устройств с фиксированными ip-адресами, а остальное адресное пространство отдать для устройств в вашей сети, которые получают адреса с dhcp сервера.
Предположим, что DCHP сервер у вас настроен на роутере с диапазоном выдачи адресов клиентам 192.168.5.16-192.168.5.201
, а первые 15 адресов отданы под статику. Запустив
ipcalc 192.168.5.16/28
мы видим следующее
Address: 192.168.5.16 11000000.10101000.00000101.0001 0000 Netmask: 255.255.255.240 = 28 11111111.11111111.11111111.1111 0000 Wildcard: 0.0.0.15 00000000.00000000.00000000.0000 1111 => Network: 192.168.5.16/28 11000000.10101000.00000101.0001 0000 HostMin: 192.168.5.17 11000000.10101000.00000101.0001 0001 HostMax: 192.168.5.30 11000000.10101000.00000101.0001 1110 Broadcast: 192.168.5.31 11000000.10101000.00000101.0001 1111 Hosts/Net: 14 Class C, Private Internet
Создание сети в Virt Manager
Для наших виртуальных машин мы можем использовать сеть 192.168.5.16/28
из 14 хостов. Для этого на роутере мы меняем диапазон выдаваемых DHCP сервером адресов на 192.168.5.32-192.168.5.201
и создаем новую сеть для виртуальных машин, используя GUI Virt Manager’а.
Настройка VM
В настройках сети необходимо выбрать режим маршрутизации и ваш физический интерфейс wi-fi. Далее нужно отключить виртуальную сеть по умолчанию (default) и подключить созданную bridged сеть к виртуальному сетевому интерфейсу нашей машины.
Настройка Proxy ARP
Последний штрих для создания нашего «моста» — это включить Proxy ARP для беспроводного интерфейса. Для этого идем в консоль и набираем следующее:
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/conf/wlo1/proxy_arp'
Внимание! В строке выше wlo1
вам необходимо заменить на название вашего беспроводного интерфейса.
Проверка работы
Проверяем, что все работает в запущенной виртуальной машине:
Мучался с этой проблемой несколько лет. Пробовал настроить, но потом забил. А сейчас все получилось! Спасибо вам большое!
Ипсользую ваше обьяснение для интеграции Home Assistant на KVM.
Все вышло прекрасно за вычетом настройки фаервола. Она оказалась действующей на сессиюю и после перезагрузки доступ к IP гостей прекращается. Возможно я пока не уловил смысл точно, но повторный запуск bash помог.
sudo bash -c ‘echo 1 > /proc/sys/net/ipv4/conf/wlo1/proxy_arp’
Можете подсказать, как пременить это перманентно?