Ligando duas interfaces de toque

0

Eu sou um noob total, este é meu primeiro experimento com redes de kernel. Estou tentando criar uma ponte entre duas interfaces tap e tentar enviar tráfego. É mais uma experiência do que para qualquer propósito particular.

$ brctl showstp br0
br0
bridge id      8000.46846e0c0ff9
designated root    8000.46846e0c0ff9
root port         0            path cost          0
max age          20.00         bridge max age        20.00
hello time        2.00         bridge hello time      2.00
forward delay        15.00         bridge forward delay      15.00
ageing time         300.00
hello timer           1.98         tcn timer          0.00
topology change timer     0.00         gc timer         115.04
flags          


tap1 (1)
port id        8001            state            forwarding
designated root    8000.46846e0c0ff9   path cost        100
designated bridge  8000.46846e0c0ff9   message age timer      0.00
designated port    8001            forward delay timer   10.34
designated cost       0            hold timer         0.98
flags          

tap2 (2)
port id        8002            state            forwarding
designated root    8000.46846e0c0ff9   path cost        100
designated bridge  8000.46846e0c0ff9   message age timer      0.00
designated port    8002            forward delay timer    0.00
designated cost       0            hold timer         0.98
flags          

Eu tenho a ponte br0 criada, com tap1 e tap2 adicionados. Eu tenho um programa injetando pacotes ARP em tap1 usando libpcap . O Wireshark mostra corretamente os pacotes que entram em tap1 . No entanto, nenhum pacote aparece em tap2 . Eu tentei adicionar a seguinte regra em ebtables:

sudo ebtables -I INPUT --log --log-level debug

Nenhum pacote aparece nos logs. Eu aprecio qualquer entrada.

EDIT: Adicionando mais informações. Injetar pacotes falsos é de fato o aplicativo. Minha intenção aqui é simular, totalmente em software e sem VMs, como os pacotes são encaminhados através da pilha de kernel do Linux. Eu não estou criando novos namespaces de rede. Talvez seja esse o problema?

Eu só tenho dois processos. O processo de "leitura" tem um descritor de arquivos aberto para tap2 e constantemente tenta ler a partir dele. O processo de gravação tem um descritor de arquivo aberto para tap1 e aguarda o prompt do usuário para enviar a consulta ARP. A consulta ARP tem um endereço IP de origem aleatório. O endereço MAC de origem é definido como o endereço MAC de tap1 . Aqui está a saída do tcpdump:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap1, link-type EN10MB (Ethernet), capture size 262144 bytes
^[[A07:19:57.752990 ARP, Request who-has google-public-dns-a.google.com tell 0.0.248.17, length 28
    0x0000:  ffff ffff ffff ba9c 0589 16ad 0806 0001
    0x0010:  0800 0604 0001 ba9c 0589 16ad 0000 f811
    0x0020:  0000 0000 0000 0808 0808

Eu configurei tap1 e tap2 para não ter endereços IP. Poderia ser esse o problema?

brctl addbr br0
ip tuntap add name tap1 mode tap
ip tuntap add name tap2 mode tap
brctl addif br0 tap1
brctl addif br0 tap2
ifconfig tap1 0.0.0.0 up
ifconfig tap2 0.0.0.0 up
ifconfig br0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
ip link set br0 up
ip link set tap1 up
ip link set tap2 up

Com base na resposta, verifiquei a anexação de vários aplicativos a tap2 . Eu percebo isso: quando nenhum aplicativo está usando tap1 ou tap2 , ambas as interfaces não têm o sinalizador LOWER_UP definido.

4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff
25: tap1: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT group default qlen 500
    link/ether ba:9c:05:89:16:ad brd ff:ff:ff:ff:ff:ff
26: tap2: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT group default qlen 500

Quando inicio os aplicativos, o sinalizador LOWER_UP é definido:

4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff
25: tap1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 500
    link/ether ba:9c:05:89:16:ad brd ff:ff:ff:ff:ff:ff
26: tap2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 500
    link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff

Sinto muito que isso esteja acabando, estou apenas esperando que haja informações suficientes para entender o problema.

    
por SPMP 04.02.2018 / 04:04

1 resposta

1

Apenas no caso, porque você disse que é um noob total: A interface tun (camada 3) ou tap (camada 2) é o ponto de extremidade da interface de rede de um aplicativo, e o aplicativo pode ler e gravar pacotes a partir dessa interface de rede . O que você cria com ip tuntap add ... ou o desatualizado tunctl são nomes persistentes para esses nós de extremidade, e normalmente você ainda executará o aplicativo, e ele não fará nada a menos que você execute o aplicativo.

Como o aplicativo interage com a interface de rede como uma questão de design, não há necessidade de "injetar" pacotes com um aplicativo de terceiros, a menos que você queira dizer "injetar" essa interação normal que descrevi.

Além disso, se você quiser brincar com redes, posso recomendar o uso de namespaces de rede e veth pairs . Basicamente, você pode configurar muitos computadores virtuais no seu computador que podem imitar a comunicação entre computadores reais em uma rede.

Então, se você quer fazer isso e não quer brincar com seu próprio aplicativo criando e recebendo pacotes, você não precisa de uma interface tun / tap.

Dito isso, acabei de testar sua configuração, com uma pequena variação porque você não disse o que usa para "injetar" pacotes: usei dois socat s para criar o ponto de extremidade tap0a e tap1a Depois, eu os preenchi e usei outros dois socat s em dois namespaces diferentes para criar os pacotes corretos para mim. Eles precisam estar em um namespace diferente, pois os pacotes locais sempre serão entregues via loopback lo .

E, como esperado, os dispositivos de toque de ponte funcionam bem.

Então, suponho que o problema esteja no pacote que você está injetando: Endereço Ethernet incorreto ou sem transmissão. Por favor, edite sua pergunta com tcpdump -xx ... output quando você injetar o pacote ARP.

Ou talvez você gostaria de criar namespaces de rede e fazer a ponte entre dois pontos de extremidade de dois pares de veth? Isso é muito mais simples.

Editar

O pacote ARP parece bom. Parece que não há nenhum aplicativo conectado a tap2 . Se você fizer ip link , não verá um sinal LOWER_UP para tap2 . Guess: A bridge detecta que o dispositivo está apenas parcialmente em cima e não envia pacotes para esta porta.

Tente substituí-lo por um tap que tenha um aplicativo conectado a ele, algo como

sudo socat TUN:10.0.2.2/24,tun-name=tapx,tun-type=tap,iff-up - | hexdump -C

(o endereço 10.0.2.2/24 não faz nada, mas socat não funciona se você não especificar um endereço) e em outro terminal

sudo ip link set tapx master br0

(que substitui brctl addif ), então injete seu pacote várias vezes e veja se você obtém um hexdump na primeira janela. Verifique também por LOWER_UP com ip link show dev tapx .

BTW, ifconfig e brctl estão desatualizados. Use ip e bridge .

Não atribuir endereços IP às portas da ponte não importa, porque as portas de ponte não têm endereços IP (se elas forem atribuídas a elas antes de se tornarem escravizadas por uma ponte, eles são ignorados). Veja por exemplo aqui .

    
por 04.02.2018 / 13:23