물리적 네트워크 인터페이스를 네임스페이스로 자동 이동

물리적 네트워크 인터페이스를 네임스페이스로 자동 이동

시스템의 모든 물리적 인터페이스가 "물리적"이라는 특정 네트워크 네임스페이스 내에 있기를 원합니다. 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다시 마운트합니다.

관련 정보