Я пытаюсь создать несколько интерфейсов Linux TAP и разрешить им отправлять/получать пакеты через один адаптер WIFI. Для всех намерений и целей я хотел бы, чтобы интерфейсы TAP действовали как полноценные сетевые адаптеры. Они должны иметь возможность запрашивать собственные адреса DHCP и взаимодействовать в локальной сети, как любой другой сетевой адаптер.
Мне удалось заставить это работать с адаптером Ethernet, но я слышал, что WiFi — это совсем другой зверь. Я не могу вспомнить точную причину, но это было как-то связано с «1 IP-адресом на адрес радиовещания».
Возможно ли, используя интерфейсы TAP, по сути, сделать мостовую сеть через соединение WiFi? Могу ли я выполнить какую-либо настройку с помощью networkmanager? Может кто-нибудь дать ссылку на статью или две? Мне сложно найти что-либо по этому поводу.
решение1
Эта ссылка Network Engineering SEЧетыре адреса уровня 2 в заголовке кадра 802.11достаточно хорошо объясняет разницу между Ethernet и Wi-Fi.
Wifi требует дополнительных MAC-адресов для связи: в дополнение к адресу отправителя (SA) и адресу назначения (DA), которые совпадают с MAC-адресами источника и назначения Ethernet, Wifi для работы нужны адрес передатчика (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 должны использовать совместимую реализацию.
Так:
Если системный мост — это точка доступа, то вы можете организовать мост Wi-Fi без проблем: именно это делают все точки доступа, используя режим 3 адресов по умолчанию.
Если система, пытающаяся создать мост, является простым клиентом (STA), это не сработает. Последние драйверы даже не позволят установить беспроводной интерфейс в качестве порта моста с такой ошибкой:
# ip link set wlan0 master bridge0 Error: Device does not allow enslaving to a bridge.
если вы можете настроитьобаAP и STA в совместимый WDS, например, если все они работают под управлением Linux с драйверами, совместимыми с mac80211, это можно включить на STA с помощью:
# iw dev wlan0 set 4addr on
Тогда его можно поработить:
# ip link set wlan0 master bridge0
# ip link show wlan0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue master bridge0 state DOWN mode DEFAULT group default qlen 1000
[...]
Некоторую документацию о режиме 4 адресов с командой iw можно найти на вики-сайте по беспроводным сетям Linux:Использование 4-адресного режима для точки доступа и клиента
Настройка точки доступа здесь не рассматривается. При использованииhostapd, есть специальная настройка для включения:
# WDS (4-address frame) mode with per-station virtual interfaces # (only supported with driver=nl80211) # This mode allows associated stations to use 4-address frames to allow layer 2 # bridging to be used. #wds_sta=1
Все еще существует обходной путь, позволяющий использовать несколько контейнеров или виртуальных машин одновременно с отдельными IP-адресами через одно соединение Wi-Fi по умолчанию (режим с 3 адресами), но с использованием толькоодинMAC-адрес (тот, который используется как STA): это такобычно несовместим с DHCPкоторый по умолчанию полагается на MAC-адрес (если DHCP-сервер не принимаетидентификатор-клиента-dhcpвариант). Это называетсяIPVLAN(обычно для контейнеров) и его аналог TAP (обычно для виртуальных машин) называетсяИПВТАППри использовании в режиме L2 он выглядит как стандартный интерфейс Ethernet.
Для (простого)ip netnsсетевой) контейнер, который можно использовать следующим образом после того, как вы уже установили Wi-Fi-соединение в IP-сети LAN 192.0.2.0/24 со шлюзом 192.0.2.1 на хосте с использованием интерфейсаwlan0:
# ip netns add testwifi
# ip link add link wlan0 name ipvl0 type ipvlan mode l2
# ip link set dev ipvl0 netns testwifi up
# ip -n testwifi address add 192.0.2.99/24 dev ipvl0
# ip -n testwifi route add default via 192.0.2.1
# ip netns exec testwifi ping -q -c1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.372/5.372/5.372/0.000 ms
Я серьезно сомневаюсь, что у NetworkManager есть какая-либо опция, связанная с режимом 4 адресов. Что касаетсяIPVLAN/IPVTAPэто должно поддерживаться приложением контейнера/виртуализации, напримерLXCили libvirt (который, судя по всему, изначально не поддерживает IPVTAP), на самом деле не NetworkManager.