Raspberry Pi + CentOS = Hotspot Wi-Fi (o router lampone con cappello rosso)

C'è un'enorme quantità di informazioni su Internet sulla creazione di punti di accesso Wi-Fi basati su un PC a scheda singola Raspberry. Di norma ciò significa utilizzare il sistema operativo Raspbian nativo del Raspberry.

Essendo un sostenitore dei sistemi basati su RPM, non potevo ignorare questo piccolo miracolo e non provare il mio amato CentOS.

L'articolo fornisce istruzioni per realizzare un router Wi-Fi da 5 GHz/AC da un Raspberry Pi 3 Modello B+ basato sul sistema operativo CentOS. Ci saranno diversi trucchi standard ma poco conosciuti e, come bonus, un disegno per collegare ulteriori apparecchiature Wi-Fi al Raspberry, consentendogli di funzionare contemporaneamente in diverse modalità (2,4+5GHz).

Raspberry Pi + CentOS = Hotspot Wi-Fi (o router lampone con cappello rosso)
(mix di immagini liberamente disponibili)

Notiamo subito che alcune velocità cosmiche non funzioneranno. Ottengo un massimo di 100 Mbps dal mio Raspberry via etere e questo copre la velocità del mio provider Internet. Perché hai bisogno di un AC così lento, se in teoria puoi ottenere mezzo gigabit anche su N? Se ti sei posto questa domanda, allora vai in negozio per acquistare un vero router con otto antenne esterne.

0. Di cosa avrai bisogno

  • In realtà, il “prodotto lampone” stesso è del calibro: Pi 3 Modello B+ (per raggiungere le ambite velocità e canali a 5GHz);
  • Buona microSD >= 4GB;
  • Workstation con lettore/scrittore Linux e microSD;
  • Disponibilità di competenze sufficienti in Linux, l'articolo è per un Geek esperto;
  • Connettività di rete cablata (eth0) tra Raspberry e Linux, esecuzione del server DHCP sulla rete locale e accesso a Internet da entrambi i dispositivi.

Un piccolo commento sull'ultimo punto. "Chi è nato prima, l'uovo o..." come realizzare un router Wi-Fi in assenza di apparecchiature per l'accesso a Internet? Lasciamo questo divertente esercizio fuori dallo scopo dell'articolo e supponiamo semplicemente che il Raspberry sia connesso alla rete locale via cavo e abbia accesso a Internet. In questo caso, non avremo bisogno di una TV aggiuntiva e di un manipolatore per impostare il "lampone".

1. Installa CentOS

Home page del progetto

Al momento della stesura di questo articolo, la versione in esecuzione di CentOS sul dispositivo è a 32 bit. Da qualche parte sul World Wide Web mi sono imbattuto in opinioni secondo cui le prestazioni di tali sistemi operativi su architettura ARM a 64 bit sono ridotte fino al 20%. Lascerò questo momento senza commenti.

Su Linux, scarica l'immagine minima con il kernel "-RaspberryPI-"e scrivetelo sulla microSD:

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

Prima di iniziare a utilizzare l'immagine, rimuoveremo la partizione SWAP da essa, espanderemo la radice all'intero volume disponibile ed elimineremo SELinux. L'algoritmo è semplice: fare una copia della root su Linux, eliminare tutte le partizioni dalla microSD tranne la prima (/boot), creare una nuova root e restituirne il contenuto dalla copia.

