
# 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 つ (たとえば、veth1) を他の名前空間に移動します。
ip link add type veth
;ip link set veth1 netns <some_pid>
; - wlan0 インターフェイスと veth0 を起動しますが、アドレスを追加しないでください。
- ホスト ネットワーク名前空間で開始します
vethify wlan0 veth0
。wlan0 でキャプチャされたすべての内容を veth0 にコピーし、その逆も行います。 - veth1 上の他の名前空間で IP アドレスとルーティングを設定します。
- veth1 のチェックサムオフロードを無効にします:
ethtool --offload veth1 rx off tx off && ethtool -K veth1 gso off
。
注意: vethify は、wlan0 と veth0 だけでなく、ネットワーク名前空間内のすべてのパケットを認識します。これにより、遅延が増加し、追加のオーバーヘッドが発生します。