我有一個應用程序,它使用原始套接字來消耗來自多個 Linux(內核 4.14)介面(包括無線介面)的所有資料包。為了將無關的腳本保持在最低限度,我嘗試使用 hostapd 將無線和 bss 介面綁定到具有我的應用程式偵聽的介面的網橋。我還有一個用例,我需要我的應用程式從特定 VLAN 上的無線接收流量(有點像本機 VLAN 重新映射)。目前,我的設定如下所示:
- 建立虛擬介面供我的應用程式綁定
ip link add dummy0 type dummy
ip link set dummy0 up
- 根據需要,在dummy介面上建立vlan接口
ip link add link dummy0 name dummy0.100 type vlan id 100
ip link set dummy0.100 up
- 建立一個橋接器將虛擬設備連接到 wlan,根據需要連接虛擬設備 0 或 VLAN。應用程式仍然只監聽 dummy0
brctl addbr br0
brctl addif br0 dummy0.100
ip link set br0 up
- hostapd 將 wlan 或 bss 介面附加到 hostapd.conf 中定義的橋
當不涉及 VLAN 時,此方法效果很好。對於 vlan 接口,我只能使流量流向一個方向。 dummy0 上的 tcpdump 顯示了我所期望的所有流量。 dummy0.100 和 br0 上的 tcpdump 僅顯示來自無線介面的流量,但不顯示回傳流量。
我假設問題是我的應用程式正在將帶有 vlan 標記的原始幀寫入 dummy0 而不是 dummy0.100,但我認為問題也可能在於使用虛擬介面本身。有什麼方法可以讓我在 dummy0 上使用原始套接字,用 vlan 標籤寫入幀,並讓它們正確顯示在 dummy0.100 上?我也願意接受更好的解決方案,但這需要最少的設置和監控基礎設施。
答案1
正如 @dirkt 所指出的,RAW 套接字在綁定到根設備時可能無法將封包定向到 VLAN 子介面。 @dirkt 建議的一個合理的解決方案是使用 veth 對。
ip link add veth0-wifi type veth peer name veth0-app
ip link set veth0-wifi up
ip link set veth0-app up
ip link add link veth0-wifi name veth0-wifi.100 type vlan id 100
brctl addbr br0
brctl addif br0 veth0-wifi.100
ip link set br0 up
在hostapd.conf中設定bridge=br0並將應用程式綁定到veth0-app
@AB 建議的替代方案(由於技術原因尚未探索)是讓應用程式發布一個 Tap 設備,該設備應允許大部分相同的組織。