O que significa “if1 @ if2” no nome da interface na saída do comando “ip address” no Ubuntu

1

O que significa sign (@) no nome da interface na saída do comando "ip address" (ou no comando "ip link") no Ubuntu, por exemplo, o nome da interface "eth0 @ if44" na seguinte saída:

root@aafa1fc24a0b:/# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

Informações relevantes adicionais:

  • Isso está no Ubuntu 16.04
  • Rodando dentro de um contêiner docker
  • O contêiner é anexado a uma ponte definida pelo usuário
  • A interface em questão (eth0 @ if44) não é uma VLAN

A configuração foi criada da seguinte forma:

docker network create my-bridge
docker run --name my-container-1 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity
docker run --name my-container-2 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity
    
por Bruno Rijsman 20.05.2018 / 08:29

1 resposta

4

Isso representa o índice da interface peer do link. Embora esta propriedade pareça estar disponível para qualquer interface, faz sentido apenas alguns tipos de interface: veth, macvlan, vlan (sub-interface), ... porque eles têm uma relação com uma outra interface.

Qualquer interface dada tem um índice que pode ser lido por exemplo:

/sys/class/net/<interface>/ifindex

Sua interface de link peer pode ser lida aqui:

/sys/class/net/<interface>/iflink

Aparentemente, se não fizer sentido, o parâmetro ainda existe, mas é o mesmo que ifindex . Esse seria o caso de interfaces normais ou simples usuais (hardware real eth0, wlan0, dummy0, ...)

Os comandos ip link apenas interpretam o valor iflink :

  • se iflink for 0 (aparentemente para túneis ipip, que também se comportam estranhamente com namespaces de rede), será impressa @NONE
  • se iflink não tiver correspondência ifindex , exibirá @ifXX com XX sendo ifindex . Não ter um ifindex correspondente é suficiente para saber que está relacionado a outro namespace de rede, veja mais adiante.
  • se iflink for ele mesmo ( iflink == ifindex ) Ele não exibirá @ . É o que deve acontecer com interfaces reais (eth0 ...), mas também pode ser um bug (veja adiante).
  • se iflink tiver um ifindex correspondente, ele exibirá o nome desse índice.

Quando não encontraria um ifindex correspondente? Quando essa interface está em um outro namespace de rede . Isso é conhecido por causa do link-netnsid anexado no final do resultado. Este valor não está facilmente disponível fora de ip link (veja este Q / A: ). Ele reprensenta o nsid atribuído localmente do namespace de rede de mesmo nível correspondente. Para um contêiner, o primeiro (e provavelmente único) valor de 0 quase sempre representará o namespace de rede do host. Para um host, provavelmente haverá um valor de link-netnsid por contêiner, com o link-netnsid do primeiro contêiner sendo 0. Observe que esse valor é local para o namespace de rede, não um id absoluto, portanto, não pode ser comparado diretamente entre dois namespaces da rede (consulte link anterior ).

Portanto, não encontrar um ifindex certamente significa que ele está em outro namespace. É confirmado pela presença de uma propriedade link-netnsid .

Às vezes, o iflink , que é o valor de índice da interface peer , quando em outro namespace de rede, tem o mesmo id que a interface local (em o namespace de rede atual). ip link não exibirá @ neste caso, com a lógica de que é uma interface comum, mas isso seria errado, como neste caso:

# ip -o link show dev veth1
3: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000\    link/ether 7e:d9:ca:77:87:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# cat /sys/class/net/veth1/{ifindex,iflink}
3
3

(observe a presença de link-netnsid 0 , o que significa que o link está em outro namespace de rede).

Em outros casos (que eu não consegui reproduzir, talvez tenha sido corrigido), ele pode até exibir um nome de interface local usando o outro índice de espaço de nomes de rede.

Por exemplo, se você executar no host (não no contêiner): ip -o link |grep ^44: . Você certamente encontrará uma interface com o índice 44, que é o veth link do par. (A menos que haja um namespace de rede invisível intermediário).

    
por 20.05.2018 / 10:25