如何将无线连接移至其他网络命名空间?

如何将无线连接移至其他网络命名空间?
# 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

实施我自己的解决方法:维特菲

  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。这会增加延迟并导致额外开销。

相关内容