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

In rete c'è una grande quantità di informazioni su come creare punti di accesso Wi-Fi utilizzando il mini PC Raspberry. Di norma, si presume l'uso del sistema operativo nativo per il 'raspberry' — Raspbian.

Essendo un sostenitore dei sistemi basati su RPM, non potevo ignorare questa piccola meraviglia e non provare la mia amata CentOS su di essa.

L'articolo presenta una guida per realizzare un router Wi-Fi 5GHz/AC utilizzando un Raspberry Pi 3 Model B+ con il sistema operativo CentOS. Ci saranno alcuni trucchi standard, ma poco conosciuti, e come bonus — un diagramma per collegare attrezzature Wi-Fi aggiuntive al 'raspberry', permettendo di funzionare contemporaneamente in diverse modalità (2,4+5GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (o router malva con cappello rosso)
(mix di immagini da fonti libere)

Va subito notato che non si otterranno velocità stratosferiche. Estraho dal mio 'raspberry' al massimo 100 Mbit, e questo copre la velocità del mio provider Internet. A cosa serve un AC così lento, se anche con N in teoria si può raggiungere mezzo gigabit? Se ti sei posto questa domanda, vai a comprare un vero router con otto antenne esterne.

0. Cosa serve

  • Il "prodotto di lamponi" in calibro: Pi 3 Model B+ (per raggiungere le ambite velocità di 5 GHz e canali);
  • Una buona microSD >= 4GB;
  • Una workstation con Linux e un lettore/scrittore microSD;
  • Avere sufficienti competenze in Linux, questo articolo è per geek preparati;
  • Connessione di rete cablata (eth0) tra Raspberry e Linux, un server DHCP funzionante nella rete locale e accesso a Internet da entrambi i dispositivi.

Una piccola nota sull'ultimo punto. "Cosa è apparso per primo, l'uovo o..." come fare un router Wi-Fi senza alcuna attrezzatura per l'accesso a Internet? Lasceremo questo esercizio interessante al di fuori dell'articolo e supponiamo semplicemente che il Raspberry sia collegato alla rete locale tramite cavo e abbia accesso a Internet. In questo caso, non avremo bisogno di una TV e di un dispositivo di input aggiuntivi per configurare il "lamponi".

1. Installazione di CentOS

Homepage del progetto

Al momento della scrittura di questo articolo, la versione funzionante di CentOS sul dispositivo è a 32 bit. In giro per il web ho trovato opinioni secondo cui le prestazioni di tali sistemi operativi su architettura ARM a 64 bit potrebbero diminuire del 20%. Lascio questo punto senza commento.

Su Linux scarichiamo l'immagine minima con il kernel «-RaspberryPI-» e la scriviamo su 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, rimuoviamo la partizione SWAP, estendiamo la partizione principale a tutto lo spazio disponibile e disabilitiamo SELinux. L'algoritmo è semplice: facciamo una copia della radice su Linux, rimuoviamo tutte le partizioni dalla microSD tranne la prima (/boot), creiamo una nuova partizione principale e ripristiniamo il suo contenuto dalla copia.

Esempio delle azioni necessarie (output console grezzo)

# 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 estratto il contenuto della partizione principale, è il momento di apportare alcune modifiche.

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

SELINUX=disabled

