# 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
对于 wifi,首先获取你的接口的物理地址(如果你有多个无线网卡):
iw dev
结果将会是这样的:
phy#0
Interface wlp58s0
ifindex 3
wdev 0x1
...
所以名字是phy0
现在使用它将你的 wifi 分配给命名空间:
# 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
实施我自己的解决方法:维特菲
- 创建一对虚拟接口,将其中一个(例如 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。这会增加延迟并导致额外开销。