- Seleção de componentes
- Iniciar interfaces de rede
- Configurando um ponto de acesso 802.11ac (5 GHz)
- Configurando um SSID virtual usando o hostapd
Nos últimos dez anos, comprei equipamentos de rede baratos e instalei o 
DD-WRT nele para devolver as “funções” por mais de US $ 500 removidos do kernel Linux, no qual o firmware padrão é baseado.
Apesar das compilações instáveis, erros e 
disputas não corrigidos, o DD-WRT ainda é preferível ao estoque de firmware. Mas agora os componentes dignos estão mais baratos do que nunca, e a comunidade DIY mudou completamente para o Linux (estou olhando para você, Sr. Raspberry), então por que não construir seu próprio roteador sem fio de uma vez por todas?
Seleção de componentes
Primeiro de tudo, você precisa decidir sobre a plataforma: 
x86 ou 
ARM ? Não 
discutirei em detalhes as principais diferenças , mas brevemente: o primeiro tem melhor desempenho, enquanto o segundo é mais barato e mais eficiente em termos de energia. As placas Raspberry Pi (e equivalentes) são extremamente baratas e provavelmente mais poderosas do que a maioria dos roteadores comerciais sem fio, mas as plataformas x86 são comuns e têm a vantagem de fatores de forma e portas de expansão padronizados.
Obviamente, o detalhe mais importante é o chipset. Hoje, os padrões de fato são 
802.11n (2.4 GHz) e 
802.11ac (5 GHz), mas escolher drivers para Linux 
ainda é 
um desafio , especialmente com suporte ao modo AP (ponto de acesso). Em resumo, se você não quer problemas, escolha os chipsets 
Atheros . Os 
drivers ath9k e 
ath10k são bem suportados, você pode encontrá-los facilmente com interfaces USB e / ou mini-PCIe.
Pelo menos um NIC (controlador de interface de rede) é o mínimo necessário e escolha RAM e armazenamento ao seu gosto.
Lista de materiais
Sacrificando preço e energia, optei pela plataforma x86 por uma configuração modular relativamente poderosa disponível para atualização.
Se você não precisar de um ARM, não é necessário um ventilador.A caixa é espaçosa, com dois orifícios preparados para o plugue CA / CC. A instalação da placa-mãe, RAM e Pico-PSU ocorreu sem problemas:
 Ferro pornô
Ferro pornôO mais difícil foi instalar o WiFi mini-PCIe, porque a placa suporta apenas placas de tamanho médio: aqui o cabo de extensão mPCIe veio em socorro. Peguei um cabo FFC de 20 cm (incluído) para conectar os dois lados do adaptador e fixei o mini-PCIe ao chassi usando fita dupla face.


 Expansor mini-PCIe
Expansor mini-PCIeFelizmente, o chassi vem com três furos de antena pré-cortados. Aqui está o resultado final:


De software
É claro que colocamos o Linux. Dependendo do hardware, pode ser uma distribuição otimizada como 
Raspbian (para o Raspberry Pi) ou qualquer outra distribuição Linux que você desejar. Como uso o Ubuntu há muitos anos, escolhi o 
Ubuntu Server 18.04 LTS , com o qual estou mais acostumado a trabalhar e com quem há suporte a longo prazo.
O restante deste artigo assume que você está usando uma distribuição baseada em Debian.Se a instalação foi boa e você foi ao console, defina os nomes da interface:
$ ip -br a | awk '{print $1}' lo enp1s0 enp2s0 wlp5s0 
Existem duas placas de rede embutidas na placa-mãe: são 
enp1s0 e 
enp2s0 . A placa sem fio aparece como 
wlp5s0 e suporta o modo AP, conforme pretendido:
 $ iw list ... Supported interface modes: * managed * AP * AP/VLAN * monitor * mesh point 
Agora podemos descrever o que precisamos: colocamos a primeira NIC como uma porta WAN e a segunda nos conectamos à interface sem fio:

Rede
Se você possui o Ubuntu 18.04, livre-se do 
netplan imediatamente para retornar ao suporte para / etc / network / interfaces:
 $ sudo apt-get install ifupdown bridge-utils $ sudo systemctl stop networkd-dispatcher $ sudo systemctl disable networkd-dispatcher $ sudo systemctl mask networkd-dispatcher $ sudo apt-get purge nplan netplan.io 
