Raspberry Pi + CentOS = Hotspot Wi-Fi (ou roteador framboesa de chapéu vermelho)

Na Internet há uma enorme quantidade de informações sobre como criar pontos de acesso Wi-Fi usando um PC de placa única Raspberry. Geralmente, isso implica o uso do sistema operacional nativo da 'frambuesa' — Raspbian.

Sendo um defensor de sistemas baseados em RPM, não pude deixar de experimentar esta pequena maravilha com meu amado CentOS.

Este artigo apresenta um guia para fabricar um roteador Wi-Fi 5GHz/AC a partir do Raspberry Pi 3 Model B+ usando o sistema operacional CentOS. Incluirá alguns truques padrão, mas pouco conhecidos, e como bônus, um diagrama de conexão para equipamentos Wi-Fi adicionais 'frambuesa', permitindo que ele funcione simultaneamente em vários modos (2,4+5GHz).

Raspberry Pi + CentOS = Hotspot Wi-Fi (ou roteador framboesa de chapéu vermelho)
(mix de imagens de acesso livre)

Cabe destacar desde já que não se obterá velocidades incríveis. Estou conseguindo extrair do meu 'frambuesa' no máximo 100 Mbps sem fio, e isso cobre a velocidade do meu provedor de Internet. Para que serve esse AC tão fraco, se mesmo em N é teoricamente possível alcançar meio gigabit? Se você se fez essa pergunta, então vá à loja e compre um roteador de verdade com oito antenas externas.

0. O que será necessário

  • Na verdade, a 'peça frambuesa' é o modelo: Pi 3 Model B+ (para atingir as almejadas velocidades e canais de 5GHz);
  • Um bom microSD >= 4GB;
  • Uma estação de trabalho com Linux e um leitor/gravador de microSD;
  • Ter habilidades adequadas em Linux, este artigo — para um Geek preparado;
  • Conexão de rede com fio (eth0) entre o Raspberry e o Linux, com um servidor DHCP funcionando na rede local e acesso à Internet em ambos os dispositivos.

Um pequeno comentário sobre o último ponto. 'O que surgiu primeiro, o ovo ou...' como fazer um roteador Wi-Fi na ausência de qualquer equipamento de acesso à Internet? Deixaremos esse exercício interessante de lado e apenas vamos supor que o Raspberry está conectado à rede local por cabo e tem acesso à Internet. Nesse caso, não precisamos de uma televisão ou um dispositivo de controle para configurar a 'frambuesa'.

1. Instalação do CentOS

Página inicial do projeto

No momento da escrita deste artigo, a versão do CentOS em funcionamento no dispositivo é a de 32 bits. Em algum lugar na vastidão da rede mundial, encontrei opiniões sobre uma redução de desempenho de tais sistemas em arquitetura ARM de 64 bits de até 20%. Vou deixar esse ponto sem comentários.

No Linux, baixamos a imagem mínima com o núcleo '-RaspberryPI-» e gravamos no microSD:

# xzcat CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz | 
  dd of=/dev/mmcblk0 bs=4M
# sync

Antes de começar a usar a imagem, removeremos a partição SWAP, ampliaremos a raiz para todo o espaço disponível e desativaremos o SELinux. O algoritmo é simples: fazemos uma cópia da raiz no Linux, removemos todas as partições do microSD, exceto a primeira (\boot), criamos uma nova raiz e restauramos seu conteúdo da cópia.

Exemplo das ações necessárias (saída bruta do console)

# mount /dev/mmcblk0p3 /mnt
# cd /mnt
# tar cfz ~/pi.tgz . --no-selinux
# cd
# umount /mnt

# parted /dev/mmcblk0

(parted) unit s
(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system     Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32           boot, lba
 2      1370112s  2369535s   999424s    primary  linux-swap(v1)
 3      2369536s  5298175s   2928640s   primary  ext4
        5298176s  31116287s  25818112s           Free Space

(parted) rm 3
(parted) rm 2

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
        1370112s  31116287s  29746176s           Free Space

(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? ext4
Start? 1370112s
End? 31116287s

(parted) set
Partition number? 2
Flag to Invert? lba
New state?  on/[off]? off

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
 2      1370112s  31116287s  29746176s  primary  ext4

(parted) quit

# mkfs.ext4 /dev/mmcblk0p2 
mke2fs 1.44.6 (5-Mar-2019)
/dev/mmcblk0p2 contains a swap file system labelled '_swap'
Proceed anyway? (y,N) y
Discarding device blocks: done                            
Creating filesystem with 3718272 4k blocks and 930240 inodes
Filesystem UUID: 6a1a0694-8196-4724-a58d-edde1f189b31
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done   

# mount /dev/mmcblk0p2 /mnt
# tar xfz ~/pi.tgz -C /mnt --no-selinux

Após extrair o conteúdo da partição raiz, é hora de fazer algumas alterações.

Desativamos o SELinux em /mnt/etc/selinux/config:

Para desativá-lo, altere a configuração SELINUX da seguinte forma:

Editamos /mnt/etc/fstab, mantendo apenas duas entradas para as partições: a de inicialização (\boot, sem alterações) e a raiz (alteramos o valor UUID, que pode ser encontrado examinando a saída do comando blkid no Linux):

UUID=6a1a0694-8196-4724-a58d-edde1f189b31  \     ext4    defaults,noatime 0 0
UUID=6938-F4F2                             \boot vfat    defaults,noatime 0 0

Finalmente, alteramos os parâmetros de inicialização do kernel: indicamos o novo local da partição raiz, desativamos a saída de informações de depuração e (opcionalmente) proibimos o kernel de atribuir endereços IPv6 nas interfaces de rede:

# cd
# umount /mnt
# mount /dev/mmcblk0p1 /mnt

Trazemos o conteúdo /mnt/cmdline.txt para o seguinte formato (uma linha sem quebras):

root=\dev\mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet ipv6.disable_ipv6=1

Pronto:

# cd
# umount /mnt
# sync

Recolocamos o microSD na ‘Raspberry’, ligamos e obtemos acesso à rede via ssh (root\/centos).

2. Configuração do CentOS

Os primeiros três movimentos inabaláveis: passwd, yum -y update, reiniciar.

A gestão de rede será feita pelo networkd:

# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off

Criamos um arquivo (junto com os diretórios) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Reiniciamos a ‘Raspberry’ e novamente obtemos acesso à rede via ssh (o endereço IP pode mudar). Observe que está sendo usado /etc/resolv.conf, criado anteriormente pelo Network Manager. Portanto, em caso de problemas com a resolução, edite seu conteúdo. Não vamos usar systemd-resolved não iremos.

Removemos o ‘excesso’, consertamos e aceleramos a inicialização do SO:

# systemctl set-default multi-user.target
# yum remove GeoIP Network* aic* alsa* cloud-utils-growpart 
  cronie* dhc* firewal* initscripts iwl* kexec* logrotate 
  postfix rsyslog selinux-pol* teamd wpa_supplicant

Quem precisa de cron e quem não tolera os timers do systemd, podem instalar o que falta. /var/log-e vemos através de journalctl. Se for necessário o histórico do log (por padrão, só são armazenadas informações desde o início do sistema):

# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf

Desativamos o uso do IPv6 pelos principais serviços (se necessário)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

A precisão do tempo na ‘Raspberry’ é uma coisa importante. Como ‘de fábrica’ não há capacidade de hardware para manter o estado atual do relógio após a reinicialização, precisamos de sincronização. Um ótimo e rápido daemon para isso é — chrony — já está instalado e inicia automaticamente. É possível alterar os servidores NTP para os mais próximos.

/etc/chrony.conf:

server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

Para definir o fuso horário, vamos usar um truque. Como nosso objetivo é criar um roteador Wi-Fi que funcione nas frequências de 5GHz, vamos nos preparar para surpresas. regulador:

# yum info crda
Resumo: Daemon de conformidade regulatória para redes sem fio 802.11

Essa construção maliciosa, levando em consideração também o fuso horário, "proíbe" o uso (na Rússia) de frequências e canais de 5GHz com "números grandes". O truque é configurar o fuso horário sem usar os nomes de continentes/cidades, ou seja, em vez de:

# timedatectl set-timezone Europe/Moscow

Vamos pressionar:

# timedatectl set-timezone Etc/GMT-3

E os toques finais na configuração do sistema:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Ambiente específico do usuário e programas de inicialização

export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin

3. Complementos CentOS

Tudo que foi dito acima pode ser considerado um guia completo para a instalação do CentOS 'vanilla' no Raspberry Pi. Você deve ter um PC que (re)inicia em menos de 10 segundos, usa menos de 15 Megabytes de memória RAM e 1.5 Gigabytes de microSD (na verdade, menos de 1 Gigabyte devido à partição /boot incompleta, mas sejamos honestos até o fim).

Para instalar o software do ponto de acesso Wi-Fi nesse sistema, será necessário expandir um pouco as capacidades do distribuidor padrão do CentOS. Primeiro de tudo, vamos "melhorar" o driver (firmware) do adaptador Wi-Fi embutido. Na página inicial do projeto, está escrito:

Wifi no Raspberry 3B e 3B+

Os arquivos de firmware do Raspberry PI 3B/3B+ não podem ser distribuídos pelo Projeto CentOS. Você pode usar os seguintes artigos para entender o problema, obter o firmware e configurar o wifi.

O que não é permitido ao projeto CentOS, não nos é proibido para uso pessoal. Substituímos o firmware Wi-Fi do distribuidor no CentOS pelo correspondente dos desenvolvedores Broadcom (aqueles odiados blobs binários…). Isso, em particular, permitirá usar o AC em modo de ponto de acesso.

Atualização do firmware Wi-FiIdentificamos o modelo do dispositivo e a versão atual do firmware:

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Mar  1 2015 07:29:38 version 7.45.18 (r538002) FWID 01-6a2c8ad4
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 7.14.8 Compiler: 1.24.9 ClmImport: 1.24.9 Creation: 2014-09-02 03:05:33 Inc Data: 7.17.1 Inc Compiler: 1.26.11 Inc ClmImport: 1.26.11 Creation: 2015-03-01 07:22:34 

Vemos que a versão do firmware é 7.45.18 de 01.03.2015, e memorizamos o seguinte conjunto de números: 43455 (brcmfmac43455-sdio.bin).

Baixe a imagem atual do Raspbian. Os preguiçosos podem gravar a imagem em microSD e pegar os arquivos de firmware a partir de lá. Ou pode-se montar a partição raiz da imagem no Linux e copiar o que precisa dela:

# wget https://downloads.raspberrypi.org/raspbian_lite_latest
# unzip -p raspbian_lite_latest > raspbian.img
# fdisk -l raspbian.img
Disk raspbian.img: 2 GiB, 2197815296 bytes, 4292608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x17869b7d

Device        Boot  Start     End Sectors  Size Id Type
raspbian.img1        8192  532480  524289  256M  c W95 FAT32 (LBA)
raspbian.img2      540672 4292607 3751936  1.8G 83 Linux

# mount -t ext4 -o loop,offset=$((540672 * 512)) raspbian.img /mnt
# cp -fv /mnt/lib/firmware/brcm/*43455* ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.bin' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.txt' -> ...
# umount /mnt

Os arquivos de firmware do adaptador Wi-Fi precisam ser copiados com substituição para a "frutinha" no diretório /usr/lib/firmware/brcm/

Reiniciamos o futuro roteador e sorrimos felizes:

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 9.10.105 Compiler: 1.29.4 ClmImport: 1.36.3 Creation: 2018-03-09 18:56:28 

Versão: 7.45.154 de 27.02.2018.

E, claro, EPEL:

# cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=Epel rebuild for armhfp
baseurl=https://armv7.dev.centos.org/repodir/epel-pass-1/
enabled=1
gpgcheck=0
EOF

# yum clean all
# rm -rfv /var/cache/yum
# yum update

4. Configuração de rede e dificuldades futuras

Como combinado anteriormente, a 'frambuesa' está conectada por 'cabo' à rede local. Suponhamos que o provedor também fornece acesso à Internet exatamente dessa forma: o endereço na rede pública é atribuído dinamicamente pelo servidor DHCP (pode estar vinculado ao MAC). Nesse caso, após a configuração final da 'frambuesa', basta 'plugá-la' no cabo do provedor e tudo estará pronto. A autorização através de systemd-networkd — é um tema para outro artigo e não será abordado aqui.

A interface(s) Wi-Fi do Raspberry é uma rede local e o adaptador Ethernet embutido (eth0) é externo. Vamos numerar a rede local estaticamente, por exemplo: 192.168.0.0/24. O endereço da 'frambuesa': 192.168.0.1. Na rede externa (Internet) funcionará o servidor DHCP.

O problema da uniformidade na nomeação e um conhecido programador guatemalteco — são duas dificuldades que aguardam cada um que configura interfaces de rede e serviços em distribuições systemd.

Caos paralelo (uma digressão lírica)Lennart Poettering elaborou seu programa systemd muito bem. Este systemd inicia outros programas tão rapidamente que eles, sem tempo para se recuperar do chute do juiz, tropeçam e caem na linha de partida antes mesmo de começar sua corrida com obstáculos.

Mas, falando sério, a divisão agressiva dos processos iniciados no arranque do sistema systemd é uma espécie de 'ponte de burro' para os experientes LSBistas sequenciais. Felizmente, organizar esse 'caos paralelo' é algo simples, embora nem sempre óbvio.

Criamos duas interfaces virtuais de ponte (bridge) com nomes permanentes: lan e wan. No primeiro 'conectaremos' adaptador(es) Wi-Fi, no segundo — eth0 da 'frambuesa'.

/etc/systemd/network/lan.netdev:

[NetDev]
Name=lan
Kind=bridge

/etc/systemd/network/lan.network:

[Match]
Name=lan

[Network]
Address=192.168.0.1/24
IPForward=yes

/etc/systemd/network/wan.netdev:

[NetDev]
Name=wan
Kind=bridge
#MACAddress=xx:xx:xx:xx:xx:xx

/etc/systemd/network/wan.network:

[Match]
Name=wan

[Network]
DHCP=ipv4
IPForward=yes

IPForward=yes elimina a necessidade de indicar ao kernel a ativação do roteamento através do sysctl.
MACAddress= descomentaremos e alteraremos se necessário.

Primeiro, 'conectamos' eth0. Lembramos do 'problema da uniformidade' e usamos apenas o endereço MAC dessa interface, que pode ser descoberto, por exemplo, assim:

# cat /sys/class/net/eth0/address 

Criamos /etc/systemd/network/eth.network:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Network]
Bridge=wan

Remova o arquivo de configuração anterior eth0, reinicie o Raspberry Pi e obtenha acesso à rede (o endereço IP provavelmente mudará):

# rm -fv /etc/systemd/network/eth0.network
# reboot

5. DNSMASQ

Para criar pontos de acesso Wi-Fi, nada é melhor do que a combinação doce de dnsmasq + hostapd não foi ainda inventado. Na minha opinião.

Se alguém esqueceu, então...hostapd — este é um dispositivo que gerencia adaptadores Wi-Fi (em particular, assumirá a tarefa de conectá-los ao virtual lan Raspberry Pi), autentica e registra clientes sem fio.

dnsmasq — configura a pilha de rede dos clientes: fornece endereços IP, servidores DNS, gateway padrão e outras belezas.

Começamos com dnsmasq:

# yum install dnsmasq

Modelo /etc/resolv.conf:

nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 77.88.8.8
nameserver 77.88.8.1
domain router.local
search router.local

edite conforme seu gosto.

Minimalista /etc/dnsmasq.conf:

domain-needed
bogus-priv
interface=lan
bind-dynamic
expand-hosts
domain=#
dhcp-range=192.168.0.100,192.168.0.199,255.255.255.0,24h
conf-dir=\/etc\/dnsmasq.d

A "mágica" aqui está no parâmetro bind-dynamic, que instrui o daemon dnsmasq a esperar até o aparecimento do interface=lan, ao invés de desmaiar de orgulho solitário após a inicialização.

# systemctl enable dnsmasq
# systemctl start dnsmasq; journalctl -f

6. HOSTAPD

E finalmente, as configurações mágicas do hostapd. Não tenho dúvidas de que alguém está lendo este artigo em busca exatamente dessas linhas sagradas.

Antes de instalar o hostapd, é preciso lidar com o "problema da uniformidade". O adaptador Wi-Fi embutido wlan0 pode facilmente mudar seu nome para wlan1 ao conectar um equipamento Wi-Fi USB adicional. Portanto, vamos fixar os nomes dos interfaces da seguinte forma: dê nomes únicos para os adaptadores (sem fio) e vincule-os aos endereços MAC.

Para o adaptador Wi-Fi embutido, que ainda é wlan0:

# cat /sys/class/net/wlan0/address 
b8:27:eb:xx:xx:xx

Criamos /etc/systemd/network/wl0.link:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Link]
Name=wl0

Agora teremos certeza de que wl0 — é o Wi-Fi embutido. Reinicie o Raspberry Pi para confirmar isso.

Instalando:

# yum install hostapd wireless-tools

Arquivo de configuração /etc/hostapd/hostapd.conf:

ssid=rpi
wpa_passphrase=1234567890

channel=36

country_code=US

interface=wl0
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=a
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[MAX-AMSDU-3839][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

# AC
ieee80211ac=1
require_vht=1
ieee80211d=0
ieee80211h=0
vht_capab=[MAX-AMSDU-3839][SHORT-GI-80]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42

Sem nunca esquecer do GKGChP, altere os parâmetros necessários e verifique manualmente se estão funcionando:

# hostapd /etc/hostapd/hostapd.conf

O hostapd será iniciado em modo interativo, exibindo seu estado no console. Se não houver erros, os clientes que suportam o modo AC já poderão se conectar ao ponto de acesso. Para parar o hostapd, pressione Ctrl-C.

Agora basta habilitar o hostapd para iniciar com o sistema. Se proceder de forma padrão (systemctl enable hostapd), após a próxima reinicialização, pode-se encontrar o daemon "deitado em seu próprio sangue" com o diagnóstico "interface wl0 não encontrada". Como resultado do "caos paralelo", o hostapd foi iniciado mais rapidamente do que o kernel encontrou o adaptador sem fio.

Na Internet, há muitas soluções: desde um timeout forçado antes do início do daemon (por alguns minutos) até outro daemon que monitora a aparição da interface e (re)inicia o hostapd. As soluções são funcionais, mas esteticamente horríveis. Chamamos à ajuda o grande systemd com seus "objetivos" e "tarefas" e "dependências".

Copiamos o arquivo de serviço padrão para /etc/systemd/system/hostapd.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system

e modificamos seu conteúdo para o seguinte formato:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl0.device
BindsTo=sys-subsystem-net-devices-wl0.device

[Service]
Type=forking
PIDFile=/run/hostapd.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl0.device

A mágica do arquivo de serviço atualizado reside na vinculação dinâmica do hostapd ao novo objetivo — a interface wl0. Quando a interface aparece, o daemon é iniciado, e quando desaparece, ele é interrompido. E tudo isso online — sem reiniciar o sistema. Essa técnica será especialmente útil ao conectar um adaptador Wi-Fi USB à "raspberry".

Agora podemos:

# systemctl enable hostapd
# reboot

7. IPTABLES

"O que???" © Sim, sim! Nenhum systemd. Sem novas modas ou soluções (como firewalld), que no final fazem a mesma coisa.

Usamos o antigo e bom iptables, cujo serviço, após seu início, carregará as regras de rede no kernel e terminará seu trabalho, não permanecendo residente e não consumindo recursos. O systemd tem uma elegante IPMasquerade=, mas a tradução de endereços (NAT) e o firewall deixaremos mesmo para o iptables.

Instalando:

# yum install iptables-services
# systemctl enable iptables ip6tables

Prefiro armazenar a configuração do iptables na forma de um script (exemplo):

#!/bin/bash

#
# Disable IPv6
#
ip6tables --flush
ip6tables --delete-chain

ip6tables --policy INPUT   DROP
ip6tables --policy FORWARD DROP
ip6tables --policy OUTPUT  DROP

ip6tables-save > /etc/sysconfig/ip6tables
systemctl restart ip6tables

#
# Cleaning
#
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#
# Loopback, lan
#
iptables -A INPUT -i lo  -j ACCEPT
iptables -A INPUT -i lan -j ACCEPT

#
# Ping, Established
#
iptables -A INPUT -p icmp  --icmp-type echo-request    -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# NAT
#
iptables -t nat -A POSTROUTING -o wan -j MASQUERADE

#
# Saving
#
iptables-save > /etc/sysconfig/iptables
systemctl restart iptables

Executamos o script acima e perdemos a possibilidade de estabelecer novas conexões SSH com fio com a "raspberry". Certo, criamos um roteador Wi-Fi, cujo acesso "pela Internet" está por padrão bloqueado — agora só "pelo ar". Conectamos o cabo do provedor no Ethernet e começamos a navegar!

8. Bônus: +2,4GHz

Quando segui o diagrama acima e montei o primeiro roteador Raspberry, percebi que tinha alguns dispositivos em casa que, devido a suas limitações construtivas, não conseguiam detectar o "malinó" via Wi-Fi. Reconfigurar o roteador para trabalhar no modo 802.11b/g/n não era justo, já que a velocidade máxima "sem fio" nesse caso não ultrapassava 40 Mbps, enquanto meu provedor de internet favorito me oferece 100 (por cabo).

Na verdade, a solução para o problema já havia sido encontrada: uma segunda interface Wi-Fi operando na frequência de 2,4GHz e um segundo ponto de acesso. No quiosque mais próximo, comprei não o primeiro, mas o segundo USB Wi-Fi "dongle" que encontrei. O vendedor foi bombardeado com perguntas sobre o chipset, compatibilidade com núcleos ARM Linux e a possibilidade de operar no modo AP (ele começou).

Vamos configurar o "dongle" de forma análoga ao adaptador Wi-Fi embutido.

Primeiro — vamos renomeá-lo para wl1:

# cat /sys/class/net/wlan0/address 
b0:6e:bf:xx:xx:xx

/etc/systemd/network/wl1.link:

[Match]
MACAddress=b0:6e:bf:xx:xx:xx

[Link]
Name=wl1

Vamos gerenciar a nova interface Wi-Fi com um daemon separado hostapd, que será iniciado e parado dependendo da presença do "dongle" especificamente determinado no sistema: wl1.

Arquivo de configuração /etc/hostapd/hostapd2.conf:

ssid=rpi2
wpa_passphrase=1234567890

#channel=1
#channel=6
channel=11

interface=wl1
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=g
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[HT40][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

O conteúdo deste arquivo depende diretamente do modelo do adaptador USB Wi-Fi, portanto, uma simples cópia/colagem pode te prejudicar.

Copiamos o arquivo de serviço padrão para /etc/systemd/system/hostapd2.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system/hostapd2.service

e modificamos seu conteúdo para o seguinte formato:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl1.device
BindsTo=sys-subsystem-net-devices-wl1.device

[Service]
Type=forking
PIDFile=/run/hostapd2.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd2.conf -P /run/hostapd2.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl1.device

Agora resta ativar a nova instância do hostapd:

# systemctl enable hostapd2

E isso é tudo! Teste o "dongle" e a própria "malinó", olhe as redes sem fio ao redor.

Por fim, quero alertar sobre a qualidade do adaptador USB Wi-Fi e a fonte de alimentação do Raspberry. Conectar o "dongle" enquanto está quente pode, às vezes, causar a "congelamento do malinó" devido a problemas elétricos temporários.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster