Interface Bridge TAP para ETH em Raspberry Pi 3?

0

Descrição:

Minha equipe e eu estamos trabalhando com alguns pi de framboesa 3 e uma pilha de IP chamada PicoTCP. O PicoTCP usa uma interface TAP, a nossa é chamada tap0 . A interface tap0 deve ter seu próprio IP ao usar com o PicoTCP. Infelizmente, como a interface tap0 é virtualizada, ela não tem conhecimento dos outros pi do framboesa na mesma LAN. Parece óbvio que precisamos preencher a interface tap0 com nossa interface ethernet eth0 para resolver esse problema (corrija-me se estiver errado). Nós tentamos muitas soluções sem sucesso!

Informações técnicas:

  • Todos os Pi estão conectados via ethernet ao mesmo roteador
  • Todos os Pi's estão executando a versão mais recente do sistema operacional Raspbian

Algumas soluções que tentamos: link !

auto br0
iface br0 inet dhcp
pre-up tunctl -t (tap device ""ex:tap0"") -u (tap owner) -g (owner group name)
pre-up ip link set dev eth0 down   ('''Brings down ethernet''')
pre-up brctl addbr br0   ('''Adds bridge''')
pre-up brctl addif br0 eth0   ('''Adds eth0 to bridge''')
pre-up brctl addif br0 tap0   ('''Adds tap0 to bridge''')
pre-up ip link set dev tap0 up   ('''Bring tap0 up''')
up chmod 0666 /dev/net/tun   ('''Changes permissions on tap device to user/ owner''')
post-down ip link set dev eth0 down   ('''Brings down eth0''' )
post-down ip link set dev tap0 dpwn   ('''Brings down tap0''')
post-down ip link set dev br0 down   ('''Brings down br0''')
post-down brctl delif br0 eth0   ('''Removes bridge between br0 & eth0''')
post-down brctl delif br0 tap0   ('''Removes bridge between br0 & tap0''')
post-down brctl delbr br0  ('''Removes bridge''')

Como interligar a torneira para eth0 em pi de framboesa?

ip tuntap add tap0 mode tap user root
ip link set tap0 up
ip link add br0 type bridge
ip link set tap0 master br0
ip link set dev eth0 down
ip addr flush dev eth0 
ip link set dev eth0 up
ip link set eth0 master br0
ip link set dev br0 up

link

#!/bin/bash

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.10.253"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.10.255"

for t in $tap; do
    openvpn --mktun --dev $t
done

brctl addbr $br
brctl addif $br $eth

for t in $tap; do
    brctl addif $br $t
done

for t in $tap; do
    ifconfig $t 0.0.0.0 promisc up
done

ifconfig $eth 0.0.0.0 promisc up

ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

PicoTCP Utilizando a interface tap0 :

struct pico_device* init_picotcp(void) {
    struct pico_device *dev;
    struct pico_ip4 ipaddr, netmask, local;

    pico_string_to_ipv4("tap0", &local.addr);

    dev = pico_ipv4_link_find(&local);

    if(!dev) {
        printf("FAIL!\n");
        return NULL;
    }

    pico_string_to_ipv4(serv.ipv4_addr.c_str(), &ipaddr.addr);
    pico_string_to_ipv4(serv.netmask.c_str(), &netmask.addr);
    pico_ipv4_link_add(dev, ipaddr, netmask);

    return dev;
} 

Esta linha: pico_ipv4_link_add(dev, ipaddr, netmask);

Abre o dispositivo tap0 criado com um IP e uma máscara de rede específicos.

Nota:

Nenhuma dessas soluções funcionou para nós.

    
por btald1331 06.12.2016 / 16:27

1 resposta

1

(desenvolvedor picoTCP aqui)

Um primeiro palpite (muito difícil): provavelmente você está configurando o dispositivo TAP com permissões de root. Você está executando o picoTCP como root também? Se você não for, provavelmente não poderá abrir o TAP por causa das permissões. Primeiro tente executar o aplicativo picoTCP sob sudo.

Se você não gosta de executar o aplicativo como root, use sudo tunctl -u <username> para configurar um dispositivo de toque acessível por <username> .

Se essa não foi a causa, mais algumas informações podem ser necessárias: alguma das ferramentas está imprimindo alguns erros ou avisos? O que exatamente você quer dizer com "nenhuma dessas soluções funcionou para nós" - um dos comandos (ou o aplicativo picoTCP) está reportando um erro, parando ou travando, ou está tudo funcionando, mas você simplesmente não consegue fazer o ping dos dispositivos? Você pode pegar um despejo wireshark no dispositivo de derivação, para que possamos ver o que está indo e vindo? Você pode nos mostrar a saída de ifconfig -a quando tiver tudo configurado? E talvez a saída de brctl show também. (desculpe, é uma lista tão longa de perguntas, é que há muitas pequenas coisas que podem dar errado.)

Além disso, temos um novo código de exemplo em nossa ramificação de desenvolvimento no README.md ( link ) que você pode dar uma olhada. Ele também funciona com dispositivos de toque (embora não com ponte). É suposto ser empurrado para dominar no nosso próximo lançamento, o que tem demorado para sempre. Se esse exemplo funcionar (sem a ponte), talvez você possa tentar modificar o endereço IP no exemplo de código para corresponder à sua rede local e, em seguida, configurar a ponte novamente, e você poderá fazer ping dele.

    
por 08.12.2016 / 08:40