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

Hay una gran cantidad de información en Internet sobre la creación de puntos de acceso Wi-Fi basados ​​​​en una PC de placa única Raspberry. Como regla general, esto significa utilizar el sistema operativo Raspbian nativo de Raspberry.

Como partidario de los sistemas basados ​​​​en RPM, no podía pasar por alto este pequeño milagro y no probar mi querido CentOS en él.

El artículo proporciona instrucciones para crear un enrutador Wi-Fi de 5 GHz/CA a partir de una Raspberry Pi 3 Modelo B+ basado en el sistema operativo CentOS. Habrá varios trucos estándar pero poco conocidos y, como beneficio adicional, un dibujo para conectar equipos Wi-Fi adicionales a la Raspberry, lo que le permitirá funcionar simultáneamente en varios modos (2,4+5 GHz).

Raspberry Pi + CentOS = Punto de acceso Wi-Fi (o enrutador Raspberry con sombrero rojo)
(mezcla de imágenes disponibles gratuitamente)

Notemos de inmediato que algunas velocidades cósmicas no funcionarán. Extraigo un máximo de 100 Mbps de mi Raspberry por aire, y esto cubre la velocidad de mi proveedor de Internet. ¿Por qué se necesita un aire acondicionado tan lento si, en teoría, se puede obtener medio gigabit incluso en N? Si te has hecho esta pregunta, ve a la tienda a comprar un enrutador real con ocho antenas externas.

0. Qué necesitarás

  • En realidad, el “producto frambuesa” en sí es de calibre: Pi 3 Modelo B+ (para lograr las codiciadas velocidades y canales de 5GHz);
  • Buena microSD >= 4GB;
  • Estación de trabajo con Linux y lector/grabador de microSD;
  • Disponibilidad de habilidades suficientes en Linux, el artículo es para un Geek capacitado;
  • Conectividad de red cableada (eth0) entre Raspberry y Linux, ejecutando servidor DHCP en la red local y acceso a Internet desde ambos dispositivos.

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

1. Instalar CentOS

Página de inicio del proyecto

Al momento de escribir este artículo, la versión en ejecución de CentOS en el dispositivo es de 32 bits. En algún lugar de la World Wide Web encontré opiniones de que el rendimiento de estos sistemas operativos en la arquitectura ARM de 64 bits se reduce hasta en un 20%. Dejaré este momento sin comentarios.

En Linux, descargue la imagen mínima con el kernel "-FrambuesaPI-"y escríbalo en la 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, le quitaremos la partición SWAP, expandiremos la raíz a todo el volumen disponible y nos desharemos de SELinux. El algoritmo es simple: hacer una copia de la raíz en Linux, eliminar todas las particiones de la microSD excepto la primera (/boot), crear una nueva raíz y devolver su contenido de la copia.

Ejemplo de acciones requeridas (salida de consola grave)

# 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 hora de realizarle algunos cambios.

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

SELINUX=disabled

