DSA, HostAPD, IPTables e encaminhamento IP
Esta é a terceira parte da série de artigos Construir um router com o Banana Pi. Para consultar a primeira parte, veja aqui e para a segunda parte, veja aqui.
Na terceira parte desta série de artigos, vou demonstrar como se instalam os três serviços básicos de qualquer router para casa: HostAPD, para aceitar ligações de clientes WiFi, DHCP, para atribuição de endereços IP, e encaminhamento IP, para, como o nome indica, encaminhar correctamente os pacotes IP de e para a Internet.
Mas, antes disso, vou dar conta de alterações que fiz ao sistema operativo e ao hardware, em relação ao que mencionei na segunda parte.
Alteração ao sistema operativo e hardware
Nos últimos dias andei a testar diferentes configurações de software e hardware por forma a instalar o Banana Pi R1 como router.
Deparei-me com vários problemas:
- O sistema operativo não era muito actual. A versão do kernel do Linux era da série 3.4, que foi lançado em Maio de 2012;
- O controlador WiFi do Banana Pi R1 não é muito estável. Este controlador é baseado no chip RealTek RTL8192CU, que, ainda por cima, está ligado ao Banana Pi R1 por USB (soldado na motherboard). Ainda não consegui determinar se o problema de estabilidade é causado pelo driver (do kernel 3.4) ou do próprio hardware.
- Adquiri um adaptador WiFi TP-Link TP-WN722N (USB) para usar, mas não conseguia (por limitações do driver) alterar o “domínio regulatório” (mais sobre isto à frente) para Portugal, o que, na prática, nos impede de usar os canais WiFi 12 e 13 (frequências portadoras 2,467GHz e 2,472GHz) que normalmente são menos usados e, logo, melhores.
Versão do kernel
O kernel que tinha instalado era a versão 3.4.113. Apesar de esta ter sido lançada em Outubro de 2016, a série 3.4 já tem mais de 5 anos, pelo que decidi testar uma versão mais recente. Deste modo, mudei a imagem do sistema operativo para a imagem com o kernel 4.9.7 (link directo para download https://dl.armbian.com/lamobo-r1/archive/Armbian_5.25_Lamobo-r1_Debian_jessie_next_4.9.7.7z).
Esta versão obrigou a alterar a configuração do switch BCM53125, pois já não é possível usar o utilitário swconfig, que é usado para definir VLANs para os interfaces virtuais de rede (LAN e WAN). Ao invés, nesta versão, tem que se usar uma funcionalidade chamada DSA (Distributed Switch Architecture).
Visto isto, a configuração de VLANs fica assim:
ip link set eth0 down
ip addr flush eth0
ip link set eth0 up
ip link add link eth0 name eth0.101 type vlan id 101
ip link add link eth0 name eth0.102 type vlan id 102
ip link add name br0 type bridge
ip link add br1 type bridge
ip link set lan1 master br0
ip link set lan2 master br0
ip link set lan3 master br0
ip link set lan4 master br0
ip link set wan master br1
bridge vlan add vid 101 dev lan1 pvid untagged
bridge vlan add vid 101 dev lan2 pvid untagged
bridge vlan add vid 101 dev lan3 pvid untagged
bridge vlan add vid 101 dev lan4 pvid untagged
bridge vlan del dev lan1 vid 1 self
bridge vlan del dev lan2 vid 1 self
bridge vlan del dev lan3 vid 1 self
bridge vlan del dev lan4 vid 1 self
bridge vlan del dev lan1 vid 1 master
bridge vlan del dev lan2 vid 1 master
bridge vlan del dev lan3 vid 1 master
bridge vlan del dev lan4 vid 1 master
bridge vlan add vid 102 dev wan pvid untagged
bridge vlan del dev wan vid 1 seld
bridge vlan del dev wan vid 1 self
bridge vlan del dev wan vid 1 master
ip link set eth0.101 master br0
ip link set eth0.102 master br1
ip link set br0 up
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up
ip link set lan4 up
ip link set wan up
ip link set br1 up
Por forma a integrar a inicialização dos interfaces com o systemd, é necessário comentar as linhas ip link set br0 up e ip link br1 up.
Com estas duas linhas comentadas, o ficheiro /etc/network/interfaces fica assim:
iface lo inet loopback auto eth0.101 iface eth0.101 inet manual auto eth0.102 iface eth0.102 inet manual allow-hotplug wlan0 iface wlan0 inet manual allow-hotplug wlan1 iface wlan1 inet manual # WAN auto br1 iface br1 inet dhcp # LAN auto br0 iface br0 inet static address 192.168.2.254 netmask 255.255.255.0
HostAPD
O software que permite a ligação de clientes WiFi a um sistema Linux é, tradicionalmente, o HostAPD.
O HostAPD não vem pré-instalado no Armbian, mas a sua instalação é extremamente simples:
apt install hostapd
ou, no caso de se estar a usar o interface WiFi do Banana Pi ou um adaptador externo baseado em chipsets RealTek:
apt install hostapd-realtek
A configuração é muito simples. O ficheiro de configuração que estou a usar é:
ssid=ARMBIAN interface=wlan1 hw_mode=g channel=11 bridge=br0 driver=nl80211 wds_sta=1 logger_syslog=-1 logger_syslog_level=0 wmm_enabled=1 ieee80211n=1 wpa=2 preamble=1 wpa_passphrase=123456 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP auth_algs=1 macaddr_acl=0 noscan=1 ht_capab=[HT40-][SHORT-GI-40][SHORT-GI-40][DSSS_CCK-40] country_code=PT ieee80211d=1
No caso de se estar a usar a versão HostAPD para chipsets Realtek, dever-se‑á substituir a linha
driver=nl80211
por
driver=rtl871xdrv
IPTables
Antes de activar o encaminhamento IP no router, é necessário configurar o IPTables, que é a firewall presente no Linux.
Utilizei as seguintes regras:
iptables -F iptables -t nat -F iptables -A INPUT -i br0 -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -s 192.168.2.0/24 -i br0 -j ACCEPT iptables -A FORWARD -d 192.168.2.0/24 -i br1 -j ACCEPT iptables -t nat -A POSTROUTING -o br1 -j MASQUERADE iptables -P INPUT DROP iptables -P FORWARD DROP exit 0
Estas regras activam NAT no interface br1, bem como autorizações básicas para entrada e saída de pacotes IP na chain FORWARD, que é a chain por onde passam os pacotes IP não destinados ao próprio router. As duas primeiras regras (linhas 3 e 4) autorizam também qualquer ligação TCP vinda da rede interna (interface br0).
Encaminhamento IP
Finalmente, activa-se o encaminhamento IP com o comando
echo 1 > /proc/sys/net/ipv4/ip_forward
ou
sysctl net.ipv4.ip_forward=1
Configurações permanentes
Como último passo, por forma a fazer com que estas configurações fiquem activas no arranque do sistema, deve-se gravar a configuração DSA no ficheiro /etc/network/if-pre-up.d/dsa, a configuração de IPTables no ficheiro /etc/network/if-pre-up.d/iptables, e editar o ficheiro /etc/sysctl.conf e procurar a linha com referência à variável net.ipv4.ip_forward e retirar o comentário:
net.ipv4.ip_forward=1
Não esquecer de fazer
chmod a+x /etc/network/if-pre-up.d/dsa chmod a+x /etc/network/if-pre-up.d/iptables
E pronto, o nosso router está pronto a funcionar. Para testar a configuração pode-se tentar agora fazer reboot.
Na parte IV, falarei de alguns toques finais, como monitorização e re-encaminhamento de portas.