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).

(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
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 , 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).
. 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.
e — 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… è 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.
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 , 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