Edición /mnt/etc/fstab, dejando en él solo dos entradas sobre las particiones: boot (/boot, sin cambios) y root (cambiamos el valor UUID, que se puede descubrir estudiando 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 kernel: especificamos una nueva ubicación para la partición raíz, deshabilitamos la salida de información de depuración y (opcionalmente) prohibimos que el kernel asigne direcciones IPv6 en las interfaces de red:

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

Aqui esta el contenido /mnt/cmdline.txt al siguiente formulario (una línea sin guiones):

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

Hecho:

# cd
# umount /mnt
# sync

Reorganizamos la microSD en la “frambuesa”, la ejecutamos y obtenemos acceso a la red a través de ssh (root/centos).

2. Configurar CentOS

Los primeros tres movimientos inquebrantables: passwd, yum -y actualización, reiniciar.

Regalamos gestión de red en red:

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

Crear un archivo (junto con directorios) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Reiniciamos el "frambuesa" y nuevamente obtenemos acceso a la red a través de ssh (la dirección IP puede cambiar). Presta atención a lo que se utiliza. / Etc / resolv.conf, creado anteriormente por Network Manager. Por lo tanto, en caso de problemas con la resolución, edite su contenido. Usar systemd-resuelto nosotros no.

Eliminamos lo “innecesario”, reparamos y aceleramos la carga 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

Quién necesita cron y quien no digiere lo incorporado temporizadores del sistema, puede establecer lo que falta. / var / log- y mira a través journalctl. Si necesita un historial de registro (de forma predeterminada, la información se almacena solo desde el momento en que se inicia el sistema):

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

Deshabilitar el uso de IPv6 por servicios básicos (si es necesario)/ etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

La relevancia del tiempo en la “frambuesa” es algo importante. Dado que de fábrica no existe la capacidad de hardware para guardar el estado actual del reloj al reiniciar, es necesaria la sincronización. Un demonio muy bueno y rápido para esto es crony - ya instalado y se inicia automáticamente. Puede 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 establecer la zona horaria usaremos truco. Dado que nuestro objetivo es crear un enrutador Wi-Fi que funcione en frecuencias de 5 GHz, nos prepararemos para las sorpresas con anticipación. regulador:

# mmm información crda
Resumen: demonio de cumplimiento normativo para redes inalámbricas 802.11

Este malvado diseño, basado también en el huso horario, “prohíbe” el uso (en Rusia) de frecuencias de 5GHz y canales con números “elevados”. El truco consiste en establecer una zona horaria sin utilizar los nombres de continentes/ciudades, es decir, en lugar de:

# timedatectl set-timezone Europe/Moscow

Pulsamos:

# timedatectl set-timezone Etc/GMT-3

Y los toques finales al peinado del 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 lo dicho anteriormente puede considerarse una instrucción completa para instalar CentOS "vainilla" en Raspberry Pi. Deberías terminar con una PC que (re)arranca en menos de 10 segundos, usa menos de 15 Megabytes de RAM y 1.5 Gigabytes de microSD (en realidad, menos de 1 Gigabyte debido a un /arranque incompleto, pero seamos honestos).

Para instalar el software del punto de acceso Wi-Fi en este sistema, deberá ampliar ligeramente las capacidades de la distribución estándar de CentOS. En primer lugar, actualicemos el controlador (firmware) del adaptador Wi-Fi integrado. La página de inicio del proyecto dice:

Wifi en la Raspberry 3B y 3B+

El Proyecto CentOS no permite distribuir los archivos de firmware de Raspberry PI 3B/3B+. Puede utilizar los siguientes artículos para comprender el problema, obtener el firmware y configurar el wifi.

Lo que está prohibido para el proyecto CentOS no lo está para nosotros para uso personal. Reemplazamos el firmware de distribución Wi-Fi en CentOS por el correspondiente de los desarrolladores de Broadcom (esos mismos odiados blobs binarios...). Esto, en particular, le permitirá utilizar AC en modo punto de acceso.

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

Descargue la imagen actual de Raspbian. Los perezosos pueden escribir la imagen en una microSD y sacar los archivos con el firmware desde allí. O puedes montar la partición raíz de la imagen en Linux y copiar lo que necesites 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 resultantes deben copiarse y reemplazarse con "frambuesa" en el directorio /usr/lib/firmware/brcm/

Reiniciamos el futuro enrutador y sonreímos con satisfacción:

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

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 la red y desafíos futuros

Como acordamos anteriormente, la "frambuesa" está conectada por "cable" a la red local. Supongamos que el proveedor proporciona acceso a Internet exactamente de la misma manera: la dirección en la red pública la emite dinámicamente el servidor DHCP (quizás con enlace MAC). En este caso, después de la configuración final de la frambuesa, sólo necesitas "conectar" el cable del proveedor y listo. Autorización utilizando systemd-red - el tema de un artículo separado y no se trata aquí.

Las interfaces Wi-Fi de Raspberry son una red local y el adaptador Ethernet incorporado (eth0) es externo. Numeremos la red local estáticamente, por ejemplo: 192.168.0.0/24. Dirección de frambuesa: 192.168.0.1. Un servidor DHCP funcionará en la red externa (Internet).

Problema de coherencia de nombres и famoso programador guatemalteco - dos problemas que esperan a cualquiera que configure interfaces y servicios de red en distribuciones systemd.

Caos paralelo (digresión lírica)Lennart Pottering ha elaborado su propio programa sistemad Muy bien. Este sistemad lanza otros programas tan rápido que, al no tener tiempo de recuperarse del silbato del árbitro, tropiezan y caen al principio sin siquiera comenzar su carrera de obstáculos.

Pero en serio, la paralelización agresiva de los procesos iniciados al inicio del sistema operativo systemd es una especie de "puente de burro" para los especialistas experimentados en LSB secuencial. Afortunadamente, poner orden en este “caos paralelo” resulta sencillo, aunque no siempre obvio.

Creamos dos interfaces de puente virtual con nombres constantes: lan и pálido. “Conectaremos” el/los adaptador(es) Wi-Fi al primero y el eth0 “frambuesa” 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=sí elimina la necesidad de indicar al kernel a través de sysctl para habilitar el enrutamiento.
Dirección MAC= Descomentemos y cambiemos si es necesario.

Primero “conectamos” eth0. Recordamos el "problema de uniformidad" y usamos solo la dirección MAC de esta interfaz, que se puede encontrar, por ejemplo, así:

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

Crear /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Eliminamos el archivo de configuración anterior eth0, reiniciamos la Raspberry y obtenemos acceso a la red (lo más probable es que la dirección IP cambie):

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

5.DNSMASQ

Para crear puntos de acceso Wi-Fi, nada mejor que un dulce par de dnsmasq + hostapd Aún no lo he descubierto. En mi opinión.

En caso de que alguien lo haya olvidado, entonces...hostapd - esto es lo que controla los adaptadores de Wi-Fi (en particular, se encargará de conectarlos al virtual lan "frambuesas"), autoriza y registra clientes inalámbricos.

dnsmasq — configura la pila de red de clientes: emite direcciones IP, servidores DNS, puerta de enlace predeterminada y delicias similares.

Comencemos 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

edítalo a tu 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 vinculación dinámica, que le dice al demonio dnsmasq que espere hasta que aparezca en el sistema interfaz=lan, y no desmayarse por un ataque de orgullosa soledad después del comienzo.

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

6. HOSTAPD

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

Antes de instalar hostapd, es necesario superar el "problema de uniformidad". El adaptador Wi-Fi incorporado wlan0 puede cambiar fácilmente su nombre a wlan1 al conectar equipos Wi-Fi USB adicionales. Por lo tanto, arreglaremos los nombres de las interfaces de la siguiente manera: crearemos nombres únicos para los adaptadores (inalámbricos) y los vincularemos a direcciones MAC.

Para el adaptador Wi-Fi integrado, que sigue siendo wlan0:

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

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

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

[Link]
Name=wl0

Ahora estaremos seguros de que wl0 - Esto es Wi-Fi incorporado. Reiniciamos la Raspberry para asegurarnos de esto.

Instalar en pc:

# 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 ni un momento GKChP, cambie los parámetros que necesitamos y verifique manualmente la funcionalidad:

# hostapd /etc/hostapd/hostapd.conf

hostapd se iniciará en modo interactivo y transmitirá su estado a la consola. Si no hay errores, entonces los clientes que admiten el modo AC ya pueden conectarse al punto de acceso. Para detener hostapd - Ctrl-C.

Todo lo que queda es habilitar hostapd en el inicio del sistema. Si hace lo estándar (systemctl enable hostapd), luego del próximo reinicio puede obtener un demonio "rodando en sangre" con el diagnóstico "interfaz wl0 no encontrada". Como resultado del "caos paralelo", hostapd se inició más rápido de lo que el kernel encontró el adaptador inalámbrico.

Internet está lleno de soluciones: desde un tiempo de espera forzado antes de iniciar el demonio (varios minutos), hasta otro demonio que monitorea la apariencia de la interfaz y (re)inicia el hostpad. Las soluciones son bastante viables, pero terriblemente feas. Pedimos ayuda al grande sistemad con sus “metas” y “tareas” y “dependencias”.

Copie el archivo del servicio de distribución a /etc/systemd/system/hostapd.servicio:

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

y reducir su contenido a la siguiente 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

La magia del archivo de servicio actualizado radica en el enlace dinámico de hostapd al nuevo destino: la interfaz wl0. Cuando aparece la interfaz, el demonio se inicia; cuando desaparece, se detiene. Y todo esto está en línea, sin reiniciar el sistema. Esta técnica te resultará especialmente útil a la hora de conectar un adaptador Wi-Fi USB a una Raspberry.

Ahora usted puede:

# systemctl enable hostapd
# reboot

7. IPTABLES

“¿Qué???” © ¡Sí, sí! Ninguno sistemad. No hay cosechadoras novedosas (en la forma firewalld), que acaban haciendo lo mismo.

Usemos el viejo y bueno. iptables, cuyos servicios, después de iniciarse, cargarán reglas de red en el kernel y se cerrarán silenciosamente sin permanecer residentes y sin consumir recursos. systemd tiene un elegante IPMascarada=, pero aún así confiaremos la traducción de direcciones (NAT) y el firewall a iptables.

Instalar en pc:

# 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 Raspberry. Así es, hemos creado un enrutador Wi-Fi, cuyo acceso "a través de Internet" está prohibido de forma predeterminada; ahora solo "por aire". ¡Conectamos el cable Ethernet del proveedor y empezamos a navegar!

8. Bonificación: +2,4 GHz

Cuando monté el primer enrutador Raspberry usando el dibujo descrito anteriormente, descubrí varios dispositivos en mi hogar que, debido a sus limitaciones de diseño de Wi-Fi, no podían ver la "frambuesa" en absoluto. Reconfigurar el enrutador para que funcione en 802.11b/g/n no fue deportivo, ya que la velocidad máxima "por aire" en este caso no superó los 40 Mbit, y mi proveedor de Internet favorito me ofrece 100 (por cable).

De hecho, ya se ha inventado una solución al problema: una segunda interfaz Wi-Fi que funciona a una frecuencia de 2,4 GHz y un segundo punto de acceso. En un puesto cercano no compré el primero, sino el segundo “silbato” USB Wi-Fi que encontré. El vendedor estaba atormentado por preguntas sobre el chipset, la compatibilidad con los kernels ARM Linux y la posibilidad de trabajar en modo AP (fue el primero en comenzar).

Configuramos el "silbato" por analogía con el adaptador Wi-Fi incorporado.

Primero, cambiemosle el nombre 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

Confiaremos la gestión de la nueva interfaz Wi-Fi a un demonio hostapd separado, que se iniciará y se detendrá dependiendo de la presencia de un "silbato" estrictamente definido en el sistema: 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 Wi-Fi USB, por lo que una copia y pegado banal puede fallar.

Copie el archivo del servicio de distribución a /etc/systemd/system/hostapd2.service:

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

y reducir su contenido a la siguiente 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 lo que queda es habilitar una nueva instancia de hostapd:

# systemctl enable hostapd2

¡Eso es todo! Tira del "silbato" y de la "frambuesa", mira las redes inalámbricas que te rodean.

Y por último, quiero advertiros sobre la calidad del adaptador USB Wi-Fi y la fuente de alimentación de la Raspberry. El "silbato caliente" conectado a veces puede causar "congelación de frambuesa" debido a problemas eléctricos a corto plazo.

Fuente: habr.com

Añadir un comentario