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
comXX
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).