自动将物理网络接口移至命名空间

自动将物理网络接口移至命名空间

我希望系统上的所有物理接口都位于称为“物理”的特定网络命名空间内。使用ip link set enp2s0 netns physical和之类的命令手动移动设备非常容易iw phy phy0 set netns name physical,但我希望这种情况在启动时以及运行时连接的任何设备都能自动发生。

似乎实现这一点的最佳方法是通过 udev 规则,或者可能是一些 systemd 魔法。

我的第一个想法是编写一个运行适当命令的 udev 规则,但我遇到了几个无法通过搜索回答的问题:

  1. 如何区分物理接口和虚拟接口?
  2. 如何区分 WLAN 接口,以便我可以发出命令iw而不是ip命令?
  3. 如何获取 WLAN phy 的名称以便将其传递给命令iw

我希望上面的内容相对简单,但我没有看到任何明显的区别因素udevadm info

答案1

根据AB的回答,我想出了以下规则:

SUBSYSTEM=="net", ACTION=="add", DEVPATH!="/devices/virtual/*", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"

DEVPATH!="/devices/virtual/*是只抓取物理设备的关键。[email protected]是一个一次性服务,它将接口移动到所需的命名空间 ( physical):

[Unit]
Description=Move interface to physical namespace
[email protected]
[email protected]

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/move-netif %I physical

[email protected]只是创建给定名称的网络命名空间。)

最后,move-netif负责弄清楚如何移动界面:

#!/bin/bash

devpath="$1"
target_ns="$2"

if [[ -e "$devpath/phy80211" ]]; then
  phy="$(basename "$(readlink "$devpath/phy80211")")"
  iw phy "$phy" set netns name "$target_ns"
else
  ifname="$(basename "$devpath")"
  ip link set "$ifname" netns "$target_ns"
fi

答案2

大多数这些信息可以从以下位置检索/sys

1a. /sys/class/net/:网络设备列表,包括所有类型

1b. /sys/devices/virtual/net/:虚拟网络设备列表:包括lo,隧道,veth,网桥...所以如果它是前者但不是这个,它应该是物理的。

  1. 如果设备是现代无线设备(驱动程序),它将具有条目/sys/class/net/<device>/phy82011/name,例如:

    $ grep -s --with-filename ''  /sys/class/net/*/phy80211/name
    /sys/class/net/wlan0/phy80211/name:phy0
    /sys/class/net/wlan1/phy80211/name:phy1
    /sys/class/net/wlan2/phy80211/name:phy2
    

因此,通过从环境中运行适当的脚本udev并与来自 的那些目录和文件进行比较/sys,您应该拥有执行此操作所需的所有信息。

顺便说一句,如果以后要在这些设备上工作,您只需更改网络命名空间(例如使用nsenter --net=/var/run/netns/physical),/sys仍然会在主机的名称空间,并且不会反映这些设备的到达,而是显示它们丢失。使用ip netns exec physical command很好,它确实会更改挂载命名空间并/sys为您重新挂载。

相关内容