Como combinar os dois lados de um link ethernet virtual?

1

Eu corro docker containers que estão todos conectados a uma ponte própria (não o padrão docker0 one). Isto é o que parece a partir da perspectiva do host (deixei apenas informações relevantes para a ponte virtual e ethernet):

root@srv ~# ip link
(...)    
8: br-7b20560b3603: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether 02:42:7c:70:e1:47 brd ff:ff:ff:ff:ff:ff
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:f1:70:4f:a6 brd ff:ff:ff:ff:ff:ff
11: veth1fb5957@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-7b20560b3603 state UP mode DEFAULT group default
    link/ether 4e:38:69:b2:db:ef brd ff:ff:ff:ff:ff:ff link-netnsid 2
13: vethc225476@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-7b20560b3603 state UP mode DEFAULT group default
    link/ether 56:1d:d5:96:68:ac brd ff:ff:ff:ff:ff:ff link-netnsid 1
377: veth7fcee93@if376: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-7b20560b3603 state UP mode DEFAULT group default
    link/ether 62:06:5d:c7:31:7b brd ff:ff:ff:ff:ff:ff link-netnsid 4
431: vethd0879bb@if430: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-7b20560b3603 state UP mode DEFAULT group default
    link/ether 0a:f8:aa:02:a9:f4 brd ff:ff:ff:ff:ff:ff link-netnsid 3
245: veth4a8ecb1@if244: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-7b20560b3603 state UP mode DEFAULT group default
    link/ether d6:86:f1:8b:73:ab brd ff:ff:ff:ff:ff:ff link-netnsid 0

Ao se conectar a um dos contêineres, vejo

root@vpnin ~# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether 02:42:0a:c8:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0

A topologia é tal que, no host, br-7b20560b3603 tem vários veth* como filhos, e cada um deles está conectado a um contêiner - esse outro lado se torna o eth0 do contêiner.

Como posso saber qual veth* no host corresponde ao eth0@<something> no contêiner?

Posso ver que a primeira coluna no host tem 13 , que é semelhante ao eth0@if13 no contêiner. De forma recíproca, eth0@if13 corresponde ao rótulo 12 no contêiner, que é referenciado como vethc225476@if12 no host. Não sei se isso é uma coincidência - se não, para que correspondem os primeiros rótulos de coluna em ip link ?

    
por WoJ 05.12.2016 / 12:43

1 resposta

1

Como você suspeita, o @if13 se refere ao número na primeira coluna, que é o ifindex number (pelo menos, "ifindex" é o nome da variável exposta pelo libnl, usado para falar netlink para o kernel para obter este tipo de informação). Quando o número existe no mesmo namespace, o utilitário ip mostra o nome associado ao número em vez do número (por exemplo, myvlan@eth0 ).

Você também pode ver o campo 'link-netnsid', que é outro inteiro, este identificando o namespace que contém o link (ou o outro extremo de um par veth, como você tem aqui, ou manipulando a outra extremidade do dispositivo, como o namespace cujo endereço IP é usado para um dispositivo de encapsulamento). Você pode listar aqueles com ip netns list-id (pelo menos nas versões recentes do iproute2). Se o namespace estiver montado no lugar normal, ele mostrará o nome do namespace da rede ao lado do ID.

exemplos:

$ sudo ip link add name veth1 type veth peer name veth2
$ ip link show | grep veth
32: veth2@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
33: veth1@veth2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group

$ sudo ip netns add examplens
$ sudo ip link setns examplens dev veth2
$ ip link show | grep -a1 veth
33: veth1@if32: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default
link/ether e2:99:ce:05:64:a4 brd ff:ff:ff:ff:ff:ff link-netnsid 2

$ ip netns list-id
nsid 0 
nsid 1 
nsid 2 (iproute2 netns name: examplens)

$ sudo ip -n examplens link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
32: veth2@if33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 3a:89:30:01:4a:49 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Acima, criamos um par de veth e podemos ver os dois fins mostrando o nome do outro lado. Em seguida, criamos um netns chamado examplens e movemos veth2 para ele. Agora ip não sabe mais o nome do peer de veth1, mas ainda tem o ifnumber, então ele mostra que (if32), o que podemos ver é o que era antes de ser movido. Nós também vemos que o link está em netnsid (nsid) 2, que vemos como exemplos.

Listar os links dentro de examplens mostra veth2, com o peer tendo ifnumber 33 no netnsid 0.

Infelizmente, o utilitário ip não ajuda a encontrar onde o nsid está quando não está vinculado e a entrar em /var/run/netns (que é onde a ligação ip utility monta seus netns criados para dar um nome a eles) . Muitos (a maioria - todos?) Outros utilitários não parecem fazer isso, incluindo o docker, então não há muita ajuda em encontrar o outro lado do host, fazendo com que os usuários façam uma busca manual por outros namespaces de rede (por exemplo todas as entradas únicas em / proc / * / ns / net).

Em suma, isso ajuda a encontrar o link no host quando você conhece a lista de links do contêiner, mas não encontra muito o contêiner quando você tem a lista de links do host.

Uma última nota sobre o nsid s: eles são únicos por netns. nsid 0 do host não é o mesmo namespace que nsid 0 no namespace do exemplo no meu exemplo, por exemplo.

    
por 10.03.2018 / 05:52