Como transformar um raspberrypi em um roteador wifi
Transformar um raspberrypi em um roteador por linhas de comando pode ser uma tarefa bastante desafiadora, acredito ser uma ótima oportunidade para por em prática vários conceitos de redes que passam batido no nosso dia a dia.
Muitas vezes esquecemos que para a internet funcionar existem vários serviços e protocolos entre o seu computador e seu provedor de internet, sim estamos falando do roteador.
O roteador não é apenas um dispositivo que transmite o sinal wifi, ele é quem gerencia toda a infra-estrutura de rede, seja residencial ou no meio corporativo, o roteador tem o papel fundamental.
Um roteador nada mais é que um computador que possui um sistema operacional muitas vezes baseadas em linux, que tem o papel que rotear e direcionar a conexão de internet, ele é responsável por identificar cada dispositivo na rede e direcionar as solicitações feita por ele para a internet e devolver o retorno dessas solicitações para esses dispositivos.
Atenção: essa não é a forma mais fácil de configurar uma rede wifi no raspberrypi, você pode usar sistemas próprios para isso como o openwrt, com ele você terá uma interface gráfica fácil de gerenciar sua rede, estou escrevendo esse tópico mas como um desafio.
Instalando openwrt no raspberry pi zero
Vamos separar por tópicos, para abordar cada item da nossa configuração de rede.
- Entrada de rede (WAN)
- Saída de rede (LAN)
- Configuração Bridge
- Servidor DHCP
- Configuração WIFI
Nosso roteador terá as seguintes configuração
- Uma entrada de internet RJ45, por onde iremos conectar nosso dispositivo na rede.
- Uma saída de internet RJ45, que iremos usar para conectar um computador.
- Uma saída wifi, para conectar dispositivos sem fio.
Lista de materiais
- Raspberry PI 3B
- Adaptador de internet usb
Aviso e Riscos:
Ao configurar um servidor DHCP essa configuração pode entrar em conflito com redes existentes conectadas, minha recomendação é evitar fazer esses testes em redes críticas, como por exemplo dentre de uma universidades ou empresas, pois uma configuração errada pode derrubar conexões já existentes.
Mesmo o link abaixo se tratando de um ataque proposital, o mesmo pode acontecer de forma acidental, se a rede em que você estiver testando não estiver preparada para esse tipo de ataque podem ocorrer oscilações.
https://www.linkedin.com/pulse/dhcp-snooping-o-que-%C3%A9-como-previnir-na-sua-rede-weslley-silva/
Em caso de eventual instabilidade basta desconectar o raspberrypi da rede e revisar as configurações.
Não recomendo que faça as configurações de forma remota, por ssh por exemplo use um monitor e teclado.
A cada alteração do arquivo /etc/network/interfaces
você pode reiniciar o dispositivo com ifreload, para isso basta instalar o ifupdown2.
apt install ifupdown2
Tipos de cabos:
Na rede temos dois tipos de dispositivos, o dispositivo que irá atuar como um servidor e outro como um host, em dispositivos mais antigos a seleção pode não ser automática.
Exemplo de hosts: computadores, celulares, raspberrypi…
Exemplo de servidores: roteadores, switches.
Ao conectar dois dispositivos do mesmo tipo essa comunicação pode não acontecer, para resolver esse problema basta mudar o tipo de cabo.
Esse problema dificilmente acontece em dispositivos mais modernos, que fazem essa seleção de forma automática.
Entrada de internet (WAN):
Vamos configurar uma entrada de rede para nosso dispositivo, no primeiro momento vou utilizar o cliente dhcp, porém num cenário real em que seu roteador será conectado diretamente a rede do seu provedor muito provavelmente você teria que configurar um cliente pppoe.
nossa interface wan é a eth0
Então vamos ver essas interfaces. Com o comando ip addr conseguimos ver o ip que ele
pegou da rede.
Observe que ele já pegou um endereço ip via dhcp, isso aconteceu pq o linux tem um software chamado dhclient que configura um cliente dhcp em todas as interfaces de rede, mesmo assim iremos configurar a interface, pq iremos aplicar outras configurações.
Para isso só acessar o arquivo /etc/network/interfaces
e incluir as seguintes linhas.
auto eth0
iface eth0 inet dhcp
O linux por padrão não permite trafegar dados pelas interfaces, como estamos configuramos um roteador tráfegos irão passar pelas interfaces, para isso precisamos executar o seguinte comando.
sysctl -w net.ipv4.ip_forward=1
Outra configuração na interface wan é uma regra de firewall que irá mascarar o tráfego, o que queremos com isso?
Em uma configuração de rede tem o conceito de ip local e ip real, o ip local é aquele que seu roteador envia aos dispositivos, e o ip real seria o ip da sua internet, a diferença entre os dois é que o ip local não é acessível por quem está fora da rede.
Imagine um prédio, e esse prédio temos um porteiro, e você está fora do prédio e precisa de comunicar com uma pessoa que está dentro do prédio, para isso você irá acionar o porteiro, que por sua vez irá falar com a pessoa dentro do prédio, essa pessoa irá responder ao porteiro e o porteiro irá responder a você.
Nesse exemplo o porteiro seria o roteador, você seria a internet e a pessoa dentro do prédio seria o dispositivo conectado ao roteador.
Para você que está do lado de fora a única interface que existe para a comunicação é o porteiro, logo ele precisa “mascarar” a comunicação, tudo que a pessoa dentro do prédio falar o porteiro irá repetir para você, e tudo que você responder o porteiro irá mascarar para a pessoa dentro do prédio.
A interface que irá assumir o papel do porteiro é a interface WAN, ela receberá um endereço IP do provedor de internet, e irá repassar os pacotes as interfaces LANs.
Todos os pacotes que sairão da interface WAN serão mascarados, com o ip que ele mesmo recebeu.
Nesse exemplo o endereço ip do roteador é 192.168.0.1
O endereço ip do notebook é 192.168.0.115
E o endereço ip da internet é 177.25.3.12
Quando o notebook acessar a internet ele não pode usar o ip 192.168.0.115, pq a internet não sabe que ip é esse, o roteador precisa mascarar esse ip, com o ip de internet.
Então o ip 192.168.0.115 deve pertencer apenas a rede local, e só o roteador consegue ver esse ip, quando o notebook estiver saindo da rede local para internet ele tem que usar o ip de rede.
Para fazer isso é bastante simples, basta criar uma regra no firewall, no caso estarei usando o iptables que já vem instalado na maioria das distribuições linux.
Obs: a interface WAN nesse comando é a eth0.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Lembrando que os dois comandos que executamos são temporários, ou seja ao reiniciar seu raspberry pi as regras somem, para que isso não aconteça podemos configurar a interface de rede para executar esse comando assim que ela for ativada.
para isso só acessar o arquivo /etc/network/interfaces
.
e adicionar as seguintes linhas
post-up sysctl -w net.ipv4.ip_forward=1
post-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Agora temos outro problema, ao reiniciar a interface com o ifreload
sem reiniciar o sistema o comando do iptables será executado novamente, duplicando a regras MASQUERADE.
Para isso precisamos configurar o post-down.
post-down iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Dessa forma quando a interface for desativada ele irá remover a regra de firewall.
Saída de rede (LAN) com bridge:
Agora iremos fazer nossa primeira configuração LAN.
Vamos usar o adaptador usb para conectar o computador ao raspberry pi.
Nossa interface LAN será o eth1.
Vamos colocar todas as interfaces LANs em bridge, pois a interface wifi que iremos configurar posteriormente também é uma interface LAN.
Mas afinal o que é um bridge?
O bridge ele agrupa a interfaces virtuais de rede em uma interface virtual, nesse exemplo será a bridge_lan.
Agora as interfaces serão chamadas de portas, pense no bridge como uma caixa de ovo, e cada ovo dentro dessa caixa seria uma interface / porta.
As informações de validade por exemplo estão na caixa, e não no ovo, ou seja, você não irá configurar cada interface individualmente, e sim a bridge, e cada interface dentro do bridge irá assumir as configurações do bridge.
Vamos imaginar um roteador convencional, cada porta de entrada é uma interface.
No sistema teremos mais uma interface, a “bridge lan”, que irá unir essas interfaces, incluindo a rede wifi(wlan), que também é uma interface.
Nesse esquema podemos notar o seguinte: todas as configurações serão feitas na bridge_lan, e quando um dispositivo se conectar na interface ele vai está se conectando a bridge.
Note que a eth0 não está na bridge, isso porque as configurações da eth0 são diferentes, pois essa interface é a que vai se conectar a internet, então ela precisa estar separada do bridge.
Vamos instalar o pacote bridge-utils
apt install bridge-utils
Iremos adicionar mais algumas linhas no arquivo /etc/network/interfaces
auto eth1
iface eth1 inet manual
auto brlan
iface brlan inet static
address 192.168.0.1/24
bridge-ports eth1
bridge-stp off
bridge-fd 0
Nesse caso não temos o eth2, eth3…
apenas a eth1, por ser nossa única interface de rede lan, mas se conectar novos adaptadores usb ou wifi podemos incluir em bridge-ports e elas irão receber essas configurações automaticamente.
Definimos também um ip estático, isso porque essa interface será o gateway das outras interfaces que iremos conectar a ela.
Também colocamos o /24, isso quer dizer que essa interface irá rotear o bloco de ip.
255.255.255.0, todos os ips entre 192.168.0.1 e 192.168.0.254
Conectando na rede lan:
Agora vamos conectar o computador a rede lan.
para isso basta conectar o cabo no adaptador de rede, no computador vamos definir um ip estático (por não temos um servidor dhcp rodando no nosso roteador não conseguimos receber um IP dinâmico na rede)
Lembre-se de configurar também um servidor DNS para conseguir navegar pela internet.
Configurando um DHCP Server:
O DHCP tem uma função bastante importante, ele distribui os ips para os dispositivos conectados a rede, pensa só, se cada dispositivo que conectamos a rede precisamos configurar um ip estático? O que acontece se acidentalmente configuramos o mesmo ip estático em outro dispositivo.
O DHCP faz isso automaticamente, ele distribui ips vagos para novos dispositivos e evita que esses ips dupliquem na rede, evitando conflitos.
Então vamos configurá-lo!
Instale o software:
sudo apt-get install isc-dhcp-server
edite o arquivo /etc/dhcp/dhcpd.conf
Adicione essa configuração no final do arquivo.
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.254;
option routers 192.168.0.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
option domain-name "google.com";
}
Abra o arquivo /etc/default/isc-dhcp-server
E edite a interface bridge lan na seguinte linha
INTERFACESv4="brlan"
#INTERFACESv6="brlan"
Como não configuramos ipv6 iremos manter a configuração comentada com #
Inicialize o serviço
systemctl start isc-dhcp-server.service
Agora só desfazer a configuração de ip estático na interface.
E aguardar o recebimento de um ip novo.
Erros do DHCP Server:
Durante as configurações do dhcp server, tive alguns problemas.
service isc-dhcp-server status
journalctl -eu isc-dhcp-server
Esse erro ocorreu pq ele inicializou antes das interfaces
Para contornar o problema eu desativei o serviço
/lib/systemd/systemd-sysv-install disable isc-dhcp-server
E inclui um post-up em interfaces
post-up /etc/init.d/isc-dhcp-server start
Configurando WIFI:
As configurações de uma rede wifi é a mesma de uma interface por cabo, com a diferença que usamos um software para definir as configurações de rádio, ou seja, temos que definir as configurações de nome da rede, senha, tipo de criptografia e canal de transmissão.
Para isso vamos instalar um software chamado hostapd
apt-get install hostapd
Vamos criar um arquivo chamado hostapd.conf na pasta /etc/hostapd
Basta colar as configurações.
interface=wlan0
bridge=brlan
driver=nl80211
hw_mode=g
channel=1
country_code=BR
ieee80211d=1
ieee80211n=1
wmm_enabled=1
#nome da rede wifi
ssid=linuxbasic.net rasp-wifi
#senha da rede wifi
wpa_passphrase=senha_facil
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
Lembrando que essas configuração são específica para rede 2.4ghz
Para aplicar configurações específicas para seu adaptador wifi você pode consultar esse guia:
wiki.gentoo.org
Vamos ativar o serviço:
systemctl unmask hostapd
systemctl enable --now hostapd
Vamos adicionar nossa rede ao bridge no arquivo /etc/network/interfaces
.
source /etc/network/interfaces.d/*
auto eth0
iface eth0 inet dhcp
post-up sysctl -w net.ipv4.ip_forward=1
post-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
auto eth1
iface eth1 inet manual
+auto wlan0
+iface wlan0 inet manual
auto brlan
iface brlan inet static
post-up /etc/init.d/isc-dhcp-server start
address 192.168.0.1/24
+ bridge-ports eth1 wlan0
bridge-stp off
bridge-fd 0
Reinicie a interface e rede ou o sistema operacional
ifreload
E pronto, agora temos uma rede wifi.
Vamos nos conectar a rede.
Testes de velocidade
Para o modelo que estou usando o wifi ficou entre 10 a 20 mbps.
Talvez você consiga velocidade superior com os modelos mais recentes do RaspberryPI ou com adaptadores USB.
Wifi:
Cabo:
Conclusão
As configurações de redes do linux por linha de comando é fascinante e desafiador, embora tenha deixado de lado algumas configurações como, proteção contra ataques DoS, proteção contra SYN flood, IPV6, Bloqueios de conexão de entrada na interface WAN.
Aqui foram abordados conceitos bastante utilizados no dia a dia de um profissional de redes.
Não foi um processo fácil linear, ao configurar tive vários problemas, perdi acesso várias vezes a plaquinha, e quebrei bastante a cabeça. Porém essas dores de cabeça me fizeram entender vários conceitos, muitas vezes passamos por vários assuntos para resolver um problema, e isso é enriquecedor para o desenvolvimento de novos conhecimentos.
Sempre gostei de sistemas mais abertos a configurações, muitas vezes os roteadores domésticos convencionais tornam o problema oculto, deixando você preso aquelas configurações padrões. Quando você tem um roteador em que você escolhe qual interface será a entrada de rede, quais interfaces serão a rede LAN, você está assumindo o papel de um verdadeiro administrador de redes.
Lembrando que alguns roteadores mais fechados suportam sistemas como openwrt, que por sua vez te dá uma liberdade absurda de configuração, além de também ter uma interface gráfica mais amigável, não necessitando decorar linhas de comandos.
Referências: