Como configurar uma rede virtual 'veth'

24

Gostaria de configurar três interfaces de rede virtual ( veth ) que podem se comunicar umas com as outras. Para simular um cluster de três nós, cada programa se vincula a uma interface veth . Eu gostaria de fazer isso sem LXC, se possível.

Eu tentei usar:

  • Criado três veth pares: sudo ip link add type veth
  • Criado uma ponte sudo brctl addbr br0
  • Adicionou um de cada par à 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

Em seguida, verifiquei se funciona usando: ping -I veth0 10.0.0.202 , mas não funciona: (

Eu adicionei endereços IP às interfaces veth1 , veth3 , veth5 e br0 no intervalo 10.0.1.x / 24. Mas isso não ajuda.

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

    
por Reinder 07.06.2014 / 22:18

2 respostas

30

Para que o veth funcione, uma extremidade do túnel deve ser conectada com outra interface. Uma vez que você quer manter tudo isso virtual, você pode conectar a extremidade vm1 do túnel (vm2 é a outra extremidade do túnel) com uma interface virtual de tipo de toque, em uma ponte chamada brm. Agora você dá endereços IP para brm e para vm2 (10.0.0.1 e 10.0.0.2, respectivamente), habilitar 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 a alcançar os endereços IP 10.0.0.0/24. Isso é tudo.

Se você quiser criar mais pares, repita as etapas abaixo com diferentes sub-redes, 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, elas poderão se comunicar imediatamente.

Além disso, lembre-se que a maioria dos comandos que você está usando (brctl, ifconfig, ...) são obsoletos: o pacote iproute2 tem comandos para fazer tudo isso, veja abaixo o uso do comando 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

Perceba que não trazemos brm e vm2 porque temos que atribuir endereços IP, mas trouxemos tapm e vm1, o que é necessário para incluí-los na bridge brm. Agora escravize as interfaces tapm e vm1 para a 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,

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 ip route show . Isso 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 de trás para frente, isto é, de vm2 de volta para 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 containers Linux (LXC). Você inicia um chamado nnsm da seguinte forma

ip netns add nnsm

então nós transferimos vm2 para ele,

ip link set vm2 netns nnsm 

nós damos o novo namespace de rede com uma interface (absolutamente necessária),

ip netns exec nnsm  ip link set dev lo up

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 , caso contrário, mude de acordo), inicie um shell no novo namespace de rede,

ip netns exec nnsm xterm & 

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

EDITAR:

Eu cometi um erro, trazendo a interface vm2 traz para baixo e limpa seu endereço. Assim, você precisa adicionar esses 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 pelo xterm.

Os comandos ip 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
    
por 08.06.2014 / 10:02
0

Aqui está uma configuração de 5 pontes que eu uso e que funciona. Você deve ser capaz de usar ifconfig para atribuir endereços às interfaces 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 para 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
    
por 17.03.2018 / 04:45