Назад | Перейти на главную страницу

Создание мостовой точки доступа WiFi в Centos 8 (или Fedora)

Я пытаюсь создать точку доступа Wi-Fi в системе Centos 8 с помощью NetworkManager. Это Dell EPC3000 с двумя встроенными беспроводными адаптерами GigE и ath10k, а также LTE WWAN.

Создание точки доступа с NAT работает отлично:

nmcli con add type wifi ifname wlp4s0 con-name wlp4s0 autoconnect yes ssid test
nmcli con modify wlp4s0 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
nmcli con modify wlp4s0ap wifi-sec.key-mgmt wpa-psk
nmcli con modify wlp4s0ap wifi-sec.psk "password"
nmcli con up wlp4s0ap 

Это назначает частный IP-адрес интерфейсу wlp4s0, вызывает dnsmasq для dhcp и создает правильную конфигурацию iptables для точки доступа.

Теперь моя идея состоит в том, чтобы покончить с NAT и связать интерфейс Wi-Fi со вторичным GigE, обслуживая клиентов Wi-Fi из этого сегмента с помощью его удаленного DHCP и других служб.

Создание моста и порабощение wlp4s0 и вторичного GigE работает нормально, в то время как AP остается включенным и отправляет маяк (с использованием nmcli на всем пути)

# bridge link
4: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
5: wlp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100

Когда соединение wlp4s0ap подчиняется br0, оно предсказуемо теряет свои настройки IPv4. Мост br0 работает, как будто я включаю на нем DHCP, он получает IPv4 / v6 из мостового сегмента GigE.

Теперь можно подумать, что конфигурация моста не повлияет (управляемый dbus) wpa_supplicant, который поддерживает точку доступа. Однако всякий раз, когда интерфейс wlp4s0 соединен мостом, wpa_supplicant последовательно останавливает аутентификацию WPA на полпути при завершении квитирования EAPOL:

hostapd_logger: STA 84:c7:ea:39:9b:28 - start authentication
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state INITIALIZE
wpa_driver_nl80211_set_key: ifindex=5 (wlp4s0) alg=0 addr=0x55d8a39e0bb0 key_idx=0 set_tx=1 seq_len=0 key_len=0
   addr=84:c7:ea:39:9b:28
nl80211: Set STA flags - ifname=wlp4s0 addr=84:c7:ea:39:9b:28 total_flags=0x66 flags_or=0x0 flags_and=0xfffffffe authorized=0
hostapd_logger: STA 84:c7:ea:39:9b:28 - unauthorizing port
WPA: 84:c7:ea:39:9b:28 WPA_PTK_GROUP entering state IDLE
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state AUTHENTICATION
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state AUTHENTICATION2
WPA: Assign ANonce - hexdump(len=32): 6c 11 09 50 95 fc 7d 80 80 a0 a9 a7 be eb 23 d3 ec 6e f4 ef 42 87 ca 45 5e 55 80 5b 54 c0 38 7e
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state INITPSK
Searching a PSK for 84:c7:ea:39:9b:28 prev_psk=(nil)
Searching a PSK for 84:c7:ea:39:9b:28 prev_psk=(nil)
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state PTKSTART
hostapd_logger: STA 84:c7:ea:39:9b:28 - sending 1/4 msg of 4-Way Handshake
WPA: Send EAPOL(version=2 secure=0 mic=0 ack=1 install=0 pairwise=1 kde_len=0 keyidx=0 encr=0)
WPA: Replay Counter - hexdump(len=8): 00 00 00 00 00 00 00 01
WPA: Use EAPOL-Key timeout of 100 ms (retry counter 1)
wlp4s0: hostapd_new_assoc_sta: reschedule ap_handle_timer timeout for 84:c7:ea:39:9b:28 (300 seconds - ap_max_inactivity)
wlp4s0: Event EAPOL_TX_STATUS (37) received
hostapd_logger: STA 84:c7:ea:39:9b:28 - EAPOL-Key timeout
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state PTKSTART
hostapd_logger: STA 84:c7:ea:39:9b:28 - sending 1/4 msg of 4-Way Handshake
WPA: Send EAPOL(version=2 secure=0 mic=0 ack=1 install=0 pairwise=1 kde_len=0 keyidx=0 encr=0)
WPA: Replay Counter - hexdump(len=8): 00 00 00 00 00 00 00 02
WPA: Use EAPOL-Key timeout of 1000 ms (retry counter 2)
wlp4s0: Event EAPOL_TX_STATUS (37) received
hostapd_logger: STA 84:c7:ea:39:9b:28 - EAPOL-Key timeout
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state PTKSTART
hostapd_logger: STA 84:c7:ea:39:9b:28 - sending 1/4 msg of 4-Way Handshake
WPA: Send EAPOL(version=2 secure=0 mic=0 ack=1 install=0 pairwise=1 kde_len=0 keyidx=0 encr=0)
WPA: Replay Counter - hexdump(len=8): 00 00 00 00 00 00 00 03
WPA: Use EAPOL-Key timeout of 1000 ms (retry counter 3)
wlp4s0: Event EAPOL_TX_STATUS (37) received
hostapd_logger: STA 84:c7:ea:39:9b:28 - EAPOL-Key timeout
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state PTKSTART
hostapd_logger: STA 84:c7:ea:39:9b:28 - sending 1/4 msg of 4-Way Handshake
WPA: Send EAPOL(version=2 secure=0 mic=0 ack=1 install=0 pairwise=1 kde_len=0 keyidx=0 encr=0)
WPA: Replay Counter - hexdump(len=8): 00 00 00 00 00 00 00 04
WPA: Use EAPOL-Key timeout of 1000 ms (retry counter 4)
wlp4s0: Event EAPOL_TX_STATUS (37) received
hostapd_logger: STA 84:c7:ea:39:9b:28 - EAPOL-Key timeout
WPA: 84:c7:ea:39:9b:28 WPA_PTK entering state PTKSTART
hostapd_logger: STA 84:c7:ea:39:9b:28 - PTKSTART: Retry limit 4 reached

Зная, что именно такой тип моста используется в большинстве точек доступа на базе Linux, мне интересно, что в Centos 8 делает иначе, чтобы сломать wpa_supplicant. Я также скомпилировал новейшую версию wpa_supplicant из w1.fi git, но она вела себя точно так же, отлично работала с NAT, но ломалась с мостом.

Я также поиграл с / sys / class / net / br0 / bridge / group_fwd_mask, чтобы убедиться, что пакеты управления Wi-Fi не сбрасываются, без эффекта.

Пробовал также общий (скомпилированный) пакет hostapd за пределами NetworkManager (используемый, например, точками доступа DD-WRT), но он также ломает WPA, когда я включаю мост.

Есть предложения, что попробовать дальше?

У меня мостовая точка доступа работает

  • компиляция и установка hostapd из исходников
  • неуправляемый интерфейс WiFi из NetworkManager (nmcli dev set managed no)
  • создание интерфейса моста с помощью NetworkManager и добавление 2-го Ethernet в качестве ведомого
  • отключение предоставленного системой wpa_supplicant
  • добавление "bridge = br0" в hostapd.conf, начиная с hostapd

Теперь я думаю, что это должно быть возможно с NetworkManager и стандартным wpa_supplicant, но это решение пока работает.

Я попробовал почти именно это и получил точно такой же результат. Единственная разница в том, что я использовал nmcli выполнять все операции вместо использования brctl. Однако вам следует убедиться, что точка доступа работает правильно, если вы используете незащищенную сеть Wi-Fi (без WPA).

Далее следует мое довольно определенное предчувствие после того, как я прочитал совсем немного, но я просто не мог отладить и проверить это.

Существует фундаментальная разница между созданием мостовой точки доступа и созданием моста Wifi-Ethernet (например, WDS). Первый может использовать 3-адресные кадры, а второй - 4-адресные. Я думаю, что происходит следующее: когда мы соединяем eth0 с участием wlan0, он использует "общий" мост (который также, похоже, пытается использовать прозрачный мост), что подразумевает 4-адресное кадрирование и т. д. Передача имени моста в wpa_supplicant или hostapd, похоже, устанавливает более настраиваемый мост трансляции Ethernet-Wi-Fi, который использует 3- обрамление адреса.

Ближайшая причина отказа этого метода заключается в том, что wpa_supplicant, не знающий о мосте, вызывает удаление сообщений EAPol точкой доступа (см. https://ubuntuforums.org/archive/index.php/t-1692292.html).

Я действительно надеюсь, что кто-то, кто более глубоко разбирается в мостах и ​​точках доступа, сможет присоединиться и воспользоваться этим здесь.

NetworkManager не может создавать точки доступа, являющиеся частью моста, см. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/83. Это не уникально для Centos. «способ, которым это делают большинство точек доступа на базе Linux» - использовать hostapd.