Linux: usando uma rede virtual dentro de uma ponte

1

Premissa:

Estou usando um raspberry pi3 como AP. Eu adicionei um adaptador USB para ethernet e esta é a configuração que eu tenho:

  • construído na porta eth como eth0 (WAN)
  • interface wifi integrada como wlan0 (LAN, sem fio)
  • usb para adaptador ethernet como eth1 (LAN, com fio)

Eu conectei wlan0 e eth1 com sucesso em uma ponte, br0.

Então eu configurei um nat para permitir que os dispositivos em br0 se conectem à internet. Tudo isso funciona.

Problema:

Agora, gostaria de dividir a LAN com fio, para que haja uma rede virtual (eth1: 0) para dispositivos confiáveis e outra rede virtual para dispositivos menos confiáveis (eth1: 1).

A idéia seria adicionar à br0 apenas eth1: 0. Isso parece funcionar, mas quando eu listo as pontes, o br0 parece usar diretamente eth1, em vez da interface virtual eth1: 0.

Na verdade, se eu tentar criar outra bridge (br1) e adicionar outra rede virtual (eth1: 1), recebo um erro informando que a interface já está em uma ponte.

Portanto, parece que uma interface virtual não pode ser adicionada a uma ponte, apenas a sua matriz.

Isso é verdade? Existe alguma outra maneira de fazer isso?

Este é o script de teste que estou usando:

function configure_firewall() {
    echo  CONFIGURE FIREWALL START
    ####################### FORWARDING #####################
    # Enable IP forwarding
    echo 1 > /proc/sys/net/ipv4/ip_forward

    # Allow forwarding of traffic LAN -> WAN
    iptables -A FORWARD -i ${BRIDGE} -o ${WAN} -j ACCEPT

    # Allow traffic WAN -> LAN but only as reply to communication initiated from the LAN
    iptables -A FORWARD -i ${WAN} -o ${BRIDGE} -m state --state RELATED,ESTABLISHED -j ACCEPT

    # Drop anything else
    iptables -A FORWARD -j DROP

    ####################### MASQUERADING ########################

    # Do the nat
    iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE

    ###################### INPUT #############################
    # Allow local connections
    iptables -A INPUT -i lo -j ACCEPT

    iptables -A INPUT -i ${BRIDGE} -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -i ${WAN} -j ACCEPT
    iptables -A INPUT -i ${WAN} -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -j DROP

    ###################### OUTPUT #############################
    iptables -A OUTPUT -j ACCEPT
    echo  CONFIGURE FIREWALL END
}

function teardown_bridge() {
    echo TEARDOWN BRIDGE START
    ifconfig ${BRIDGE} down
    brctl delif ${BRIDGE} ${LAN}:0
    brctl delif ${BRIDGE} ${WIFI}
    brctl delbr ${BRIDGE}
    echo TEARDOWN BRIDGE END
}

function configure_bridge() {
    echo CONFIGURE BRIDGE START
    brctl addbr ${BRIDGE}
    brctl addif ${BRIDGE} ${LAN}:0
    brctl addif ${BRIDGE} ${WIFI}
    ifconfig ${BRIDGE} up 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.0
    echo CONFIGURE BRIDGE END
}

function configure_interfaces() {
    echo CONFIGURE INTERFACES START
    ifconfig ${LAN} up 0.0.0.1
    ifconfig ${LAN}:0 up 0.0.0.2
    ifconfig ${LAN}:1 up 0.0.0.3
    echo CONFIGURE INTERFACES END
}

function teardown_interfaces() {
    echo TEARDOWN INTERFACES START
    ifdown ${LAN}:1
    ifdown ${LAN}:0
    ifdown ${LAN}
    echo TEARDOWN INTERFACES END
}

function delayed_reset() {
    for i in 'seq 15 -1 0'; do
        sleep 1
        echo ${i}
    done
    sync
    reboot
    exit
}

#test_network

#if [ $? -ne 0 ] ; then
    teardown_firewall
    teardown_bridge
    teardown_interfaces
    configure_interfaces
    configure_bridge
    configure_firewall
    #delayed_reset
#fi

Depois de executar o script, se eu executar ifconfig , parece que as redes virtuais existem:

eth1      Link encap:Ethernet  HWaddr 00:13:3b:62:11:f6  
          inet addr:0.0.0.1  Bcast:255.255.255.255  Mask:0.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30712 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19110 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:5261152 (5.0 MiB)  TX bytes:5355909 (5.1 MiB)

eth1:0    Link encap:Ethernet  HWaddr 00:13:3b:62:11:f6  
          inet addr:0.0.0.2  Bcast:255.255.255.255  Mask:0.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth1:1    Link encap:Ethernet  HWaddr 00:13:3b:62:11:f6  
          inet addr:0.0.0.3  Bcast:255.255.255.255  Mask:0.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

Mas todo o eth1 parece estar em br0 :

root@raspberrypi:/home/pi# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.00133b6211f6       no              eth1
                                                        wlan0

E isso parece confirmar:

root@raspberrypi:/home/pi# brctl addbr br1
root@raspberrypi:/home/pi# brctl addif br1 eth1:1
device eth1:1 is already a member of a bridge; can't enslave it to bridge br1.

Nota: Eu olhei para Criar e interligar interfaces de rede virtual no Linux mas parece estar obsoleto, já que se refere a iproute2.

    
por Igor Stoppa 24.01.2017 / 03:48

1 resposta

4

Você não pode criar br0 e br1 bridges em uma interface eth1, porque eth1:0 e eth1:1 é a mesma interface eth1 com dois endereços IP diferentes. Você pode criar vlan Se sua rede com fio e switch permitirem. Se você criar duas vlans eth1.10 e eth1.20 , você terá duas interfaces diferentes, que podem ser usadas para as pontes br0 e br1 .

    
por 24.01.2017 / 06:38