Systemd

使用網橋使 hostapd 與 systemd-networkd 一起工作

  • March 17, 2022

我正在設置的路由器上有兩個乙太網埠和一個無線埠。我正在使用系統網路。我首先重命名埠,然後創建一個網橋,然後橋接其中一個乙太網埠和無線板,以在具有單個 IP 和 DHCP/DNSMASQ 的組合區域網路埠上創建。另一個乙太網是 wan 埠。在這裡,您可以看到 networkctl 輸出。lan 是橋。您會看到 wlan 與 lan2 具有相同的狀態(它是 NIC,並且工作正常)。所以網橋和所有路由都很好。

IDX LINK             TYPE               OPERATIONAL SETUP     
 1 lo               loopback           carrier     unmanaged 
 2 wan              ether              routable    configured
 3 lan2             ether              carrier     configuring
 4 wlan             wlan               carrier     configuring
 5 lan              ether              routable    configured

所以……我很接近。它只是讓 hostapd 在正確的時間使用 systemd-networkd 啟動。AP 出現,但看起來無線介面沒有綁定到網橋。客戶端可以輸入 WPA 密碼並被接受,但它永遠不會連接。日誌沒有幫助我辨識問題,但我很確定無線埠沒有固定到網橋上。這可以解釋為什麼 AP 功能看起來不錯,但實際上並沒有給出 IP 地址的實際連接。

有一些經驗的人有一些提示嗎?如您所見,我編寫的 hostapd.service 嘗試延遲啟動 hostapd 直到 networkd 完成,特別是直到創建網橋為止。也許這與hostapd延遲networkd有關,但networkd在hostapd開始之前將wlan添加到lan網橋……有點像c​​atch22。

hostapd.conf

interface=wlan
# the interface used by the AP
hw_mode=g
# g simply means 2.4GHz band
channel=10
# the channel to use
#ieee80211d=1          
# limit the frequencies used to those allowed in the country
#country_code=US       
# the country code
ieee80211n=1
# 802.11n support
#wmm_enabled=1
# QoS support
#ignore_broadcast_ssid=0
ssid=645-gateway
# the name of the AP
auth_algs=1
# 1=wpa, 2=wep, 3=both
wpa=2
# WPA2 only
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=elf645Keb1920

主機服務

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Wants=network-online.target
After=systemd-networkd.service
After=sys-subsystem-net-devices-wlan.device
After=sys-subsystem-net-devices-lan.device
BindsTo=sys-subsystem-net-devices-lan.device

[Service]
Type=forking
PIDFile=/run/hostapd.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B

[Install]
WantedBy=multi-user.target

30-br-wlan-lan.network

[Match]
Name=wlan
[Network]
Bridge=lan

你很親密,我也處於同樣的境地。經過多年的折騰,我終於找到了正確的配置。

系統網路配置

對於 中的 systemd-networkd 配置/etc/systemd/network/,您需要以下文件:

  1. 一個.netdev用於您的橋接設備
  2. 一個.network用於您的橋接設備
  3. 一個或多個.network用於您的乙太網設備(LAN 和 WAN)
  4. 一個.network用於您的 wifi 設備
  5. 可選地,.network如果您在同一設備上執行多個 SSID,則更多用於附加 wifi SSID。

橋接裝置

這是我的橋接設備配置,這裡沒什麼特別的。然而,我花了數年時間才發現我失去了該.netdev文件,因為即使networkctl報告br0為失敗,網路也能正常執行。

cat /etc/systemd/network/10-bridge.netdev
[NetDev]
Name=br0
Kind=bridge
cat /etc/systemd/network/20-bridge.network 
[Match]
Name=br0

[Network]
Description=...
Address=...
Address=...

添加到網橋的乙太網和 wifi 設備

顯然,每個參與的設備都br0必須聲明。Bridge=br0

cat /etc/systemd/network/21-enp2s0_bridged.network
[Match]
Name=enp2s0

[Link]
RequiredForOnline=no

[Network]
Description=Add enp2s0 to the bridge
Bridge=br0
cat /etc/systemd/network/21-wlp5s0_bridged.network
[Match]
Name=wlp5s0

[Link]
RequiredForOnline=no

[Network]
Description=Add wlp5s0 to the bridge
Bridge=br0

hostapd 服務單元

為了在正確的時間啟動 hostapd,它需要具有以下依賴項hostapd.service

  1. 在該[Unit]部分
After=network.target
BindsTo=sys-subsystem-net-devices-%i.device

替換%i為您的 wifi 設備的名稱 2. 在該[Install]部分

WantedBy=multi-user.target
WantedBy=sys-subsystem-net-devices-%i.device

再次替換%i為您的 wifi 設備的名稱。

不需要其他依賴項。特別是,Wants=network-online.target不應在這種情況下使用,因為您希望 hostapd在網路變為聯機*之前啟動。*請參閱 和定義network.target``network-online.target

Debian 系統上有一個很好的範例單元文件,/lib/systemd/system/hostapd@.service上面的配置是從中複製的。如果您在同一 hostapd 實例上僅配置一個 SSID 或多個 SSID,則不需要單元模板,但您確實需要BindsTo設備一起使用(在 Debian 上,隨附的非模板/lib/systemd/system/hostapd.service缺少它)。sys-subsystem-net-devices-%i.device另請注意,只有在沒有多個 SSID 時,“主要”wifi 介面才需要依賴。

結果

# networkctl
IDX LINK         TYPE      OPERATIONAL SETUP
 1 lo           loopback  carrier     unmanaged
 2 enp1s0       ether     routable    configured
 3 enp2s0       ether     enslaved    configured
 4 enp3s0       ether     no-carrier  configuring
 5 enp4s0       ether     off         unmanaged
 6 br0          bridge    routable    configured
 7 wg0          wireguard routable    configured
 8 sit0         sit       off         unmanaged
 9 he-ipv6      sit       routable    configured
10 wlp5s0       wlan      enslaved    configured
11 wlan-iot     wlan      routable    configured
12 wlan-guest   wlan      routable    configured

12 links listed.

和一個快樂的系統管理員!:)

仍然可能發生將networkctlwlp5s0 報告為失敗並systemd-networkd記錄的情況:

wlp5s0:無法加入 netdev:設備不允許奴役到網橋。操作不支持 wlp5s0:失敗

但這似乎不會導致網路故障,並且 asystemctl restart systemd-networkd.service再次變為networkctl綠色。我懷疑這是與我使用配置 hostapd 的方式的互動bridge=br0。也許應該刪除該行。

引用自:https://unix.stackexchange.com/questions/401533