Raspberry Pi + CentOS = Punto de acceso Wi-Fi (o enrutador frambuesa con un sombrero rojo)

En Internet hay una gran cantidad de información sobre cómo crear puntos de acceso Wi-Fi utilizando la placa Raspberry Pi. Por lo general, se supone el uso del sistema operativo nativo para la "frambuesa", que es Raspbian.

Siendo un defensor de los sistemas basados en RPM, no pude pasar por alto esta pequeña maravilla y no intentar usar mi querido CentOS en ella.

El artículo presenta una guía para fabricar un enrutador Wi-Fi de 5GHz/AC a partir de Raspberry Pi 3 Model B+ basado en el sistema operativo CentOS. Habrá algunos trucos estándar, pero poco conocidos, y como bono, un diagrama de conexión de equipo Wi-Fi adicional a la "frambuesa", que le permite operar en varios modos (2,4+5GHz) al mismo tiempo.

Raspberry Pi + CentOS = Punto de acceso Wi-Fi (o enrutador frambuesa con un sombrero rojo)
(mezcla de imágenes de acceso público)

Debemos señalar de inmediato que no se alcanzarán velocidades espectaculares. Estoy extrayendo de mi "frambuesa" un máximo de 100 Mbit por aire, y eso cubre la velocidad de mi proveedor de Internet. ¿Para qué se necesita un AC tan lento, si incluso en N teóricamente puedes obtener medio gigabit? Si te has hecho esta pregunta, ve a la tienda a comprar un enrutador real con ocho antenas externas.

0. Qué se necesitará

  • En esencia, el "producto frambuesa" tiene el calibre: Pi 3 Model B+ (para alcanzar las ansiosas velocidades y canales de 5GHz);
  • Una buena microSD >= 4GB;
  • Estación de trabajo con Linux y lector/escritor de microSD;
  • Tener suficientes habilidades en Linux, el artículo es para un geek preparado;
  • Conexión de red por cable (eth0) entre la Raspberry y Linux, trabajando como servidor DHCP en la red local y acceso a Internet desde ambos dispositivos.

Un pequeño comentario sobre el último punto. "¿Qué apareció primero, el huevo o...?" ¿Cómo hacer un enrutador Wi-Fi en ausencia de cualquier equipo de acceso a Internet? Dejamos este interesante ejercicio fuera del alcance del artículo y simplemente supongamos que la Raspberry está conectada a la red local con cable y tiene acceso a Internet. En este caso, no necesitaremos un televisor adicional ni un manipulador para configurar la "frambuesa".

1. Instalación de CentOS

Página de inicio del proyecto

Al momento de escribir este artículo, la versión de CentOS funcionando en el dispositivo es de 32 bits. He visto opiniones en varias partes de Internet sobre la disminución del rendimiento de tales sistemas operativos en arquitecturas ARM de 64 bits de hasta un 20%. Dejo este punto sin comentar.

En Linux, descargamos la imagen mínima con el núcleo "-RaspberryPI-» y lo grabamos en microSD:

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

Antes de comenzar a usar la imagen, eliminaremos la partición SWAP, ampliaremos la raíz al máximo del espacio disponible y nos desharemos de SELinux. El algoritmo es sencillo: hacemos una copia de la raíz en Linux, eliminamos de microSD todas las particiones excepto la primera (\/boot), creamos una nueva raíz y devolvemos su contenido de la copia.

Ejemplo de acciones necesarias (salida cruda de la 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

Después de descomprimir el contenido de la partición raíz, es el momento adecuado para realizar algunos cambios en ella.

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

Configuración de SELinux

Editando /mnt/etc/fstab, dejando solo dos entradas sobre las particiones: la de arranque (\/boot, sin cambios) y la raíz (cambiamos el valor de UUID, que se puede conocer revisando la salida del 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 los parámetros de arranque del núcleo: especificamos la nueva ubicación de la partición raíz, deshabilitamos la salida de información de depuración y (opcionalmente) prohibimos que el núcleo asigne direcciones IPv6 a las interfaces de red:

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

Transformamos el contenido /mnt/cmdline.txt al siguiente formato (una línea sin saltos):

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

Listo:

# cd
# umount /mnt
# sync

Reinstalamos la microSD en la "frambuesa", la encendemos y obtenemos acceso a ella por ssh (root\/centos).

2. Configuración de CentOS

Los primeros tres movimientos inquebrantables: passwd, yum -y update, reiniciar.

Delegamos la gestión de red a networkd:

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

Creamos un archivo (junto con las carpetas) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Reiniciamos la "frambuesa" y nuevamente obtenemos acceso a ella por ssh (la dirección IP puede cambiar). Tenga en cuenta que se utiliza /etc/resolv.conf, creado anteriormente por el Network Manager. Por lo tanto, en caso de problemas con la resolución, edite su contenido. No usaremos systemd-resolved .

Eliminamos lo "innecesario", reparando y acelerando el arranque del 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

A quien le interese cron y que no tolera los temporizadores de systemd, pueden instalar lo que falta. /var/log-y lo vemos a través de journalctl. Si es necesario, la historia del registro (por defecto se almacenan datos solo desde el arranque del sistema):

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

Deshabilitamos el uso de IPv6 para los servicios principales (si es necesario)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

La precisión del tiempo en la "frambuesa" es muy importante. Dado que "de fábrica" no hay capacidad de hardware para mantener el estado actual del reloj al reiniciar, es necesaria la sincronización. Un demonio muy bueno y rápido para esto es chrony — ya está instalado y se inicia automáticamente. Se pueden cambiar los servidores NTP a los más cercanos.

/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 la configuración de la zona horaria utilizaremos un truco. Dado que nuestro objetivo es crear un router Wi-Fi que funcione en frecuencias de 5GHz, debemos prepararnos para sorpresas. del regulador:

# yum info crda
Resumen: Demonio de cumplimiento regulatorio para redes inalámbricas 802.11

Esta malvada construcción, basándose también en la zona horaria, "prohíbe" el uso (en Rusia) de frecuencias y canales de 5GHz con "números grandes". El truco consiste en establecer la zona horaria sin usar nombres de continentes/ciudades, es decir, en lugar de:

# timedatectl set-timezone Europe/Moscow

Presionamos:

# timedatectl set-timezone Etc/GMT-3

Y los toques finales en la configuración del sistema:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Entorno específico del usuario y programas de inicio

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

3. Complementos de CentOS

Todo lo mencionado anteriormente puede considerarse como una guía completa para la instalación de un CentOS "vanilla" en Raspberry Pi. Debe resultar en una PC que se (re)inicie en menos de 10 segundos, utilizando menos de 15 Megabytes de RAM y 1.5 Gigabytes de microSD (en realidad menos de 1 Gigabyte debido a un /boot incompleto, pero seamos justos hasta el final).

Para instalar el software del punto de acceso Wi-Fi en este sistema, será necesario ampliar un poco las capacidades de la distribución estándar de CentOS. Primero "mejoraremos" el controlador (firmware) del adaptador Wi-Fi integrado. En la página de inicio del proyecto dice:

Wifi en el Raspberry 3B y 3B+

No se permite distribuir los archivos de firmware de la Raspberry PI 3B/3B+ por el Proyecto CentOS. Puedes usar los siguientes artículos para entender el problema, obtener el firmware y configurar el wifi.

Lo que no se permite al proyecto CentOS, no está prohibido para nuestro uso personal. Sustituimos el firmware de Wi-Fi de la distribución en CentOS por el correspondiente de los desarrolladores de Broadcom (esos odiados blobs binarios...). Esto, en particular, permitirá utilizar AC en modo punto de acceso.

Actualización del firmware de Wi-FiDeterminar el modelo del dispositivo y la versión actual del 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 el firmware es de la versión 7.45.18 de 01.03.2015, y recordamos el siguiente conjunto de números: 43455 (brcmfmac43455-sdio.bin).

Descargar la imagen actual de Raspbian. Los perezosos pueden grabar la imagen en microSD y de allí recuperar los archivos del firmware. O se puede montar la partición raíz de la imagen en Linux y copiar lo necesario desde allí:

# 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

Los archivos de firmware del adaptador Wi-Fi deben copiarse reemplazándolos en la 'frambuesa' en el directorio /usr/lib/firmware/brcm/

Reiniciamos el futuro router y sonreímos bastante:

# 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 del 27.02.2018.

Y, por supuesto, 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 de red y dificultades venideras

Como acordamos anteriormente, la «malina» está conectada «por cable» a la red local. Supongamos que el proveedor también brinda acceso a Internet de la misma manera: la dirección en la red pública se asigna dinámicamente mediante un servidor DHCP (puede estar vinculado a la MAC). En este caso, después de la configuración final de la «malina», simplemente basta con «conectarle» el cable del proveedor y todo estará listo. La autorización mediante systemd-networkd es un tema de otro artículo y no se aborda aquí.

La interfaz Wi-Fi de la Raspberry es la red local, y el adaptador Ethernet incorporado (eth0) es el externo. Numeraremos la red local estáticamente, por ejemplo: 192.168.0.0/24. Dirección de la «malina»: 192.168.0.1. En la red externa (Internet) trabajará el servidor DHCP.

El problema de la uniformidad en la nomenclatura y es un conocido programador guatemalteco — dos inconvenientes que acechan a cualquiera que se dedique a configurar interfaces de red y servicios en distribuciones basadas en systemd.

Caos paralelo (una digresión lírica)Lennart Poettering elaboró su programa systemd muy bien. Este systemd inicia otros programas tan rápido que estos, sin tener tiempo para reaccionar al silbato del juez, tropiezan y caen en la línea de salida sin haber comenzado su carrera de obstáculos.

Pero en serio, la agresiva paralelización de los procesos que se inician al arrancar el sistema operativo systemd es un cierto «puente de burros» para los veteranos en secuencias LSB. Afortunadamente, poner en orden este «caos paralelo» resulta sencillo, aunque no siempre obvio.

Creamos dos interfaces de puente virtual (bridge) con nombres permanentes: lan y wan. Conectaremos la(s) adaptador(es) Wi-Fi al primero y a eth0 de la «malina» al 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=yes elimina la necesidad de insinuar al núcleo sobre la habilitación del enrutamiento a través de sysctl.
MACAddress= descomentaremos y cambiamos si es necesario.

Primero «conectamos» eth0. Recordemos el «problema de la uniformidad» y usemos solo la dirección MAC de esta interfaz, la cual se puede averiguar, por ejemplo, así:

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

Creamos /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Eliminamos el archivo de configuración anterior de eth0, reiniciamos la «Raspberry Pi» y obtenemos acceso de red (la dirección IP probablemente cambiará):

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

5. DNSMASQ

Para crear puntos de acceso Wi-Fi, nada es mejor que la dulce pareja de dnsmasq + hostapd no se ha ideado nada mejor. En mi opinión.

Si alguien ha olvidado, entonces…hostapd — es la cosa que gestiona los adaptadores Wi-Fi (en particular, se encargará de conectarlos a la virtual lan «Raspberry Pi»), autoriza y registra a los clientes inalámbricos.

dnsmasq — configura la pila de red de los clientes: asigna direcciones IP, servidores DNS, puerta de enlace predeterminada y otras cosas agradables.

Comenzamos con dnsmasq:

# yum install dnsmasq

Plantilla /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

lo editamos a nuestro 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

La «magia» aquí radica en el parámetro bind-dynamic, que le indica al demonio dnsmasq que espere a que aparezca en el sistema interface=lan, en lugar de colapsar por un ataque de orgullo solitario tras el inicio.

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

6. HOSTAPD

Y finalmente, las mágicas configuraciones de hostapd. No tengo duda de que alguien está leyendo este artículo en busca de estas líneas codiciadas.

Antes de instalar hostapd, es necesario lidiar con el «problema de la uniformidad». El adaptador Wi-Fi interno wlan0 puede fácilmente cambiar su nombre a wlan1 al conectar otro equipo Wi-Fi USB. Por lo tanto, fijaremos los nombres de las interfaces de la siguiente manera: inventaremos nombres únicos para los adaptadores (inalámbricos) y los vincularemos a las direcciones MAC.

Para el adaptador Wi-Fi interno, que todavía es wlan0:

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

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

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

[Link]
Name=wl0

Ahora estaremos seguros de que wl0 — es el Wi-Fi integrado. Reiniciamos la «Raspberry Pi» para confirmar esto.

Instalamos:

# yum install hostapd wireless-tools

Archivo 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

Sin olvidar por un momento a G.K.Ch.P., cambiamos los parámetros necesarios y verificamos manualmente su funcionalidad:

# hostapd /etc/hostapd/hostapd.conf

hostapd se iniciará en modo interactivo, transmitiendo su estado a la consola. Si no hay errores, los clientes que soporten el modo AC podrán conectarse al punto de acceso. Para detener hostapd, presione Ctrl-C.

Solo queda habilitar hostapd en el inicio automático del sistema. Si se procede de manera estándar (systemctl enable hostapd), tras el siguiente reinicio se puede encontrar un demonio "yace en la sangre" con el diagnóstico "la interfaz wl0 no se encuentra«. Como resultado del "caos paralelo", hostapd se inició más rápido de lo que el núcleo encontró el adaptador inalámbrico.

En Internet hay muchas soluciones: desde un tiempo de espera forzado antes del inicio del demonio (algunos minutos), hasta otro demonio que monitorea la aparición de la interfaz y (re)inicia hostapd. Las soluciones son funcionales, pero terriblemente feas. Llamamos a la ayuda del gran systemd con sus "objetivos" y "tareas" y "dependencias".

Copiamos el archivo de servicio de distribución en /etc/systemd/system/hostapd.service:

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

y ajustamos su contenido de la siguiente manera:

[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

La magia del archivo de servicio actualizado radica en la vinculación dinámica de hostapd a la nueva meta: la interfaz wl0. Cuando la interfaz aparece, el demonio se inicia; cuando desaparece, se detiene. Y todo esto en línea, sin reiniciar el sistema. Esta técnica será especialmente útil al conectar un adaptador USB Wi-Fi a la "Raspberry Pi".

Ahora se puede:

# systemctl enable hostapd
# reboot

7. IPTABLES

¿"Qué???" © ¡Sí, sí! Nada de systemd. Ningún artilugio moderno (como firewalld) que en última instancia hace lo mismo.

Usamos el antiguo iptables, cuyo servicio, tras iniciar, cargará las reglas de red en el núcleo y finalizará su trabajo sin permanecer en memoria y sin consumir recursos. Systemd tiene una elegante IPMasquerade=, pero delegaremos la traducción de direcciones (NAT) y el cortafuegos a iptables.

Instalamos:

# yum install iptables-services
# systemctl enable iptables ip6tables

Prefiero almacenar la configuración de iptables como un script (ejemplo):

#!/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

Ejecutamos el script anterior y perdemos la capacidad de establecer nuevas conexiones ssh por cable con la "Raspberry Pi". Todo correcto, hemos creado un router Wi-Fi, al que el acceso "a través de Internet" está prohibido por defecto — ahora solo "por aire". Conectamos el cable del proveedor en Ethernet y comenzamos a navegar.

8. Bonificación: +2,4GHz

Cuando ensamblé el primer router Raspberry según el diagrama descrito anteriormente, descubrí que tenía varios dispositivos en casa que, debido a sus limitaciones constructivas, no podían detectar la «frambuesa» a través de Wi-Fi. No sería correcto reconfigurar el router para operar en 802.11b/g/n, ya que la velocidad máxima «por aire» en ese caso no superaría los 40 Mbit, mientras que mi proveedor de Internet favorito me ofrece 100 (por cable).

De hecho, la solución al problema ya había sido ideada: una segunda interfaz Wi-Fi funcionando en la frecuencia de 2,4 GHz y un segundo punto de acceso. Compré en la tienda no el primero, sino el segundo USB Wi-Fi «dongle» que se me presentó. El vendedor fue atormentado por preguntas sobre el chipset, la compatibilidad con núcleos ARM de Linux y la posibilidad de funcionamiento en modo AP (él fue el primero en comenzar).

Configuramos el «dongle» por analogía con el adaptador Wi-Fi incorporado.

Primero, lo renombramos 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

Encargamos a un demonio separado, hostapd, la gestión de la nueva interfaz Wi-Fi, que se iniciará y detendrá en función de la presencia en el sistema del «dongle» estrictamente definido: wl1.

Archivo 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]

El contenido de este archivo depende directamente del modelo del adaptador USB Wi-Fi, por lo que un simple copy/paste puede fallar.

Copiamos el archivo de servicio de distribución en /etc/systemd/system/hostapd2.service:

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

y ajustamos su contenido de la siguiente manera:

[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

Solo queda activar la nueva instancia de hostapd:

# systemctl enable hostapd2

¡Y eso es todo! Tira del «dongle» y de la propia «frambuesa», y observa las redes inalámbricas a tu alrededor.

Y por último, quiero advertir sobre la calidad del adaptador USB Wi-Fi y la alimentación de la Raspberry. Conectar el «dongle» en caliente puede, a veces, provocar un «bloqueo de la frambuesa» debido a problemas eléctricos momentáneos.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster