物理ネットワークインターフェイスをネームスペースに自動移動

物理ネットワークインターフェイスをネームスペースに自動移動

システムのすべての物理インターフェイスが「物理」という特定のネットワーク名前空間内にあることを望みます。ip link set enp2s0 netns physicalまた、同じコマンドを使用してデバイスを手動で移動するのは非常に簡単ですが、iw phy phy0 set netns name physical起動時に実行時に接続されているすべてのデバイスに対してこのタスクが自動的に実行されることを願っています。

これを達成するための最良の方法は、udevルールまたはいくつかのシステム魔法を使用するようです。

私の最初の考えは、適切なコマンドを実行するudevルールを作成することでしたが、検索では答えられないいくつかの質問に遭遇しました。

  1. 物理インターフェイスと仮想インターフェイスをどのように区別しますか?
  2. iwコマンドの代わりにコマンドを実行できるようにWLANインターフェイスをどのように区別できますか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/仮想ネットワークデバイスのリスト: include lo,tunnel,veth,bridge... したがって、電子ですが、これでない場合は物理デバイスである必要があります。

  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再マウントします。

関連情報