nível de rede de veth não responde a arp

3

Eu decidi jogar com veth: criar um par de veth e envie um ping de um lado para outro.

$ ip link add type veth
$ ip addr add 192.168.99.1 dev veth4
$ ip addr add 192.168.99.2 dev veth5
$ ip link dev veth4 set up
$ ip link dev veth5 set up

Vamos verificar.

$ ip a

18: veth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 6a:dc:02:5b:f0:f3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.1/24 scope global veth4
       valid_lft forever preferred_lft forever
19: veth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 22:ec:d5:e8:7c:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.2/24 scope global veth5
       valid_lft forever preferred_lft forever

Tudo parece estar bem. Agora tente pingar.

$ ping -I veth4 192.168.99.2
PING 192.168.99.2 (192.168.99.2) from 192.168.99.1 veth4: 56(84) bytes of data.
From 192.168.99.1 icmp_seq=1 Destination Host Unreachable
From 192.168.99.1 icmp_seq=2 Destination Host Unreachable
From 192.168.99.1 icmp_seq=3 Destination Host Unreachable


$ sudo tshark -i veth5
Capturing on 'veth5'
l  1   0.000000 6a:dc:02:5b:f0:f3 -> Broadcast    ARP 42 Who has 192.168.99.2?  Tell 192.168.99.1
1   2   1.003206 6a:dc:02:5b:f0:f3 -> Broadcast    ARP 42 Who has 192.168.99.2?  Tell 192.168.99.1

Então, veth5 recupera os pedidos de arp, mas não se preocupa em responder. Qual é o problema?

    
por nshy 28.03.2014 / 22:19

2 respostas

4

Esta é uma questão muito complexa, muito antiga, envolvendo várias áreas diferentes, especificamente VETH, Namespaces de Rede, ARP, tabelas de rotas e NAT ...

Estou adicionando a resposta a este problema não apenas para o OP, mas para outras pessoas, esperançosamente salvar alguém dos cabelos grisalhos que isso me deu ...

Basta dizer que, depois de muita pesquisa e teste, os pares de veth podem ser exatamente usados desta forma , já que são literalmente dois virtual > interfaces. No entanto, porque eles são virtuais - você encontrará alguns problemas realmente estranhos em relação a tabelas / entradas ARP. Depois de várias semanas lidando com esse cenário exato (necessário para o trabalho), descobri exatamente como fazer isso e, no processo, aprendi muito mais sobre ARP, NAT e roteamento do que eu queria.

Para realizar exatamente o que você deseja, digite o seguinte (no meu caso, Ubuntu 16.04). Por favor note que uma vez que você esteja no namespace test , você terá que sair do bash para sair, já que tudo (tabelas de rotas, iptables, etc) é diferente daquele da máquina host. Eu normalmente abro dois terminais, um que fica no host - o outro que fica no namespace do convidado.

Prefácio

# Tell the system we want to support IPv4 forwarding  
add/verify that the following is in '/etc/sysctl.conf'

'net.ipv4.ip_forward = 1'

# if it wasn't there, reparse syscrtl + restart networking
sysctl -p;
/etc/init.d/networking restart;

CONFIGURAÇÃO DO HOST

# create a veth pair
ip link add name vHOST type veth peer name vGUEST

# choose a private MAC address and private IP address
ifconfig vHOST hw ether 02:1d:8d:dd:0c:61
ifconfig vHOST 10.11.0.1/24 up

# have to setup routes   FROM HOST -> GUEST
ip route add 10.111.0.0/24 via 10.11.0.1 dev vHOST  # gateway

# have to explicitly assign what the MAC is for the vGUEST in the vHOST interface ARP table
arp -i vHOST -s 10.111.0.1 02:1d:8d:dd:0c:60 # vGUEST ip + mac address

# We must tell vHOST-vGUEST "tunnel", vHOST side that it's not a REAL bridge, so any ARP requests must be answered by vHOST
echo 1 > /proc/sys/net/ipv4/conf/vHOST/proxy_arp


# setup forwarding + NAT (so packets can come back)
iptables -A FORWARD -s 10.111.0.0/24 -o vHOST -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.111.0.1 -j SNAT --to 192.168.42.124

CONFIGURAÇÃO DE CONVIDADOS

# create the "test" namespace, so we can verfiy settings
ip netns add test

# add vGUEST "interface" to the "test" namespace
ip link set vGUEST netns test

# enter the "test" namespace with a bash shell
ip netns exec test bash

# choose a private MAC address and private IP address
ifconfig vGUEST hw ether 02:1d:8d:dd:0c:60
ifconfig vGUEST 10.111.0.1/24 up

# have to setup routes   FROM GUEST -> HOST
ip route add default via 10.111.0.1 dev vGUEST   # gateway

# have to explicitly assign what the MAC is for the vHOST in the vGUEST interface ARP table
arp -i vGUEST -s 10.11.0.1 02:1d:8d:dd:0c:61 # vHOST ip + mac address

agora, o GUEST / HOST pode fazer ping entre si e o vGUEST pode fazer ping fora da máquina

De nota especial, multimac também pode fazer exatamente a mesma coisa que veth, de uma maneira um pouco diferente, como o multimac suporta um relacionamento de muitos para um, onde veth é um relacionamento de um para um.

Para suportar isso em sem namespaces , você tem que usar o policy routing (que é um pouco mais complexo que namespaces de rede)

    
por 27.10.2016 / 14:23
3

Os pares de Veth não são usados dessa maneira. Um par de veth é literalmente um tubo de dispositivo, uma extremidade dos pacotes de tubos sai do outro lado.

O sinónimo mais simples que posso oferecer é imaginar que metade do par seja um dispositivo ethernet, enquanto a outra extremidade é uma porta de switch na qual o dispositivo está conectado. Você não deve tratar o par como sendo dois dispositivos separados, mas um dispositivo que tem duas 'extremidades' para empurrar / puxar.

    
por 28.03.2014 / 22:34