使用網橋使 hostapd 與 systemd-networkd 一起工作
我正在設置的路由器上有兩個乙太網埠和一個無線埠。我正在使用系統網路。我首先重命名埠,然後創建一個網橋,然後橋接其中一個乙太網埠和無線板,以在具有單個 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網橋……有點像catch22。
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/
,您需要以下文件:
- 一個
.netdev
用於您的橋接設備- 一個
.network
用於您的橋接設備- 一個或多個
.network
用於您的乙太網設備(LAN 和 WAN)- 一個
.network
用於您的 wifi 設備- 可選地,
.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
:
- 在該
[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.
和一個快樂的系統管理員!:)
仍然可能發生將
networkctl
wlp5s0 報告為失敗並systemd-networkd
記錄的情況:wlp5s0:無法加入 netdev:設備不允許奴役到網橋。操作不支持 wlp5s0:失敗
但這似乎不會導致網路故障,並且 a
systemctl restart systemd-networkd.service
再次變為networkctl
綠色。我懷疑這是與我使用配置 hostapd 的方式的互動bridge=br0
。也許應該刪除該行。