Esempio di azioni richieste (output della console 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

Dopo aver decompresso il contenuto della partizione root, è il momento di apportarvi alcune modifiche.

Disabilita SELinux in /mnt/etc/selinux/config:

SELINUX=disabled

La modifica /mnt/etc/fstab, lasciando al suo interno solo due voci relative alle partizioni: boot (/boot, nessuna modifica) e root (modifichiamo il valore UUID, che può essere scoperto studiando l'output del comando blkid su Linux):

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

Infine, modifichiamo i parametri di avvio del kernel: specifichiamo una nuova posizione per la partizione root, disabilitiamo l'output delle informazioni di debug e (facoltativo) proibiamo al kernel di assegnare indirizzi IPv6 sulle interfacce di rete:

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

Ecco il contenuto /mnt/cmdline.txt nella seguente forma (una riga senza trattini):

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

Finitura:

# cd
# umount /mnt
# sync

Riorganizziamo la microSD nel "raspberry", la lanciamo e otteniamo l'accesso alla rete tramite ssh (root/centos).

2. Configurazione di CentOS

I primi tre movimenti incrollabili: passwd, yum -y aggiornamento, reboot.

Diamo via la gestione della rete networkd:

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

Creare un file (insieme alle directory) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Riavviamo il "lampone" e otteniamo nuovamente l'accesso alla rete tramite ssh (l'indirizzo IP potrebbe cambiare). Prestare attenzione a ciò che viene utilizzato /etc/resolv.conf, creato in precedenza da Network Manager. Pertanto, in caso di problemi con la risoluzione, modificarne il contenuto. Utilizzo risolto da systemd noi non.

Rimuoviamo ciò che è “non necessario”, ripariamo e acceleriamo il caricamento del sistema operativo:

# 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

Chi ha bisogno cron e chi non digerisce il built-in timer di sistema, può stabilire cosa manca. / Var / log- e guarda attraverso journalctl. Se hai bisogno della cronologia dei registri (per impostazione predefinita, le informazioni vengono archiviate solo dal momento in cui viene avviato il sistema):

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

Disabilitare l'uso di IPv6 da parte dei servizi di base (se richiesto)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

La rilevanza del tempo sul “lampone” è una cosa importante. Poiché l'hardware non è in grado di salvare lo stato corrente dell'orologio al riavvio, è necessaria la sincronizzazione. Un demone molto buono e veloce per questo è chrony - già installato e si avvia automaticamente. Puoi cambiare i server NTP con quelli più vicini.

/etc/crony.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

Per impostare il fuso orario che utilizzeremo trucco. Poiché il nostro obiettivo è creare un router Wi-Fi che funzioni su frequenze di 5 GHz, ci prepareremo in anticipo per le sorprese regolatore:

# gnam informazioni crda
Riepilogo: demone di conformità normativa per la rete wireless 802.11

Questo disegno diabolico, basato anche sul fuso orario, “vieta” l’uso (in Russia) delle frequenze a 5GHz e dei canali con numeri “alti”. Il trucco sta nell'impostare un fuso orario senza utilizzare i nomi dei continenti/città, cioè invece di:

# timedatectl set-timezone Europe/Moscow

Premiamo:

# timedatectl set-timezone Etc/GMT-3

E il tocco finale all'acconciatura del sistema:

# hostnamectl set-hostname router

/root/.profilo_bash:

. . .

# User specific environment and startup programs

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

3. Componenti aggiuntivi CentOS

Tutto quanto sopra può essere considerato un'istruzione completa per l'installazione di CentOS "vanilla" sul Raspberry Pi. Dovresti ritrovarti con un PC che si (ri)avvia in meno di 10 secondi, utilizza meno di 15 Megabyte di RAM e 1.5 Gigabyte di microSD (in realtà meno di 1 Gigabyte a causa di un /boot incompleto, ma siamo onesti).

Per installare il software del punto di accesso Wi-Fi su questo sistema, dovrai espandere leggermente le capacità della distribuzione CentOS standard. Prima di tutto, aggiorniamo il driver (firmware) dell'adattatore Wi-Fi integrato. La home page del progetto dice:

Wifi sul Raspberry 3B e 3B+

I file del firmware Raspberry PI 3B/3B+ non possono essere distribuiti dal progetto CentOS. Puoi utilizzare i seguenti articoli per comprendere il problema, ottenere il firmware e configurare il Wi-Fi.

Ciò che è vietato per il progetto CentOS non è vietato per noi per uso personale. Sostituiamo il firmware Wi-Fi distribuito in CentOS con quello corrispondente degli sviluppatori Broadcom (quegli stessi odiati blob binari...). Questo, in particolare, ti consentirà di utilizzare AC in modalità access point.

Aggiornamento del firmware Wi-FiScopri il modello del dispositivo e la versione attuale 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 

Vediamo che la versione del firmware è 7.45.18 del 01.03.2015/XNUMX/XNUMX, e ricordiamo la seguente serie di numeri: 43455 (brcmfmac43455-sdio.bin).

Scarica l'immagine Raspbian corrente. I più pigri possono scrivere l'immagine sulla microSD e da lì prendere i file con il firmware. Oppure puoi montare la partizione root dell'immagine in Linux e copiare ciò che ti serve da 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

I file firmware dell'adattatore Wi-Fi risultanti devono essere copiati e sostituiti con "raspberry" nella directory /usr/lib/firmware/brcm/

Riavviamo il futuro router e sorridiamo soddisfatti:

# 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 

Versione: 7.45.154 del 27.02.2018/XNUMX/XNUMX.

E ovviamente 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. Configurazione della rete e sfide future

Come abbiamo concordato sopra, il "lampone" è collegato tramite "filo" alla rete locale. Supponiamo che il provider fornisca l'accesso a Internet esattamente nello stesso modo: l'indirizzo sulla rete pubblica viene assegnato dinamicamente dal server DHCP (eventualmente con associazione MAC). In questo caso, dopo la configurazione finale del raspberry, ti basterà “collegare” il cavo del provider e il gioco è fatto. Autorizzazione utilizzando systemd-networkd - l'argomento di un articolo separato e non è discusso qui.

Le interfacce Wi-Fi di Raspberry sono una rete locale e l'adattatore Ethernet integrato (eth0) è esterno. Numeriamo staticamente la rete locale, ad esempio: 192.168.0.0/24. Indirizzo lampone: 192.168.0.1. Un server DHCP funzionerà sulla rete esterna (Internet).

Problema di coerenza dei nomi и famoso programmatore guatemalteco - due problemi che attendono chiunque configuri interfacce e servizi di rete nelle distribuzioni systemd.

Caos parallelo (digressione lirica)Lennart Pottering ha compilato il proprio programma systemd Molto bene. Questo systemd lancia altri programmi così velocemente che questi, non avendo il tempo di riprendersi dal fischio dell'arbitro, inciampano e cadono all'inizio senza nemmeno iniziare il loro percorso a ostacoli.

Ma sul serio, la parallelizzazione aggressiva dei processi avviati all'inizio del sistema operativo systemd è una sorta di "ponte asino" per specialisti LSB sequenziali esperti. Fortunatamente, mettere ordine in questo “caos parallelo” risulta essere semplice, anche se non sempre ovvio.

Creiamo due interfacce bridge virtuali con nomi costanti: lan и pallido. “Collegheremo” l’adattatore Wi-Fi al primo e l’eth0 “raspberry” al secondo.

/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 necessità di suggerire al kernel tramite sysctl per abilitare il routing.
IndirizzoMAC= Decommentiamo e cambiamo se necessario.

Per prima cosa “connettiamo” eth0. Ricordiamo il “problema di uniformità” e utilizziamo solo l'indirizzo MAC di questa interfaccia, che può essere trovato, ad esempio, in questo modo:

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

Creare /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Eliminiamo il file di configurazione precedente eth0, riavviamo il Raspberry e otteniamo l'accesso alla rete (molto probabilmente l'indirizzo IP cambierà):

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

