Linux仮想インターフェイスでVLANを使用する

Linux仮想インターフェイスでVLANを使用する

ネイティブソケットを使用して、ワイヤレスインターフェイスを含む複数のLinux(カーネル4.14)インターフェイスのすべてのパケットを消費するアプリケーションがあります。関係のないスクリプトを最小限に抑えるために、私はHostapdを使用して、アプリケーションが受信するインターフェイスを持つブリッジにワイヤレスインターフェイスとBSSインターフェイスをバインドしてみました。また、特定のVLANからの無線トラフィックを受信するためにアプリケーションが必要なユースケースもあります(ネイティブVLANの再マッピングに似ています)。現在私の設定は次のとおりです。

  • アプリケーションがバインドする仮想インターフェイスを作成します。
ip link add dummy0 type dummy
ip link set dummy0 up 
  • 必要に応じてダミーインターフェイスに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 インターフェイスの場合、トラフィック フローは 1 方向にのみ作成できます。 dummy0のtcpdumpは、私が期待しているすべてのトラフィックを表示します。 dummy0.100 および br0 の tcpdump は、無線インターフェイスからのトラフィックのみを表示し、戻りトラフィックは表示しません。

問題は、私のアプリケーションがvlanタグ付きのrawフレームをdummy0.100の代わりにdummy0に書き込むと仮定していますが、問題は仮想インターフェイス自体を使用することにもあると思います。 dummy0でrawソケットを使用して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によって提案された代替案(技術的な理由で探索されていない)は、アプリケーションがほとんどの同じ組織を許可するタブデバイスを公開することです。

おすすめ記事