Como servidor DHCP / DNS, selecione 
dnsmasq :
 $ sudo apt-get install dnsmasq 
Como iniciaremos e configuraremos o processo 
dnsmasq através do gancho de 
post-up , lembre-se de desativar o daemon no momento da inicialização:
 $ sudo sed -i "s/^ENABLED=1$/ENABLED=0/g" /etc/default/dnsmasq 
Escreveremos a configuração 
preliminar das interfaces de rede de acordo com o diagrama, incluindo a configuração mínima do 
dnsmasq :
 $ cat /etc/network/interfaces  
A documentação /etc/network/interfaces aquiComo você pode ver na seção de 
post-up , o dnsmasq inicia assim que a ponte aumenta. Sua configuração é realizada apenas por argumentos de linha de comando ( 
--conf-file=/dev/null ), e o processo será interrompido quando a interface estiver desativada.
A interface 
bridge_ports não está especificada especificamente no 
wlp5s0 , porque o 
hostapd a adicionará automaticamente à ponte (o brctl pode se recusar a fazer isso antes que o hostapd seja iniciado para alterar o modo da interface).
Consulte a documentação do dnsmasq .Agora você pode reiniciar a rede (reinício da rede do 
sudo service networking restart ) ou simplesmente reiniciar para verificar se a configuração da rede está correta.
Observação: embora atualmente possamos receber o DHCP do 
enp2s0 , não teremos 
conexão sem fio (mais sobre isso mais tarde) 
ou acesso à Internet (veja abaixo).
Encaminhamento
Nesse ponto, você precisa rotear pacotes entre as 
enp2s0 LAN ( 
enp2s0 ) e WAN ( 
enp1s0 ) e ativar 
a conversão de endereço de rede .
É fácil ativar o encaminhamento de pacotes:
 $ sudo sysctl -w net.ipv4.ip_forward=1 $ echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf 
O último comando garante que a configuração seja salva até a próxima reinicialização.A tradução de endereços de rede é outra questão, geralmente você precisa lidar com (ou melhor, combater) as 
iptables . Felizmente, a Idade da Pedra acabou, e os caras do FireHol se esforçaram bastante para adicionar o nível necessário de abstração:
 $ sudo apt-get install firehol 
FireHOL é uma linguagem de firewall segura de última geração, sua configuração é fácil de entender e acessível. Você não precisa mais escrever instruções 
iptables : o próprio arquivo de configuração é convertido em instruções 
iptables e aplicado conforme necessário. Nenhum daemon em segundo plano.
A habilitação da tradução de endereços de rede para interfaces de LAN com a adição de regras mínimas de firewall é feita elementarmente:
 $ cat /etc/firehol/firehol.conf version 6  
FireHOL é escrito por pessoas para pessoas, a documentação está aqui .Você pode verificar as configurações iniciando manualmente o 
firehol ( 
sudo firehol start ) e conectando o laptop à porta LAN: 
agora você pode ficar online se a porta WAN estiver conectada.
Antes de reiniciar, 
certifique-se de editar 
/etc/default/firehol para permitir que o FireHol inicie na inicialização:
 $ sudo sed -i -E "s/^START_FIREHOL=.+$/START_FIREHOL=YES/g" /etc/default/firehol 
Não entrarei em detalhes de toda a sintaxe do firehol , o arquivo de configuração se explica; recomendo firehol a documentação no caso de uma configuração mais complexa. Se você está realmente interessado no que o firehol fez com o iptables , digite sudo firehol status na linha de comando.Ponto de acesso sem fio
Obviamente, gerenciaremos o ponto de acesso usando o 
hostapd :
 $ sudo apt-get install hostapd 
Abaixo, você encontrará um arquivo de configuração mínimo e quase inexplicável 802.11 n / 2.4 Ghz / WPA2-AES:
 $ cat /etc/hostapd/hostapd-simple.conf  
Veja hostpad.conf documentação em /usr/share/doc/hostapd/examples/hostapd.conf .
A configuração descrita pode ser testada manualmente:
 $ sudo hostapd /etc/hostapd/hostapd-simple.conf 
Se tudo correr bem, uma 
conexão sem fio será exibida . Se você estiver satisfeito com o resultado, 
não esqueça de alterar a configuração para iniciar o 
hostapd assim que a interface subir (como mostrado abaixo).
Aqui está o seu /etc/network/interfaces: final /etc/network/interfaces: $ cat /etc/network/interfaces  
Configurando um ponto de acesso 802.11ac (5 GHz)
Varredura passiva
De acordo com a documentação 
Airetos AEX-QCA9880-NX , o chipset suporta 802.11ac, para que possamos deixar os canais de 2,4 GHz lotados no paraíso de 5 GHz.
Vamos ver quais frequências são suportadas:
 $ iw list ... Frequencies: * 2412 MHz [1] (20.0 dBm) * 2417 MHz [2] (20.0 dBm) * 2422 MHz [3] (20.0 dBm) * 2427 MHz [4] (20.0 dBm) * 2432 MHz [5] (20.0 dBm) * 2437 MHz [6] (20.0 dBm) * 2442 MHz [7] (20.0 dBm) * 2447 MHz [8] (20.0 dBm) * 2452 MHz [9] (20.0 dBm) * 2457 MHz [10] (20.0 dBm) * 2462 MHz [11] (20.0 dBm) * 2467 MHz [12] (disabled) * 2472 MHz [13] (disabled) * 2484 MHz [14] (disabled) ... Frequencies: * 5180 MHz [36] (17.0 dBm) (no IR) * 5200 MHz [40] (17.0 dBm) (no IR) * 5220 MHz [44] (17.0 dBm) (no IR) * 5240 MHz [48] (17.0 dBm) (no IR) * 5260 MHz [52] (23.0 dBm) (no IR, radar detection) * 5280 MHz [56] (23.0 dBm) (no IR, radar detection) * 5300 MHz [60] (23.0 dBm) (no IR, radar detection) * 5320 MHz [64] (23.0 dBm) (no IR, radar detection) * 5500 MHz [100] (23.0 dBm) (no IR, radar detection) * 5520 MHz [104] (23.0 dBm) (no IR, radar detection) * 5540 MHz [108] (23.0 dBm) (no IR, radar detection) * 5560 MHz [112] (23.0 dBm) (no IR, radar detection) * 5580 MHz [116] (23.0 dBm) (no IR, radar detection) * 5600 MHz [120] (23.0 dBm) (no IR, radar detection) * 5620 MHz [124] (23.0 dBm) (no IR, radar detection) * 5640 MHz [128] (23.0 dBm) (no IR, radar detection) * 5660 MHz [132] (23.0 dBm) (no IR, radar detection) * 5680 MHz [136] (23.0 dBm) (no IR, radar detection) * 5700 MHz [140] (23.0 dBm) (no IR, radar detection) * 5720 MHz [144] (23.0 dBm) (no IR, radar detection) * 5745 MHz [149] (30.0 dBm) (no IR) * 5765 MHz [153] (30.0 dBm) (no IR) * 5785 MHz [157] (30.0 dBm) (no IR) * 5805 MHz [161] (30.0 dBm) (no IR) * 5825 MHz [165] (30.0 dBm) (no IR) ... 
Na lista acima, vemos que o chipset suporta os canais 1-14 (2,4 GHz) e os canais 36-165 (5 GHz), mas você notou a sinalização de 
no IR ?
O sinalizador 
no IR indica 
radiação não iniciada (isto é, 
varredura passiva ). Isso significa que este modo é proibido no caso em que o dispositivo é o primeiro a iniciar radiação (incluindo 
sinalizadores ). Em outras palavras, 
você não pode executar o ponto de acesso nesses canais !
Requisitos regulatórios
A situação acima é explicada pelos 
requisitos regulamentares do Linux , que regulam o uso do espectro de radiofrequências, 
dependendo do país .
Mas ei!
Eu moro nos EUA, e o link diz que tenho o direito de iniciar a radiação nos canais 36-48, então qual é o problema? Vamos ver qual domínio regulatório está atualmente em uso:
 $ iw reg get country 00: DFS-UNSET (2402 - 2472 @ 40), (N/A, 20), (N/A) (2457 - 2482 @ 40), (N/A, 20), (N/A), NO-IR (2474 - 2494 @ 20), (N/A, 20), (N/A), NO-OFDM, NO-IR (5170 - 5250 @ 80), (N/A, 20), (N/A), NO-IR (5250 - 5330 @ 80), (N/A, 20), (0 ms), DFS, NO-IR (5490 - 5730 @ 160), (N/A, 20), (0 ms), DFS, NO-IR (5735 - 5835 @ 80), (N/A, 20), (N/A), NO-IR (57240 - 63720 @ 2160), (N/A, 0), (N/A) 
O problema mostra que o domínio 
mundial está atualmente ativo (ou não instalado), ou seja, os 
valores mínimos permitidos em cada país .
Infelizmente, você não pode instalar manualmente o domínio 
sudo iw reg set , porque o domínio está protegido na EEPROM:
 $ dmesg | grep EEPROM [ 12.123068] ath: EEPROM regdomain: 0x6c 
Patch!
Felizmente, os requisitos regulatórios são processados no nível do driver, para que possam ser facilmente alterados: encontramos o patch no 
código-fonte do 
Open-WRT .
Antes de tudo, não se esqueça de conectar o repositório de código fonte em 
/etc/apt/sources.list :
 $ cat /etc/apt/sources.list ... deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main restricted ... 
Em seguida, prepare o ambiente instalando as dependências necessárias:
 $ sudo apt-get install build-essential fakeroot $ sudo apt-get build-dep linux 
Faça o download das fontes do seu kernel:
 $ apt-get source linux 
Como o patch 
original do Open-WRT não pode ser aplicado "como está" na árvore do kernel do Ubuntu devido a diferenças sutis no sistema de compilação, eu tive que corrigi-lo:
 $ VERSION=$(uname -r) $ cd linux-${VERSION%%-*} $ wget -O - https://gist.github.com/renaudcerrato/02de8b2e8dc013bc71326defd2ef062c/raw/a2db325e520e6442c8c12f7599d64ac1b7596a3e/402-ath_regd_optional.patch | patch -p1 -b 
Tudo está pronto para montagem:
 $ fakeroot debian/rules clean $ fakeroot debian/rules binary-generic 
Se não houver problemas, agora você pode instalar o kernel fixo em cima do anterior:
 $ cd .. $ sudo dpkg -i linux*.deb 
Reinicialize e pronto:
 $ sudo iw reg set US $ iw list ... Frequencies: * 5180 MHz [36] (17.0 dBm) * 5200 MHz [40] (17.0 dBm) * 5220 MHz [44] (17.0 dBm) * 5240 MHz [48] (17.0 dBm) * 5260 MHz [52] (23.0 dBm) (radar detection) * 5280 MHz [56] (23.0 dBm) (radar detection) * 5300 MHz [60] (23.0 dBm) (radar detection) * 5320 MHz [64] (23.0 dBm) (radar detection) * 5500 MHz [100] (23.0 dBm) (radar detection) * 5520 MHz [104] (23.0 dBm) (radar detection) * 5540 MHz [108] (23.0 dBm) (radar detection) * 5560 MHz [112] (23.0 dBm) (radar detection) * 5580 MHz [116] (23.0 dBm) (radar detection) * 5600 MHz [120] (23.0 dBm) (radar detection) * 5620 MHz [124] (23.0 dBm) (radar detection) * 5640 MHz [128] (23.0 dBm) (radar detection) * 5660 MHz [132] (23.0 dBm) (radar detection) * 5680 MHz [136] (23.0 dBm) (radar detection) * 5700 MHz [140] (23.0 dBm) (radar detection) * 5720 MHz [144] (23.0 dBm) (radar detection) * 5745 MHz [149] (30.0 dBm) * 5765 MHz [153] (30.0 dBm) * 5785 MHz [157] (30.0 dBm) * 5805 MHz [161] (30.0 dBm) * 5825 MHz [165] (30.0 dBm) ... 
Para evitar atualizações automáticas, pode ser necessário corrigir a versão do kernel do Linux .Configuração
O novo 
hostapd configuração do 
hostapd será bastante simples: 
hw_mode=a inclui bandas de 5 GHz e 
ieee80211ac=1 inclui 802.11ac (VHT). A opção 
ieee80211d=1 com 
country_code=US especifica o domínio regulatório sob o qual operamos.
Para aproveitar ao máximo a largura de banda, 
ht_capab e 
vht_capab devem refletir os recursos do equipamento:
 $ iw list ... Band 1: Capabilities: 0x19e3 RX LDPC HT20/HT40 Static SM Power Save RX HT20 SGI RX HT40 SGI TX STBC RX STBC 1-stream Max AMSDU length: 7935 bytes DSSS/CCK HT40 ... Band 2: VHT Capabilities (0x338001b2): Max MPDU length: 11454 Supported Channel Width: neither 160 nor 80+80 RX LDPC short GI (80 MHz) TX STBC RX antenna pattern consistency TX antenna pattern consistency 
