Raspberry Pi + CentOS = Wi-Fi Hotspot (ou enrutador de framboesa cun sombreiro vermello)

Hai unha gran cantidade de información en Internet sobre a creación de puntos de acceso Wi-Fi baseados nun PC de placa única Raspberry. Como regra xeral, isto significa usar o sistema operativo Raspbian nativo de Raspberry.

Sendo un adepto dos sistemas baseados en RPM, non podía pasar por alto este pequeno milagre e non probar o meu querido CentOS.

O artigo ofrece instrucións para facer un enrutador Wi-Fi de 5 GHz/AC a partir dun Raspberry Pi 3 Modelo B+ baseado no sistema operativo CentOS. Haberá varios trucos estándar pero pouco coñecidos e, como extra, un debuxo para conectar equipos Wi-Fi adicionais ao Raspberry, o que lle permitirá funcionar simultaneamente en varios modos (2,4 + 5 GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (ou enrutador de framboesa cun sombreiro vermello)
(mestura de imaxes dispoñibles libremente)

Notemos de inmediato que algunhas velocidades cósmicas non funcionarán. Saco un máximo de 100 Mbps do meu Raspberry ao aire, e isto cobre a velocidade do meu provedor de Internet. Por que necesitas un AC tan lento, se en teoría podes conseguir medio gigabit incluso en N? Se te fixeches esta pregunta, vai á tenda para mercar un enrutador real con oito antenas externas.

0. O que necesitarás

  • En realidade, o propio "produto de framboesa" é de calibre: Pi 3 Model B+ (para acadar as ansiadas velocidades e canles de 5GHz);
  • Boa microSD >= 4 GB;
  • Estación de traballo con lector/escritor Linux e microSD;
  • Dispoñibilidade de habilidades suficientes en Linux, o artigo é para un Geek adestrado;
  • Conectividade de rede por cable (eth0) entre Raspberry e Linux, executando o servidor DHCP na rede local e acceso a Internet desde ambos os dispositivos.

Un pequeno comentario sobre o último punto. "Que foi primeiro, o ovo ou..." como facer un router Wi-Fi sen ningún equipo de acceso a Internet? Deixemos este entretido exercicio fóra do alcance do artigo e simplemente supoñamos que o Raspberry está conectado á rede local por cable e ten acceso a Internet. Neste caso, non necesitaremos un televisor adicional e un manipulador para configurar a "framboesa".

1. Instala CentOS

Páxina de inicio do proxecto

No momento de escribir este artigo, a versión en execución de CentOS no dispositivo é de 32 bits. Nalgún lugar da World Wide Web atopeime con opinións de que o rendemento deste tipo de sistemas operativos na arquitectura ARM de 64 bits redúcese ata un 20%. Vou deixar este momento sen comentarios.

En Linux, descarga a imaxe mínima co núcleo "-RaspberryPI-"e escríbeo na microSD:

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

Antes de comezar a usar a imaxe, eliminaremos dela a partición SWAP, expandiremos a raíz a todo o volume dispoñible e desfaceremos SELinux. O algoritmo é sinxelo: fai unha copia da raíz en Linux, elimina todas as particións da microSD excepto a primeira (/boot), crea unha nova raíz e devolve o seu contido desde a copia.

Exemplo de accións requiridas (saída severa da consola)

# 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

Despois de desempaquetar o contido da partición raíz, é hora de facerlle algúns cambios.

Desactivar SELinux en /mnt/etc/selinux/config:

SELINUX=disabled

Edición /mnt/etc/fstab, deixando nel só dúas entradas sobre as particións: boot (/boot, sen cambios) e root (cambiamos o valor UUID, que se pode descubrir estudando a saída do comando blkid en Linux):

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

Finalmente, cambiamos os parámetros de arranque do núcleo: especificamos unha nova localización para a partición raíz, desactivamos a saída da información de depuración e (opcionalmente) prohibimos que o núcleo asigne enderezos IPv6 nas interfaces de rede:

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

Aquí está o contido /mnt/cmdline.txt á seguinte forma (unha liña sen guións):

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

Feito:

# cd
# umount /mnt
# sync

Reorganizamos a microSD na "framboesa", lanzámola e accedemos á rede a través de ssh (root/centos).

2. Configurando CentOS

Os tres primeiros movementos inquebrantables: passwd, yum e actualización, reinicio.

Regalamos xestión de rede en rede:

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

Crear un ficheiro (xunto cos directorios) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Reiniciamos a "framboesa" e de novo accedemos á rede a través de ssh (o enderezo IP pode cambiar). Presta atención ao que se usa /etc/resolv.conf, creado anteriormente por Network Manager. Polo tanto, en caso de problemas coa resolución, edite o seu contido. Use resolto por sistema non o faremos.

Eliminamos o "innecesario", reparamos e aceleramos a carga 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

Quen precisa cron e quen non dixire o incorporado temporizadores systemd, pode establecer o que falta. / Var / log- e mira a través diarioctl. Se precisa o historial de rexistro (por defecto, a información só se almacena desde o momento en que se inicia o sistema):

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

Desactivar o uso de IPv6 polos servizos básicos (se é necesario)/ etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

A relevancia do tempo na "framboesa" é unha cousa importante. Xa que fóra da caixa non hai capacidade de hardware para gardar o estado actual do reloxo ao reiniciar, é necesaria a sincronización. Un daemon moi bo e rápido para isto é cronía - xa instalado e comeza automaticamente. Podes cambiar os servidores NTP polos máis 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 establecer o fuso horario utilizaremos truco. Dado que o noso obxectivo é crear un enrutador Wi-Fi que funcione en frecuencias de 5 GHz, prepararemos sorpresas con antelación regulador:

# ñam información crda
Resumo: daemon de conformidade normativa para redes sen fíos 802.11

Este deseño malvado, tamén baseado no fuso horario, "prohibe" o uso (en Rusia) de frecuencias de 5GHz e canles con números "altos". O truco é establecer unha zona horaria sen usar os nomes de continentes/cidades, é dicir, en lugar de:

# timedatectl set-timezone Europe/Moscow

Prememos:

# timedatectl set-timezone Etc/GMT-3

E os últimos retoques ao peiteado 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 de CentOS

Todo o que se dixo anteriormente pode considerarse instrucións completas para instalar CentOS "vainilla" no Raspberry Pi. Deberías ter un PC que (re)inicia en menos de 10 segundos, usa menos de 15 megabytes de RAM e 1.5 gigabytes de microSD (en realidade menos de 1 gigabyte debido a un /boot incompleto, pero sexamos sinceros).

Para instalar o software de punto de acceso Wi-Fi neste sistema, terás que ampliar lixeiramente as capacidades da distribución estándar de CentOS. Primeiro de todo, imos actualizar o controlador (firmware) do adaptador Wi-Fi integrado. A páxina de inicio do proxecto di:

Wifi nos Raspberry 3B e 3B+

Os ficheiros de firmware Raspberry PI 3B/3B+ non poden ser distribuídos polo Proxecto CentOS. Podes usar os seguintes artigos para comprender o problema, obter o firmware e configurar a wifi.

O que está prohibido para o proxecto CentOS non está prohibido para nós para uso persoal. Substituímos o firmware de distribución Wi-Fi en CentOS polo correspondente dos desenvolvedores de Broadcom (eses mesmos odiados blobs binarios...). Isto, en particular, permitirache usar AC no modo de punto de acceso.

Actualización do firmware Wi-FiDescubra o modelo do dispositivo e a versión actual 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 versión do firmware é a 7.45.18 do 01.03.2015/XNUMX/XNUMX e lembramos o seguinte conxunto de números: 43455 (brcmfmac43455-sdio.bin).

Descarga a imaxe actual de Raspbian. Os preguiceiros poden escribir a imaxe na microSD e levar os ficheiros co firmware desde alí. Ou podes montar a partición raíz da imaxe en Linux e copiar o que necesites desde alí:

# 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 ficheiros de firmware do adaptador Wi-Fi resultantes deben ser copiados e substituídos por "framboesa" no directorio /usr/lib/firmware/brcm/

Reiniciamos o futuro enrutador 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 

Versión: 7.45.154 do 27.02.2018/XNUMX/XNUMX.

E por suposto 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. Configuración da rede e retos por diante

Como acordamos anteriormente, a "framboesa" está conectada por "cable" á rede local. Supoñamos que o provedor proporciona acceso a Internet exactamente do mesmo xeito: o enderezo da rede pública é emitido de forma dinámica polo servidor DHCP (quizais con enlace MAC). Neste caso, despois da configuración final da framboesa, só tes que "conectar" o cable do provedor e listo. Uso de autorización systemd-networkd - o tema dun artigo separado e non se discute aquí.

A(s) interface(s) Wi-Fi de Raspberry é unha rede local e o adaptador Ethernet integrado (eth0) é externo. Numeremos a rede local de forma estática, por exemplo: 192.168.0.0/24. Enderezo de Raspberry: 192.168.0.1. Un servidor DHCP funcionará na rede externa (Internet).

Problema de consistencia de nomes и famoso programador guatemalteco - Dous problemas que agardan a quen configure interfaces de rede e servizos en distribucións systemd.

Caos paralelo (digresión lírica)Lennart Pottering compilou o seu propio programa systemd Moi ben. Isto systemd lanza outros programas tan rápido que, ao non ter tempo de recuperarse do asubío do árbitro, tropezan e caen ao comezo sen sequera comezar a súa carreira de obstáculos.

Pero en serio, a paralelización agresiva dos procesos iniciados ao inicio do sistema operativo systemd é unha especie de "ponte de burro" para expertos en LSB secuenciais experimentados. Afortunadamente, poñer orde a este "caos paralelo" resulta sinxelo, aínda que non sempre é obvio.

Creamos dúas interfaces ponte virtuais con nomes constantes: lan и wan. "Conectaremos" o(s) adaptador(s) Wi-Fi ao primeiro, e o "framboesa" eth0 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=si elimina a necesidade de indicar o núcleo a través de sysctl para activar o enrutamento.
MACAddress= Deixemos comentarios e cambiemos se é necesario.

Primeiro "conectamos" eth0. Lembramos o "problema de uniformidade" e usamos só o enderezo MAC desta interface, que se pode descubrir, por exemplo, así:

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

Nós creamos /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Eliminamos o ficheiro de configuración anterior eth0, reiniciamos o Raspberry e accedemos á rede (o enderezo IP probablemente cambie):

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

5.DNSMASQ

Para facer puntos de acceso Wi-Fi, nada mellor que un par de doces dnsmasq + hostapd aínda non o descubrín. Na miña opinión.

Por se alguén se esqueceu, entón...hostapd - isto é o que controla os adaptadores Wi-Fi (en particular, encargarase de conectalos á rede virtual lan "framboesas"), autoriza e rexistra clientes sen fíos.

dnsmasq — configura a pila de clientes de rede: emite enderezos IP, servidores DNS, pasarela predeterminada e delicias similares.

Comecemos con dnsmasq:

# yum install dnsmasq

Patrón /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

editalo ao teu gusto.

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 "maxia" aquí reside no parámetro bind-dinámico, que lle indica ao daemon dnsmasq que agarde ata que apareza no sistema interface=lan, e non desmaiar por un ataque de orgullosa soidade despois do comezo.

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

6. HOSTAPD

E por último, as configuracións máxicas hostapd. Non teño dúbida de que alguén está lendo este artigo na procura precisamente destas liñas atesouradas.

Antes de instalar hostapd, cómpre superar o "problema de uniformidade". O adaptador Wi-Fi integrado wlan0 pode cambiar facilmente o seu nome a wlan1 ao conectar equipos Wi-Fi USB adicionais. Polo tanto, arranxaremos os nomes das interfaces do seguinte xeito: daremos nomes únicos para os adaptadores (sen fíos) e uniremos a enderezos MAC.

Para o adaptador Wi-Fi integrado, que aínda é wlan0:

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

Nós creamos /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Agora estaremos seguros de que wl0 - Esta é unha wifi integrada. Reiniciamos o Raspberry para asegurarnos diso.

Instalar:

# yum install hostapd wireless-tools

Ficheiro de configuración /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

Sen esquecer nin un momento Comité Estatal de Emerxencia, cambie os parámetros que necesitamos e comprobe manualmente a funcionalidade:

# hostapd /etc/hostapd/hostapd.conf

hostapd comezará en modo interactivo, transmitindo o seu estado á consola. Se non hai erros, os clientes que admitan o modo AC poderán conectarse ao punto de acceso. Para deter hostapd - Ctrl-C.

Todo o que queda é activar hostapd no inicio do sistema. Se fas o estándar (systemctl enable hostapd), despois do próximo reinicio podes facer que un demo "role en sangue" co diagnóstico "interface wl0 non atopada". Como resultado do "caos paralelo", hostapd iniciouse máis rápido do que o núcleo atopou o adaptador sen fíos.

Internet está chea de remedios: desde un tempo de espera forzado antes de iniciar o daemon (varios minutos), ata outro daemon que supervisa o aspecto da interface e (re)inicia o hostpad. As solucións son bastante viables, pero terriblemente feas. Pedimos axuda ao grande systemd cos seus “obxectivos” e “tarefas” e “dependencias”.

Copia o ficheiro do servizo de distribución en /etc/systemd/system/hostapd.service:

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

e reducir o seu contido á 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 maxia do ficheiro de servizo actualizado reside na vinculación dinámica de hostapd ao novo destino: a interface wl0. Cando aparece a interface, o daemon comeza; cando desaparece, detense. E todo isto está en liña, sen reiniciar o sistema. Esta técnica será especialmente útil ao conectar un adaptador Wi-Fi USB a un Raspberry.

Agora podes:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Que???" © Si, si! Ningún systemd. Non hai combinadas novas (en forma firewalld), que acaban facendo o mesmo.

Usemos o bo vello iptables, cuxos servizos, despois de iniciarse, cargarán as regras de rede no núcleo e apagarán silenciosamente sen permanecer residente e sen consumir recursos. systemd ten un elegante IPMasquerade=, pero seguiremos confiando a tradución de enderezos (NAT) e o firewall a iptables.

Instalar:

# yum install iptables-services
# systemctl enable iptables ip6tables

Prefiro almacenar a configuración de iptables como un 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 anterior e perdemos a capacidade de establecer novas conexións SSH con cable co Raspberry. É certo, creamos un enrutador Wi-Fi, ao que o acceso "a través de Internet" está prohibido por defecto - agora só "por aire". Conectamos o cable Ethernet do provedor e comezamos a navegar!

8. Bonificación: +2,4 GHz

Cando montei o primeiro enrutador Raspberry usando o debuxo descrito anteriormente, descubrín unha serie de aparellos na miña casa que, debido ás súas limitacións de deseño de Wi-Fi, non podían ver a "framboesa" en absoluto. Reconfigurar o enrutador para que funcione en 802.11b/g/n foi antideportivo, xa que a velocidade máxima "sobre o aire" neste caso non superaba os 40 Mbit e o meu provedor de Internet favorito ofréceme 100 (por cable).

De feito, xa se inventou unha solución ao problema: unha segunda interface Wi-Fi que funciona a unha frecuencia de 2,4 GHz e un segundo punto de acceso. Nun posto próximo non merquei o primeiro, senón o segundo "asubío" USB Wi-Fi que atopei. O vendedor estaba atormentado por preguntas sobre o chipset, a compatibilidade cos núcleos ARM Linux e a posibilidade de traballar en modo AP (el foi o primeiro en comezar).

Configuramos o "asubío" por analoxía co adaptador Wi-Fi integrado.

En primeiro lugar, imos cambiarlle o nome a 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

Encomendaremos a xestión da nova interface Wi-Fi a un daemon hostapd independente, que se iniciará e parará dependendo da presenza dun "asubío" estritamente definido no sistema: wl1.

Ficheiro de configuración /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 contido deste ficheiro depende directamente do modelo do adaptador USB Wi-Fi, polo que pode fallar unha copia/pega banal.

Copia o ficheiro do servizo de distribución en /etc/systemd/system/hostapd2.service:

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

e reducir o seu contido á 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

Todo o que queda é activar unha nova instancia de hostapd:

# systemctl enable hostapd2

Iso é todo! Tire do "asubío" e do propio "framboesa", mira as redes sen fíos ao teu redor.

E, finalmente, quero avisar sobre a calidade do adaptador USB Wi-Fi e da fonte de alimentación do Raspberry. O "asubío quente" conectado ás veces pode causar "conxelación de framboesas" debido a problemas eléctricos a curto prazo.

Fonte: www.habr.com

Engadir un comentario