Como criar uma LAN virtual no Linux com interfaces e pontes fictícias?

3

Eu gostaria de criar uma LAN no Linux para executar alguns experimentos. Isso é basicamente um exercício de aprendizado, então não quero usar interfaces Ethernet reais ou algo parecido. Parece que posso criar interfaces fictícias e conectá-las a uma interface de ponte para fazer isso. Cada interface fictícia seria um ponto final na LAN e a ponte funcionaria como um comutador Ethernet. Aqui está como eu estou criando a LAN:

ip link add dummy1 type dummy
ip link add dummy2 type dummy
ip link add br0 type bridge
ip link set dummy1 arp on
ip link set dummy2 arp on
ip link set dev dummy1 master br0
ip link set dev dummy2 master br0
ip address add 10.0.2.1/24 broadcast + dev br0
ip address add 10.0.2.2/24 broadcast + dev dummy1
ip address add 10.0.2.3/24 broadcast + dev dummy2
ip link set dummy1 up
ip link set dummy2 up
ip link set br0 up

Eu posso ver que os links estão ativos (googling diz que o "estado DESCONHECIDO" é esperado):

$ ip link
...
6: dummy1: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether fa:b9:0e:8e:a7:1f brd ff:ff:ff:ff:ff:ff
7: dummy2: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 7a:5d:8e:2b:76:d6 brd ff:ff:ff:ff:ff:ff
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 7a:5d:8e:2b:76:d6 brd ff:ff:ff:ff:ff:ff

E que os endereços são esperados. No entanto, ping e arping não funcionam. Em outras palavras, nenhum dos seguintes relata uma resposta:

ping -I dummy1 10.0.2.3
arping -I dummy1 10.0.2.3

ping -I dummy2 10.0.2.2
arping -I dummy2 10.0.2.2

A execução do wireshark nas interfaces dummy mostra ping e arping gerando pacotes, mas é isso.

Parece que a bridge conhece os endereços MAC:

$ brctl showmacs br0
port no mac addr        is local?   ageing timer
  2 7a:5d:8e:2b:76:d6   yes        0.00
  2 7a:5d:8e:2b:76:d6   yes        0.00
  1 fa:b9:0e:8e:a7:1f   yes        0.00
  1 fa:b9:0e:8e:a7:1f   yes        0.00

No entanto, não acho que a ponte esteja encaminhando quadros de dummy1 para dummy2 e vice-versa.

O que devo fazer para fazer a ponte avançar quadros ou existe uma maneira diferente de construir essa LAN virtualmente que não seja usando interfaces fictícias?

    
por Frank Hunleth 13.07.2017 / 22:31

1 resposta

3

Interfaces fictícias são chamadas de "fictícias" porque não funcionam de verdade. Seu único uso (eu sei) é permitir que um aplicativo de longa duração se vincule a eles, para que você possa movê-los e conectá-los a outras interfaces sem interromper o aplicativo.

Você não poderá construir uma LAN virtual com interfaces fictícias.

Em vez disso, use namespaces de rede como substituto de diferentes computadores ( "hosts"), e conecte-os com links Ethernet virtuais (pares veth).

Dessa forma, você pode construir uma LAN tão complicada quanto quiser. Faça a ponte do jeito que você quiser, faça o encaminhamento e o NAT, configure roteamento complicado, etc.

Como ponto de partida, aqui está um script que eu uso para criar um namespace de rede com uma conexão veth-pair no namespace principal e um xterm nesse namespace. Corra como root e substitua USERNAME pelo seu nome de usuário:

#!/bin/bash

# Setup network namespace with veth pair, start xterm in it

# nsterm ns0 veth0 10.0.0 yellow 24

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

NS=${1:-ns0}
DEV=${2:-veth0}
DEV_A=${DEV}a
DEV_B=${DEV}b
ADDR=${3-:10.0.0}
ADDR_A=${ADDR}.254
ADDR_B=${ADDR}.1
MASK=${5:-24}
COL=${4:-yellow}

# echo ns=$NS dev=$DEV col=$COL mask=$MASK

ip netns add $NS
ip link add $DEV_A type veth peer name $DEV_B netns $NS
ip addr add $ADDR_A/$MASK dev $DEV_A
ip link set ${DEV}a up
ip netns exec $NS ip addr add $ADDR_B/$MASK dev $DEV_B
ip netns exec $NS ip link set ${DEV}b up
ip netns exec $NS ip route add default via $ADDR_A dev $DEV_B
ip netns exec $NS su -c "xterm -bg $COL &" USERNAME
    
por 14.07.2017 / 09:04