Com isso em mente, 
aqui está o hostapd.conf final :
 $ cat /etc/hostapd/hostapd.conf  
Veja hostpad.conf documentação em /usr/share/doc/hostapd/examples/hostapd.conf .
Nesse ponto, o roteador sem fio está totalmente operacional e, se você precisar de uma configuração mais complexa, poderá agora mergulhar nos arquivos de configuração.
Configurando um SSID virtual usando o hostapd
Independentemente de você desejar configurar um ponto de acesso de convidado ou uma rede sem fio dedicada para sua VPN, em algum momento você precisará configurar um SSID virtual.
Gráfico
Com base na 
configuração atual , aqui está um diagrama atualizado do que queremos obter. Supondo que 
wlp5s0 é a interface sem fio física, o SSID virtual será executado na interface virtual 
wlan0 usando sua própria sub-rede 
192.168.2.0/24 :

Preparação
Primeiro, verifique se o seu dispositivo sem fio suporta vários SSIDs:
 $ iw list ... valid interface combinations: *  
Como você pode ver, o chipset suporta até oito pontos de acesso em um canal. Isso significa que você pode configurar até sete SSIDs virtuais e todos eles funcionarão no mesmo canal.
Interface de rede
De acordo com a documentação em hostapd.conf, há uma conexão estrita entre o endereço MAC da interface física e o BSSID das interfaces virtuais:
O hostapd irá gerar uma máscara BSSID baseada nos BSSIDs configurados. O hostapd verificará se dev_addr & MASK == dev_addr . Se não for esse o caso, o endereço MAC do rádio deve ser alterado antes de iniciar o hostapd. Se um BSSID estiver configurado para cada BSS secundário, essa limitação não será aplicada no hostapd e outras máscaras poderão ser usadas se o driver as suportar (por exemplo, troque o bit administrado localmente)
Os BSSIDs são atribuídos em ordem a cada BSS, a menos que um BSSID explícito seja especificado usando o parâmetro 'bssid'.
Se um BSSID explícito for especificado, ele deverá ser escolhido de forma que:
- resulta em uma máscara válida que a cobre e o dev_addr
- não é o mesmo que o endereço MAC do rádio
- não é o mesmo que qualquer outro BSSID explicitamente especificado
Para atender a esses requisitos e permitir que o 
hostapd atribua automaticamente o BSSID da (s) interface (s) virtual (is), atualizamos o endereço MAC da interface física sem fio, zerando os quatro bits menos significativos. Isso é suficiente para 15 BSSIDs virtuais - muito mais que o necessário.
Primeiro, determine o endereço MAC atual:
 $ ip addr show wlp5s0 | grep link | awk '{print $2}' 44:c3:06:00:03:eb 
Se você limpar os últimos quatro bits e definir o 
U / L , obterá o endereço MAC 
46:c3:06:00:03:e0 .
Agora, atualizaremos a configuração para definir o endereço MAC correto antes de carregar a interface e também declararemos uma interface sem fio virtual de acordo com nosso diagrama:
 $ cat /etc/network/interfaces ...  
Ótimo. Eu uso o 
dnsmasq como um servidor DHCP - 
dnsmasq à vontade para substituir o que quiser. Observe que, para que a interface virtual funcione corretamente, é necessário o 
allow-hotplug .
Configuração do ponto de acesso
Agora, a coisa mais simples: adicione um SSID virtual à configuração atual do 
hostapd . Basta adicionar isso 
ao final do arquivo 
hostapd.conf existente:
 $ cat /etc/hostapd/hostapd.conf ...  
No exemplo, usei a criptografia WPA2, mas a maioria das opções de interface de rádio está disponível aqui (por exemplo, 
channel ). Você pode adicionar mais SSIDs virtuais simplesmente adicionando as linhas no arquivo de configuração de acordo com as interfaces virtuais declaradas e configuradas corretamente.
Agora reinicie - e veja seu novo SSID junto com a nova interface sem fio (preste atenção ao endereço MAC):
 $ ip addr show wlan0 | grep link | awk '{print $2}' 46:c3:06:00:03:e1 
É isso aí pessoal!