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

Há uma grande quantidade de informações na Internet sobre a criação de pontos de acesso Wi-Fi baseados em um PC de placa única Raspberry. Via de regra, isso significa usar o sistema operacional Raspbian nativo do Raspberry.

Sendo um adepto de sistemas baseados em RPM, não poderia deixar de lado esse pequeno milagre e não experimentar meu querido CentOS nele.

O artigo fornece instruções para fazer um roteador Wi-Fi de 5 GHz/AC a partir de um Raspberry Pi 3 Modelo B+ baseado no sistema operacional CentOS. Haverá vários truques padrão, mas pouco conhecidos, e como bônus - um sorteio para conectar equipamentos Wi-Fi adicionais ao Raspberry, permitindo que ele opere simultaneamente em vários modos (2,4+5GHz).

Raspberry Pi + CentOS = ponto de acesso Wi-Fi (ou roteador framboesa com chapéu vermelho)
(combinação de imagens disponíveis gratuitamente)

Notemos imediatamente que algumas velocidades cósmicas não funcionarão. Eu extraio no máximo 100 Mbps do meu Raspberry over the air, e isso cobre a velocidade do meu provedor de Internet. Por que você precisa de um AC tão lento, se em teoria você consegue meio gigabit mesmo em N? Se você já se fez essa pergunta, vá até a loja para comprar um roteador real com oito antenas externas.

0. O que você vai precisar

  • Na verdade, o “produto framboesa” em si é do calibre: Pi 3 Modelo B+ (para atingir as cobiçadas velocidades e canais de 5 GHz);
  • Bom microSD >= 4GB;
  • Estação de trabalho com leitor/gravador Linux e microSD;
  • Disponibilidade de habilidades suficientes em Linux, o artigo é para um Geek treinado;
  • Conectividade de rede cabeada (eth0) entre Raspberry e Linux, rodando servidor DHCP na rede local e acesso à Internet de ambos os dispositivos.

Um pequeno comentário sobre o último ponto. “O que veio primeiro, o ovo ou...” como fazer um roteador Wi-Fi na ausência de qualquer equipamento de acesso à Internet? Vamos deixar este exercício divertido fora do escopo do artigo e simplesmente assumir que o Raspberry está conectado à rede local por fio e tem acesso à Internet. Neste caso, não precisaremos de uma TV adicional e de um manipulador para configurar a “framboesa”.

1. Instale o CentOS

Página inicial do projeto

No momento em que este artigo foi escrito, a versão do CentOS em execução no dispositivo era de 32 bits. Em algum lugar na World Wide Web me deparei com opiniões de que o desempenho de tais sistemas operacionais na arquitetura ARM de 64 bits é reduzido em até 20%. Vou deixar este momento sem comentários.

No Linux, baixe a imagem mínima com o kernel "-Raspberry Pi-"e grave-o 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, iremos remover a partição SWAP dela, expandir a raiz para todo o volume disponível e nos livrar do SELinux. O algoritmo é simples: faça uma cópia da raiz no Linux, exclua todas as partições do microSD exceto a primeira (/boot), crie uma nova raiz e retorne seu conteúdo da cópia.

Exemplo de ações necessárias (saída grave 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

Depois de descompactar o conteúdo da partição raiz, é hora de fazer algumas alterações nela.

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

SELINUX=disabled

Edição /mnt/etc/fstab, deixando nele apenas duas entradas sobre as partições: boot (/boot, sem alterações) e root (alteramos o valor UUID, que pode ser descoberto estudando 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: especificamos um novo local para a partição raiz, desabilitamos a saída de informações de depuração e (opcionalmente) proibimos o kernel de atribuir endereços IPv6 em interfaces de rede:

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

Aqui está o conteúdo /mnt/cmdline.txt para o seguinte formato (uma linha sem hífens):

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

Feito:

# cd
# umount /mnt
# sync

Reorganizamos o microSD no “framboesa”, iniciamos e obtemos acesso de rede via ssh (root/centos).

2. Configurando o CentOS

Os três primeiros movimentos inabaláveis: passwd, yum -y atualização, reinicialização.

Distribuímos gerenciamento de rede rede:

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

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

[Match]
Name=eth0

[Network]
DHCP=ipv4

Reinicializamos o “framboesa” e novamente obtemos acesso à rede via ssh (o endereço IP pode mudar). Preste atenção no que é usado / Etc / resolv.conf, criado anteriormente pelo Network Manager. Portanto, em caso de problemas de resolução, edite seu conteúdo. Usar resolvido pelo sistema não vamos.

Removemos o “desnecessário”, reparamos e aceleramos o carregamento 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 cron e quem não digere o embutido temporizadores do sistema, pode estabelecer o que está faltando. / var / log- e olhe através jornalctl. Se você precisar de um histórico de log (por padrão, as informações são armazenadas apenas a partir do momento em que o sistema é iniciado):

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

Desative o uso de IPv6 por serviços básicos (se necessário)/ etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

A relevância do tempo na “framboesa” é uma coisa importante. Como não há capacidade de hardware para salvar o estado atual do relógio na reinicialização, a sincronização é necessária. Um daemon muito bom e rápido para isso é crony - já instalado e inicia automaticamente. Você pode 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 que usaremos truque. Como nosso objetivo é criar um roteador Wi-Fi operando nas frequências de 5 GHz, nos prepararemos para surpresas com antecedência regulador:

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

Este design maligno, também baseado no fuso horário, “proíbe” o uso (na Rússia) de frequências de 5GHz e canais com números “altos”. O truque é definir um fuso horário sem usar nomes de continentes/cidades, ou seja, em vez de:

# timedatectl set-timezone Europe/Moscow

Pressionamos:

# timedatectl set-timezone Etc/GMT-3

E os retoques finais no penteado do sistema:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# User specific environment and startup programs

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

3. Complementos CentOS

Tudo o que foi dito acima pode ser considerado instruções completas para instalação do CentOS “vanilla” no Raspberry Pi. Você deve acabar com um PC que (re)inicializa em menos de 10 segundos, usa menos de 15 Megabytes de RAM e 1.5 Gigabytes de microSD (na verdade, menos de 1 Gigabyte devido a um /boot incompleto, mas sejamos honestos).

Para instalar o software de ponto de acesso Wi-Fi neste sistema, você precisará expandir ligeiramente os recursos da distribuição padrão do CentOS. Em primeiro lugar, vamos atualizar o driver (firmware) do adaptador Wi-Fi integrado. A página inicial do projeto diz:

Wifi no Raspberry 3B e 3B+

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

O que é proibido para o projeto CentOS não é proibido para nós para uso pessoal. Substituímos o firmware Wi-Fi de distribuição no CentOS pelo correspondente dos desenvolvedores da Broadcom (aqueles mesmos odiados blobs binários...). Isto, em particular, permitirá que você use AC no modo de ponto de acesso.

Atualização de firmware Wi-FiDescubra 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 datada de 01.03.2015/XNUMX/XNUMX, e lembramos do seguinte conjunto de números: 43455 (brcmfmac43455-sdio.bin).

Baixe a imagem atual do Raspbian. Pessoas preguiçosas podem gravar a imagem no microSD e retirar os arquivos com o firmware de lá. Ou você pode montar a partição raiz da imagem no Linux e copiar o que precisa de lá:

# 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 resultantes devem ser copiados e substituídos por “raspberry” no diretório /usr/lib/firmware/brcm/

Reinicializamos o futuro roteador e sorrimos satisfeitos:

# 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/XNUMX/XNUMX.

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 da rede e desafios futuros

Conforme combinamos acima, o “framboesa” está conectado por “fio” à rede local. Suponhamos que o provedor forneça acesso à Internet exatamente da mesma forma: o endereço na rede pública é emitido dinamicamente pelo servidor DHCP (talvez com ligação MAC). Neste caso, após a configuração final do framboesa, basta “conectar” o cabo do provedor nele e pronto. Autorização usando Systemd-Networkd - o tópico de um artigo separado e não é discutido aqui.

A(s) interface(s) Wi-Fi do Raspberry é uma rede local e o adaptador Ethernet integrado (eth0) é externo. Vamos numerar a rede local estaticamente, por exemplo: 192.168.0.0/24. Endereço de framboesa: 192.168.0.1. Um servidor DHCP operará na rede externa (Internet).

Problema de consistência de nomenclatura и famoso programador guatemalteco - dois problemas que aguardam quem configura interfaces e serviços de rede em distribuições systemd.

Caos paralelo (digressão lírica)Lennart Pottering compilou seu próprio programa sistema Muito bom. Esse sistema lança outros programas tão rapidamente que, não tendo tempo de se recuperar do apito do árbitro, tropeça e cai na largada, sem sequer iniciar a pista de obstáculos.

Mas, falando sério, a paralelização agressiva de processos iniciados no início do sistema operacional systemd é uma espécie de “ponte de burro” para especialistas experientes em LSB sequencial. Felizmente, trazer ordem a este “caos paralelo” revela-se simples, embora nem sempre óbvio.

Criamos duas interfaces de ponte virtual com nomes constantes: lan и pálido. Iremos “conectar” o(s) adaptador(es) Wi-Fi ao primeiro, e o eth0 “raspberry” ao segundo.

/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=sim elimina a necessidade de dar dicas ao kernel via sysctl para habilitar o roteamento.
Endereço MAC = Vamos descomentar e alterar se necessário.

Primeiro nós “conectamos” eth0. Lembramos do “problema de uniformidade” e utilizamos apenas o endereço MAC desta interface, que pode ser descoberto, por exemplo, assim:

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

Criar /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Excluímos o arquivo de configuração anterior eth0, reinicializamos o Raspberry e obtemos acesso de rede a ele (o endereço IP provavelmente mudará):

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

5.DNSMASQ

Para criar pontos de acesso Wi-Fi, nada se compara a alguns lindos dnsmasq + hostapd ainda não descobri. Na minha opinião.

Caso alguém tenha esquecido, então...hostapd - é isso que controla os adaptadores Wi-Fi (em particular, ele se encarregará de conectá-los ao virtual lan "framboesas"), autoriza e registra clientes wireless.

dnsmasq — configura a pilha de rede de clientes: emite endereços IP, servidores DNS, gateway padrão e delícias semelhantes.

Vamos começar 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-o ao 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 vinculação dinâmica, que diz ao daemon dnsmasq para esperar até que ele apareça no sistema interface=lan, e não desmaiar devido a um ataque de orgulhosa solidão após o início.

# 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 justamente dessas preciosas linhas.

Antes de instalar o hostapd, você precisa superar o “problema de uniformidade”. O adaptador Wi-Fi integrado wlan0 pode facilmente mudar seu nome para wlan1 ao conectar equipamento USB Wi-Fi adicional. Portanto, corrigiremos os nomes das interfaces da seguinte maneira: criaremos nomes exclusivos para os adaptadores (sem fio) e os vincularemos aos endereços MAC.

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

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

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

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

[Link]
Name=wl0

Agora teremos certeza de que wl0 - Este é o Wi-Fi integrado. Reinicializamos o Raspberry para ter certeza disso.

Instalar:

# 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 esquecer por um momento GKChP, altere os parâmetros necessários e verifique manualmente a funcionalidade:

# hostapd /etc/hostapd/hostapd.conf

hostapd iniciará em modo interativo, transmitindo seu estado para o console. Se não houver erros, os clientes que suportam o modo AC poderão se conectar ao ponto de acesso. Para parar o hostapd - Ctrl-C.

Resta apenas habilitar o hostapd na inicialização do sistema. Se você fizer o procedimento padrão (systemctl enable hostapd), após a próxima reinicialização você poderá obter um demônio “rolando em sangue” com o diagnóstico “interface wl0 não encontrada". Como resultado do “caos paralelo”, o hostapd foi iniciado mais rápido do que o kernel encontrou o adaptador sem fio.

A Internet está cheia de soluções: desde um tempo limite forçado antes de iniciar o daemon (vários minutos), até outro daemon que monitora a aparência da interface e (re)inicia o hostpad. As soluções são bastante viáveis, mas terrivelmente feias. Pedimos ajuda ao grande sistema com seus “objetivos” e “tarefas” e “dependências”.

Copie o arquivo do serviço de distribuição para /etc/systemd/system/hostapd.service:

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

e reduza seu conteúdo para a seguinte forma:

[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 magia do arquivo de serviço atualizado está na ligação dinâmica do hostapd ao novo destino - a interface wl0. Quando a interface aparece, o daemon é iniciado; quando desaparece, ele para. E tudo isso online - sem reiniciar o sistema. Esta técnica será especialmente útil ao conectar um adaptador USB Wi-Fi a um Raspberry.

Agora você pode:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Wha???" © Sim, sim! Nenhum sistema. Nenhuma combinação moderna (na forma firewalld), que acabam fazendo a mesma coisa.

Vamos usar o bom e velho iptables, cujos serviços, após serem iniciados, carregarão as regras de rede no kernel e serão encerrados silenciosamente, sem permanecerem residentes e sem consumir recursos. systemd tem um elegante Máscara IP=, mas ainda confiaremos a tradução de endereços (NAT) e o firewall ao iptables.

Instalar:

# yum install iptables-services
# systemctl enable iptables ip6tables

Prefiro armazenar a configuração do iptables como 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 capacidade de estabelecer novas conexões SSH com fio com o Raspberry. Isso mesmo, fizemos um roteador Wi-Fi, cujo acesso “via Internet” é proibido por padrão - agora apenas “over the air”. Conectamos o cabo Ethernet do provedor e começamos a navegar!

8. Bônus: +2,4 GHz

Quando montei o primeiro roteador Raspberry usando o desenho descrito acima, descobri vários gadgets em minha casa que, devido às limitações de design do Wi-Fi, não conseguiam ver o “framboesa”. Reconfigurar o roteador para funcionar em 802.11b/g/n foi antiesportivo, já que a velocidade máxima “over the air” neste caso não ultrapassava 40 Mbit, e meu provedor de Internet favorito me oferece 100 (via cabo).

Na verdade, uma solução para o problema já foi inventada: uma segunda interface Wi-Fi operando na frequência de 2,4 GHz e um segundo ponto de acesso. Em uma barraca próxima, comprei não o primeiro, mas o segundo “apito” de Wi-Fi USB que encontrei. O vendedor foi atormentado por dúvidas sobre o chipset, compatibilidade com kernels ARM Linux e a possibilidade de trabalhar em modo AP (ele foi o primeiro a começar).

Configuramos o “apito” por analogia com o adaptador Wi-Fi integrado.

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

Confiaremos o gerenciamento da nova interface Wi-Fi a um daemon hostapd separado, que será iniciado e interrompido dependendo da presença de um “apito” estritamente definido 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, copiar/colar banal pode falhar.

Copie o arquivo do serviço de distribuição para /etc/systemd/system/hostapd2.service:

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

e reduza seu conteúdo para a seguinte forma:

[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

Resta apenas habilitar uma nova instância do hostapd:

# systemctl enable hostapd2

Isso é tudo! Puxe o “apito” e a própria “framboesa”, observe as redes sem fio ao seu redor.

E por fim, quero alertar sobre a qualidade do adaptador USB Wi-Fi e da fonte de alimentação do Raspberry. O “apito quente” conectado às vezes pode causar “congelamento de framboesa” devido a problemas elétricos de curto prazo.

Fonte: habr.com

Adicionar um comentário