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.