Modifichiamo /mnt/etc/fstab, mantenendo solo due voci sulle partizioni: la partizione di avvio (/boot, senza modifiche) e quella principale (cambiamo il valore UUID, che può essere trovato esaminando 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, cambiamo le opzioni di avvio del kernel: indichiamo la nuova posizione della partizione principale, disabilitiamo l'output delle informazioni di debug e (opzionalmente) impediamo al kernel di assegnare indirizzi IPv6 alle interfacce di rete:

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

Portiamo il contenuto /mnt/cmdline.txt alla seguente forma (una riga senza interruzioni):

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

Fatto:

# cd
# umount /mnt
# sync

Inseriamo la microSD nella «raspberry», accendiamo e otteniamo accesso alla rete tramite ssh (root/centos).

2. Configurazione di CentOS

I primi tre comandi indispensabili: passwd, yum -y update, riavvia.

Gestiamo la rete con networkd:

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

Creiamo il file (insieme alle directory) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Riavviamo la «raspberry» e otteniamo nuovamente accesso alla rete tramite ssh (l'indirizzo IP potrebbe cambiare). Si prega di notare che si utilizza /etc/resolv.conf, creato in precedenza dal Network Manager. Quindi, in caso di problemi con la risoluzione, modificate il suo contenuto. Non utilizziamo systemd-resolved non lo faremo.

Rimuoviamo il superfluo, sistemiamo e velocizziamo 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

A chi serve cron e chi non tollera i timer di systemd, può installare ciò che manca. /var/log-e guardiamo tramite journalctl. Se è necessaria la cronologia del registro (di default vengono conservate solo le informazioni dall'avvio del sistema):

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

Disattiviamo l'uso di IPv6 per i servizi principali (se necessario)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

La sincronizzazione dell'orario su una Raspberry Pi è una questione importante. Poiché non c'è la possibilità di mantenere lo stato corrente dell'orologio al riavvio "out of the box", è necessaria una sincronizzazione. Un ottimo e veloce demone per questo è chrony che è già installato e si avvia automaticamente. È possibile modificare i server NTP con quelli più vicini.

/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

Per impostare il fuso orario useremo un trucco. Poiché il nostro obiettivo è creare un router Wi-Fi che operi su frequenze di 5GHz, ci prepareremo preventivamente a eventuali sorprese regolatore:

# yum info crda
Summary: Daemon di conformità alle normative per networking wireless 802.11

Questa malvagia costruzione, anche in base al fuso orario, "vietano" l'uso (in Russia) delle frequenze 5GHz e dei canali con numeri "grandi". Il trucco consiste nell'impostare il fuso orario senza utilizzare i nomi di continenti/città, ossia invece di:

# timedatectl set-timezone Europe/Moscow

Premiamo:

# timedatectl set-timezone Etc/GMT-3

E i tocchi finali alla messa a punto del sistema:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Ambiente specifico per l'utente e programmi di avvio

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

3. Estensioni CentOS

Tutto quanto detto sopra può essere considerato una guida completa per l'installazione di CentOS "vanilla" su Raspberry Pi. Dovreste ottenere un computer che si riavvia 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 della partizione /boot incompleta, ma rimaniamo onesti fino alla fine).

Per installare il software del punto di accesso Wi-Fi su questo sistema sarà necessario espandere un po' le funzionalità della distribuzione standard di CentOS. In primo luogo, "potenziamo" il driver (firmware) dell'adattatore Wi-Fi integrato. Nella pagina principale del progetto è scritto:

Wifi su Raspberry 3B e 3B+

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

Ciò che non è permesso al progetto CentOS, non è vietato a noi per uso personale. Sostituiamo il firmware Wi-Fi della distribuzione in CentOS con quello fornito dagli sviluppatori Broadcom (quei famosi e odiati blob binari…). Questo, in particolare, permetterà di utilizzare la modalità AC come punto di accesso.

Aggiornamento del firmware Wi-FiIdentifichiamo 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 il firmware è della versione 7.45.18 del 01.03.2015 e ricordiamo il seguente insieme di numeri: 43455 (brcmfmac43455-sdio.bin).

Scarichiamo l'immagine più recente di Raspbian. Chi è pigro può scrivere l'immagine su microSD e prelevare i file del firmware da lì. In alternativa, è possibile montare la partizione principale dell'immagine in Linux e copiare ciò che 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 del firmware dell'adattatore Wi-Fi devono essere copiati, sovrascrivendo quelli sulla 'raspberry' nella cartella /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.

E naturalmente 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 di rete e difficoltà imminenti

Come concordato in precedenza, la 'raspberry' è collegata 'cablata' alla rete locale. Supponiamo che anche il provider offra l'accesso a Internet in modo simile: l'indirizzo nella rete pubblica è assegnato dinamicamente dal server DHCP (potrebbe essere associato all'indirizzo MAC). In questo caso, dopo la configurazione finale della 'raspberry', è sufficiente 'inserire' il cavo del provider e il gioco è fatto. L'autenticazione tramite systemd-networkd è un argomento di un articolo a parte e non viene trattato qui.

Le interfacce Wi-Fi del Raspberry sono per la rete locale, mentre l'adattatore Ethernet integrato (eth0) è esterno. Numeriamo staticamente la rete locale, ad esempio: 192.168.0.0/24. Indirizzo della 'raspberry': 192.168.0.1. Nella rete esterna (Internet) funzionerà un server DHCP.

Il problema della uniformità dei nomi e un noto programmatore guatemalteco — due inconvenienti che aspettano chiunque si occupi della configurazione delle interfacce di rete e dei servizi nelle distribuzioni systemd.

Il caos parallelo (una digressione lirica)Lennart Poettering ha creato il suo programma systemd molto bene. Questo systemd avvia altri programmi così velocemente che questi, non avendo il tempo di riprendersi dal fischio dell'arbitro, inciampano e cadono allo start senza neanche aver iniziato la loro corsa a ostacoli.

Ma a dire la verità, la parallelizzazione aggressiva dei processi avviati all’avvio del sistema operativo systemd è una sorta di 'ponte di asino' per i veterani del LSB sequenziale. Fortunatamente, riportare a ordine questo 'caos parallelo' si rivela un compito semplice, anche se non sempre ovvio.

Creiamo due interfacce virtuali ponte (bridge) con nomi fissi: lan e wan. Collegheremo il(i) adattatore Wi-Fi al primo, mentre al secondo collegheremo eth0 della 'Raspberry Pi'.

/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 libera dall'obbligo di suggerire al kernel di attivare l'instradamento tramite sysctl.
MACAddress= discommentiamo e modifichiamo se necessario.

Per prima cosa "colleghiamo" eth0. Ricordiamo il "problema della coerenza" e utilizziamo solo l'indirizzo MAC di questa interfaccia, che possiamo scoprire, ad esempio, in questo modo:

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

Creiamo /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Cancelliamo il file di configurazione eth0 precedente, riavviamo il "raspberry" e otteniamo l'accesso alla rete (l'indirizzo IP probabilmente cambierà):

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

5. DNSMASQ

Per creare punti di accesso Wi-Fi, nulla è migliore della dolce coppia di dnsmasq + hostapd non è stato ancora inventato. A mio avviso.

Se qualcuno ha dimenticato, allora…hostapd è un dispositivo che gestisce gli adattatori Wi-Fi (in particolare, si occuperà della loro connessione al virtuale lan «raspberry»), autorizza e registra i clienti wireless.

dnsmasq configura lo stack di rete dei clienti: assegna indirizzi IP, server DNS, gateway predefiniti e altre bellezze.

Iniziamo con dnsmasq:

# yum install dnsmasq

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

modifichiamolo a nostro 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 bind-dynamic, che indica al demone dnsmasq di attendere l'apparizione nel sistema interfaccia=lan, e non cadere in un colpo di orgoglio solitario dopo l'avvio.

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

6. HOSTAPD

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

Prima di installare hostapd, è necessario affrontare il "problema dell'uniformità". L'adattatore Wi-Fi integrato wlan0 può facilmente cambiare nome in wlan1 quando si collega un ulteriore dispositivo Wi-Fi USB. Quindi fisseremo i nomi delle interfacce in questo modo: daremo ai (wireless) adattatori nomi unici e li assoceremo agli indirizzi MAC.

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

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

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

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

[Link]
Name=wl0

Ora possiamo essere certi che wl0 — è il Wi-Fi integrato. Riavviamo il "Raspberry" per verificarlo.

Installiamo:

# 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

Non dimenticando nemmeno per un minuto la GKChP, modifichiamo i parametri necessari e verifichiamo manualmente il funzionamento:

# hostapd /etc/hostapd/hostapd.conf

hostapd si avvierà in modalità interattiva, trasmettendo sul terminal il suo stato. Se non ci sono errori, i client che supportano la modalità AC potranno già connettersi all'access point. Per fermare hostapd — Ctrl-C.

Resta da attivare hostapd nell'avvio automatico del sistema. Se procediamo con il metodo standard (systemctl enable hostapd), dopo il successivo riavvio potremmo trovare un demone "agonizzante" con diagnosi:interfaccia wl0 non trovata". Di conseguenza, il "caos parallelo" ha fatto sì che hostapd si avviasse più velocemente del kernel nel trovare l'adattatore wireless.

Su Internet si trovano molte soluzioni: da un timeout forzato prima dell'avvio del demone (per un certo numero di minuti), fino a un altro demone che monitora l'apparizione dell'interfaccia e (ri)avvia hostapd. Le soluzioni funzionano, ma sono estremamente brutte. In aiuto invocando il grande systemd con i suoi "obiettivi" e "compiti" e "dipendenze".

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

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

e portiamo il suo contenuto al seguente stato:

[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 l'interfaccia appare, il demone si avvia; quando scompare, si ferma. E il tutto avviene online — senza riavviare il sistema. Questa tecnica sarà particolarmente utile quando si connette un adattatore USB Wi-Fi a un Raspberry Pi.

Adesso si può:

# systemctl enable hostapd
# reboot

7. IPTABLES

«Cosa???» © Sì-sì! Niente systemd. Niente moderni strumenti (in forma di firewalld), che alla fine fanno solo la stessa cosa.

Usiamo il buon vecchio iptables, il cui servizio, dopo l'avvio, caricherà le regole di rete nel kernel e terminerà tranquillamente il suo lavoro, senza rimanere residente e senza consumare risorse. Systemd ha un elegante IPMasquerade=, ma per la traduzione degli indirizzi (NAT) e il firewall affidiamoci comunque a iptables.

Installiamo:

# yum install iptables-services
# systemctl enable iptables ip6tables

Preferisco conservare la configurazione di iptables in forma di 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 sopra indicato e perdiamo la possibilità di stabilire nuove connessioni SSH cablate con il "Raspberry Pi". Giusto, abbiamo creato un router Wi-Fi, il cui accesso "via Internet" è disabilitato per impostazione predefinita — ora è disponibile solo "in wireless". Colleghiamo il cavo del provider all'Ethernet e iniziamo a navigare!

8. Bonus: +2,4GHz

Quando ho assemblato il primo router Raspberry seguendo il disegno sopra descritto, ho scoperto di avere un certo numero di gadget che, a causa delle loro limitazioni costruttive, non riuscivano a vedere il "Raspberry Pi" via Wi-Fi. Riconfigurare il router per lavorare in 802.11b/g/n sarebbe stato poco sportivo, poiché la velocità massima "in wireless" in quel caso non superava i 40 Mbit, mentre il mio provider Internet preferito mi offre 100 (via cavo).

In realtà, la soluzione al problema era già stata trovata: un secondo'interfaccia Wi-Fi che opera sulla frequenza di 2,4GHz e un secondo punto di accesso. Nel chiosco più vicino ho acquistato non il primo, ma il secondo USB Wi-Fi "dongle" che mi è capitato. Il venditore era martellato da domande sul chipset, la compatibilità con i core ARM di Linux e la possibilità di operare in modalità AP (è stato lui a iniziare).

Configuriamo il «dongle» analogamente a un adattatore Wi-Fi integrato.

Per prima cosa, 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 del nuovo'interfaccia Wi-Fi a un demone separato chiamato hostapd, che verrà avviato e fermato a seconda della presenza nel sistema di un «dongle» specifico: 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 Wi-Fi USB, quindi un banale copia/incolla potrebbe deludervi.

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

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

e portiamo il suo contenuto al seguente stato:

[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

Restiamo solo da abilitare la nuova istanza di hostapd:

# systemctl enable hostapd2

Ecco fatto! Muovete il «dongle» e la «Raspberry», osservate le reti wireless attorno.

Infine, desidero avvisare sulla qualità dell’adattatore USB Wi-Fi e sull'alimentazione del Raspberry. Un 'dongle' collegato a caldo può, a volte, causare il 'blocco' del Raspberry a causa di brevi problemi elettrici.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster