Como configurar uma rede virtual `veth`

26

Eu gostaria de configurar três interfaces de rede virtual ( veth) que podem se comunicar. Para simular um cluster de três nós, cada programa se liga a uma vethinterface. Eu gostaria de fazer isso sem o LXC, se possível.

Eu tentei usar:

  • Criou três vethpares:sudo ip link add type veth
  • Criou uma ponte sudo brctl addbr br0
  • Adicionado um de cada par na ponte:
    • sudo brctl addif br0 veth1
    • sudo brctl addif br0 veth3
    • sudo brctl addif br0 veth5
  • Configurou as interfaces:
    • sudo ifconfig veth0 10.0.0.201 netmask 255.255.255.0 up
    • sudo ifconfig veth2 10.0.0.202 netmask 255.255.255.0 up
    • sudo ifconfig veth4 10.0.0.203 netmask 255.255.255.0 up

Então eu verifiquei se funciona usando: ping -I veth0 10.0.0.202mas não :(

O acrescentei endereços IP para o veth1, veth3, veth5e br0as interfaces na faixa 10.0.1.x / 24. Mas isso não ajuda.

Alguma ideia? ou um guia, tudo o que encontro em como usá-lo com o LXC. Ou estou tentando algo que não é possível?

Reinder
fonte
É br0ele mesmo?
grawity
Sim, acabou. Configurou-o como o veth's
Reinder

Respostas:

31

Para que o veth funcione, uma extremidade do túnel deve ser conectada a outra interface. Como você deseja manter tudo isso virtual, você pode conectar a extremidade vm1 do túnel (vm2 é a outra extremidade do túnel) com uma interface virtual do tipo torneira, em uma ponte chamada brm. Agora você fornece endereços IP para brm e vm2 (10.0.0.1 e 10.0.0.2, respectivamente), habilite o encaminhamento IPv4 por meio de

echo 1 > /proc/sys/net/ipv4/ip_forward

traga todas as interfaces e adicione uma rota instruindo o kernel como alcançar os endereços IP 10.0.0.0/24. Isso é tudo.

Se você deseja criar mais pares, repita as etapas abaixo com sub-redes diferentes, por exemplo 10.0.1.0/24, 10.0.2.0/24 e assim por diante. Como você ativou o encaminhamento IPv4 e adicionou rotas apropriadas à tabela de roteamento do kernel, eles poderão se comunicar imediatamente.

Além disso, lembre-se de que a maioria dos comandos que você está usando (brctl, ifconfig, ...) são obsoletos: a suíte iproute2 possui comandos para fazer tudo isso, veja abaixo meu uso do comando ip .

Esta é uma sequência correta de comandos para o uso de interfaces do tipo veth :

primeiro crie todas as interfaces necessárias,

ip link add dev vm1 type veth peer name vm2
ip link set dev vm1 up
ip tuntap add tapm mode tap
ip link set dev tapm up
ip link add brm type bridge

Observe que não trouxemos brm e vm2 porque precisamos atribuir endereços IP a eles, mas trouxemos tapm e vm1, que é necessário incluí-los no bridge brm. Agora escravize as interfaces tapm e vm1 na bridge brm,

ip link set tapm master brm
ip link set vm1 master brm

agora forneça endereços para a ponte e para a interface veth restante vm2,

ip addr add 10.0.0.1/24 dev brm
ip addr add 10.0.0.2/24 dev vm2

agora traga vm2 e brm up,

ip link set brm up
ip link set vm2 up

Não há necessidade de adicionar a rota à sub-rede 10.0.0.0/24 explicitamente, ela é gerada automaticamente. Você pode verificar com o ip route show . Isto resulta em

ping -c1 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.035 m

--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.035/0.035/0.035/0.000 ms

Você também pode fazer isso ao contrário, ou seja , do vm2 para o brm:

ping -I 10.0.0.2 -c1 10.0.0.1
PING 10.0.0.1 (10.0.0.1) from 10.0.0.2 : 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms

A aplicação mais útil de NICs do tipo veth é um namespace de rede , que é usado em contêineres Linux (LXC). Você inicia um chamado nnsm da seguinte maneira

ip netns add nnsm

então transferimos vm2 para ele,

ip link set vm2 netns nnsm 

damos ao novo namespace da rede uma interface lo (absolutamente necessária),

ip netns exec nnsm  ip link set dev lo up

nós permitimos NATting na máquina principal,

iptables -t nat -A POSTROUTING -o brm -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

(se você estiver conectado à Internet via eth0 , altere de acordo), inicie um shell no novo espaço para nome da rede,

ip netns exec nnsm xterm & 

e agora, se você começar a digitar o novo xterm, verá que está em uma máquina virtual separada com endereço IP 10.0.0.2, mas poderá acessar a Internet. A vantagem disso é que o novo espaço para nome da rede possui sua própria pilha, o que significa, por exemplo, que você pode iniciar uma VPN nela enquanto o resto do seu PC não estiver na VPN. Esta é a engenhoca em que os LXCs se baseiam.

EDITAR:

Cometi um erro ao trazer a interface vm2 para baixo e limpa o endereço. Portanto, você precisa adicionar estes comandos, de dentro do xterm:

ip addr add 10.0.0.2/24 dev vm2
ip link set dev  vm2 up
ip route add default via 10.0.0.1
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf

e agora você pode navegar no xterm.

Os ipcomandos também podem ser feitos antes do xterm com

ip -netns nnsm addr add 10.0.0.2/24 dev vm2
ip -netns nnsm link set dev vm2 up
ip -netns nnsm route add default via 10.0.0.1
MariusMatutiae
fonte
Obrigado pela explicação. Eu só vejo lo no xterm, a interface vm2 está ausente.
Reinder
Obrigado novamente. Eu fiz um script para configuração de três xterm de, e a lata de ping entre si :)
Reinder
Apenas um problema .... Quando envio uma transmissão UPD em um xterm, os outros recebem o pacote de 10.0.0.254 (brm). Para o meu script, veja: aqui (não pode publicá-lo no comentário)
Reinder
Eu tenho problema trazendo vm1-se :( # ligação ip add dev tipo vm1 Veth nome de mesmo nível vm2 ip: rtnetlink respostas: existe Arquivo nº IP Link conjunto dev vm1-se ip: SIOCGIFFLAGS: No dispositivo,
resultsway
@ MariusMatutiae Eu tive que tentar algumas vezes, então concordo com o primeiro comando, mas de alguma forma minha pasta de cópia não é adequada para o segundo (estou usando minicom no dispositivo), então, em resumo, segui exatamente como sugerido. Eu acho que não tenho o pacote iproute2.
resultsway
0

Aqui está uma configuração de ponte de 5 nós que eu uso que funciona. Você deve poder usar o ifconfig para atribuir endereços às interfaces do NodeX

ip link add dev Node1s type veth peer name Node1
ip link add dev Node2s type veth peer name Node2
ip link add dev Node3s type veth peer name Node3
ip link add dev Node4s type veth peer name Node4
ip link add dev Node5s type veth peer name Node5

ip link set Node1 up
ip link set Node2 up
ip link set Node3 up
ip link set Node4 up
ip link set Node5 up

ip link set Node1s up
ip link set Node2s up
ip link set Node3s up
ip link set Node4s up
ip link set Node5s up

brctl addbr Br
ifconfig Br up

brctl addif Br Node1s
brctl addif Br Node2s
brctl addif Br Node3s
brctl addif Br Node4s
brctl addif Br Node5s

e limpar

brctl delif Br Node1s
brctl delif Br Node2s
brctl delif Br Node3s
brctl delif Br Node4s
brctl delif Br Node5s
brctl delif Br Node1
brctl delif Br Node2
brctl delif Br Node3
brctl delif Br Node4
brctl delif Br Node5

ifconfig Br down
brctl delbr Br

ip link del dev Node1
ip link del dev Node2
ip link del dev Node3
ip link del dev Node4
ip link del dev Node5
Neil McGill
fonte