5.DNSMASQ

Per creare punti di accesso Wi-Fi, niente è meglio di un bel paio di dnsmasq + hostapd non l'ho ancora capito. Secondo me.

Nel caso qualcuno se ne fosse dimenticato, allora...hostapd - questa è la cosa che controlla gli adattatori Wi-Fi (in particolare, si occuperà di collegarli al virtual lan "lamponi"), autorizza e registra i client wireless.

dnsmasq — configura lo stack di rete dei client: emette indirizzi IP, server DNS, gateway predefinito e delizie simili.

Cominciamo con dnsmasq:

# yum install dnsmasq

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

modificalo a tuo piacimento.

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” qui sta nel parametro vincolo-dinamico, che dice al demone dnsmasq di attendere finché non appare sul sistema interfaccia=lan, e non svenire per un attacco di orgogliosa solitudine dopo l'inizio.

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

6. HOSTAPD

E infine, le magiche configurazioni hostapd. Non ho dubbi che qualcuno stia leggendo questo articolo alla ricerca proprio di queste preziose righe.

Prima di installare hostapd è necessario superare il “problema di uniformità”. L'adattatore Wi-Fi integrato wlan0 può facilmente cambiare il suo nome in wlan1 quando si collegano ulteriori apparecchiature Wi-Fi USB. Pertanto, fisseremo i nomi delle interfacce nel modo seguente: troveremo nomi univoci per gli adattatori (wireless) e li collegheremo agli indirizzi MAC.

Per l'adattatore Wi-Fi integrato, che è ancora wlan0:

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

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

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

[Link]
Name=wl0

Ora ne saremo sicuri wl0 - Questo è il Wi-Fi integrato. Riavviamo il Raspberry per assicurarcene.

Installare:

# yum install hostapd wireless-tools

File di configurazione /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

Senza dimenticarlo per un attimo Comitato di emergenza, modifica i parametri di cui abbiamo bisogno e controlla manualmente la funzionalità:

# hostapd /etc/hostapd/hostapd.conf

hostapd verrà avviato in modalità interattiva, trasmettendo il suo stato alla console. Se non sono presenti errori, i client che supportano la modalità AC saranno in grado di connettersi al punto di accesso. Per interrompere hostapd: Ctrl-C.

