Mover automaticamente as interfaces de rede física para o namespace

1

Gostaria que todas as interfaces físicas do meu sistema vivessem em um namespace de rede específico chamado "físico". É bastante fácil mover dispositivos manualmente usando comandos como ip link set enp2s0 netns physical e iw phy phy0 set netns name physical , mas eu gostaria que isso acontecesse automaticamente tanto na inicialização quanto em qualquer dispositivo conectado em tempo de execução.

Parece que a melhor maneira de conseguir isso seria através das regras do udev, ou possivelmente alguma magia do systemd.

Meu primeiro pensamento foi apenas escrever uma regra do udev que execute o comando apropriado, mas me deparei com algumas perguntas que não consegui responder por meio de minhas pesquisas:

  1. Como faço para distinguir interfaces físicas de interfaces virtuais?
  2. Como distingui as interfaces WLAN para poder emitir o comando iw em vez do comando ip ?
  3. Como obtenho o nome de uma WLAN phy para poder transmiti-la ao comando iw ?

Eu esperava que o acima fosse relativamente simples, mas não vejo nenhum fator de distinção óbvio em udevadm info .

    
por rkjnsn 02.08.2018 / 10:48

2 respostas

2

A maioria dessas informações é recuperável de /sys :

1a. /sys/class/net/ : lista de dispositivos de rede, todos os tipos incluídos

1b. /sys/devices/virtual/net/ : lista de dispositivos de rede virtual: inclui lo , túneis, veth, pontes ... portanto, se estiver no primeiro, mas não nesse, deve ser físico.

  1. se um dispositivo for um dispositivo sem fio moderno (driver), ele terá a entrada /sys/class/net/<device>/phy82011/name , por exemplo:

    $ 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
    

Portanto, executando o script adequado em udev environment e comparando com os diretórios e arquivos de /sys , você deve ter todas as informações necessárias para fazê-lo.

Assim como uma nota secundária, se mais tarde, para trabalhar nesses dispositivos, você altera apenas o namespace rede ( por exemplo usando nsenter --net=/var/run/netns/physical ), /sys ainda estará no namespace mount do host, e não refletirá a chegada desses dispositivos, mas mostrará a falta deles. Usando ip netns exec physical command é bom, ele altera o namespace de montagem e remonta /sys para você.

    
por 02.08.2018 / 23:12
2

Com base na resposta de A.B, criei a seguinte regra:

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

DEVPATH!="/devices/virtual/* é a chave para apenas pegar dispositivos físicos. [email protected] é um serviço que move a interface para o namespace desejado ( 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] apenas cria um namespace de rede do nome fornecido.)

Por fim, move-netif é responsável por descobrir como mover a interface:

#!/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
    
por 05.08.2018 / 08:43