ワイヤレス接続を他のネットワーク名前空間に移動するにはどうすればよいですか?

ワイヤレス接続を他のネットワーク名前空間に移動するにはどうすればよいですか?
# ip link set  wlan0 netns 1
RTNETLINK answers: Invalid argument

通常のイーサネットで動作します。また、独自の Broadcom "wl" ドライバーでも動作します。

通常の mac80211 ベースのドライバーの場合はどうすればよいでしょうか?

答え1

PHY を移動する必要があります:

iw phy phy0 set netns 666

ここで、666 は、そのネットワーク名前空間で実行されているプロセスの pid です。iproute2ツールによって作成されたネットスペース ( を使用ip netns) の場合は、そこに短命のプロセスを作成して、その pid を取得できます。

iw phy phy0 set netns "$(ip netns exec mynetns sh -c '
  sleep 1 >&- & echo "$!"')"

ルート名前空間に戻すには:

ip netns exec mynetns iw phy phy0 set netns 1

答え2

Wi-Fi の場合は、まずインターフェイスの物理アドレスを取得します (ワイヤレス カードが複数ある場合)。

iw dev

結果は次のようになります:

phy#0
        Interface wlp58s0
                ifindex 3
                wdev 0x1
                ...

名前はphy0

これを使用して、Wi-Fi を名前空間に割り当てます。

# iw phy phy0 set netns name <MyNamespace>

の助けによりiw

    phy <phyname> set netns { <pid> | name <nsname> }
            Put this wireless device into a different network namespace:
                <pid>    - change network namespace by process id
                <nsname> - change network namespace by name from /var/run/netns
                           or by absolute path (man ip-netns)

答え3

独自の回避策を実装しました:強欲にする

  1. 仮想インターフェースのペアを作成し、そのうちの 1 つ (たとえば、veth1) を他の名前空間に移動します。ip link add type veth; ip link set veth1 netns <some_pid>;
  2. wlan0 インターフェイスと veth0 を起動しますが、アドレスを追加しないでください。
  3. ホスト ネットワーク名前空間で開始しますvethify wlan0 veth0。wlan0 でキャプチャされたすべての内容を veth0 にコピーし、その逆も行います。
  4. veth1 上の他の名前空間で IP アドレスとルーティングを設定します。
  5. veth1 のチェックサムオフロードを無効にします: ethtool --offload veth1 rx off tx off && ethtool -K veth1 gso off

注意: vethify は、wlan0 と veth0 だけでなく、ネットワーク名前空間内のすべてのパケットを認識します。これにより、遅延が増加し、追加のオーバーヘッドが発生します。

関連情報