Non resta che abilitare hostapd all'avvio del sistema. Se fai la cosa standard (systemctl abilita hostapd), dopo il prossimo riavvio puoi ottenere un demone "rotolare nel sangue" con la diagnosi "interfaccia wl0 non trovata". Come risultato del “caos parallelo”, hostapd si è avviato più velocemente di quanto il kernel abbia trovato l’adattatore wireless.

Internet è piena di rimedi: da un timeout forzato prima di avviare il demone (diversi minuti), a un altro demone che monitora l'aspetto dell'interfaccia e (ri)avvia l'hostpad. Le soluzioni sono abbastanza realizzabili, ma terribilmente brutte. Invochiamo l'aiuto del Grande systemd con i suoi “obiettivi”, “compiti” e “dipendenze”.

Copiare il file del servizio di distribuzione in /etc/systemd/system/hostapd.service:

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

e ridurne il contenuto nella seguente 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 file di servizio aggiornato risiede nel collegamento dinamico di hostapd al nuovo target: l'interfaccia wl0. Quando appare l'interfaccia, il demone si avvia; quando scompare, si ferma. E tutto questo è online, senza riavviare il sistema. Questa tecnica sarà particolarmente utile quando si collega un adattatore Wi-Fi USB a un Raspberry.

Ora puoi:

# systemctl enable hostapd
# reboot

7. IPTABLES

“Cosa???” © Sì, sì! Nessuno systemd. Nessuna nuova combinazione (nella forma firewalld), che finiscono per fare la stessa cosa.

Usiamo quello caro vecchio iptables, i cui servizi, dopo l'avvio, caricheranno le regole di rete nel kernel e si spegneranno silenziosamente senza rimanere residenti e senza consumare risorse. systemd ha un elegante IPMasquerade=, ma affideremo comunque la traduzione degli indirizzi (NAT) e il firewall a iptables.

Installare:

# yum install iptables-services
# systemctl enable iptables ip6tables

Preferisco memorizzare la configurazione di iptables come script (esempio):

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

Eseguiamo lo script precedente e perdiamo la possibilità di stabilire nuove connessioni SSH cablate con il Raspberry. Esatto, abbiamo realizzato un router Wi-Fi, il cui accesso “via Internet” è vietato per impostazione predefinita, ora solo “via etere”. Colleghiamo il cavo Ethernet del provider e iniziamo a navigare!

8. Bonus: +2,4 GHz

Quando ho assemblato il primo router Raspberry utilizzando il disegno sopra descritto, ho scoperto nella mia famiglia una serie di gadget che, a causa dei limiti di progettazione Wi-Fi, non riuscivano affatto a vedere il "lampone". Riconfigurare il router per funzionare in 802.11b/g/n è stato antisportivo, poiché la velocità massima "over the air" in questo caso non ha superato i 40 Mbit e il mio provider Internet preferito me ne offre 100 (via cavo).

In effetti, la soluzione al problema è già stata inventata: una seconda interfaccia Wi-Fi che funziona alla frequenza di 2,4 GHz e un secondo punto di accesso. In una bancarella vicina ho comprato non il primo, ma il secondo “fischio” Wi-Fi USB che ho trovato. Il venditore era tormentato da domande sul chipset, sulla compatibilità con i kernel ARM Linux e sulla possibilità di lavorare in modalità AP (è stato il primo ad iniziare).

Configuriamo il "fischio" per analogia con l'adattatore Wi-Fi integrato.

Innanzitutto, rinominiamolo in 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

Affideremo la gestione della nuova interfaccia Wi-Fi a un demone hostapd separato, che si avvierà e si arresterà a seconda della presenza di un “fischio” rigorosamente definito nel sistema: wl1.

File di configurazione /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]

Il contenuto di questo file dipende direttamente dal modello dell'adattatore USB Wi-Fi, quindi un banale copia/incolla potrebbe fallire.

Copiare il file del servizio di distribuzione in /etc/systemd/system/hostapd2.service:

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

e ridurne il contenuto nella seguente 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

Non resta che abilitare una nuova istanza di hostapd:

# systemctl enable hostapd2

È tutto! Tira il "fischio" e il "lampone" stesso, guarda le reti wireless intorno a te.

E infine, voglio avvisarti sulla qualità dell'adattatore Wi-Fi USB e dell'alimentatore del Raspberry. Il “fischio caldo” collegato a volte può causare un “congelamento lampone” a causa di problemi elettrici a breve termine.

Fonte: habr.com

Aggiungi un commento