Su Internet ci sono enormi quantità di informazioni sulla creazione di punti di accesso Wi-Fi basati su un computer a scheda singola Raspberry. Di solito, si prevede l'utilizzo del sistema operativo nativo per la "malinconia" — Raspbian.
Essendo un sostenitore dei sistemi basati su RPM, non potevo passare accanto a questa piccola meraviglia e non provare la mia amata CentOS.
L'articolo presenta un'istruzione per la realizzazione di un router Wi-Fi 5GHz/AC con Raspberry Pi 3 Model B+ basato sul sistema operativo CentOS. Saranno presentati alcuni trucchi standard, ma poco conosciuti, e come bonus — un diagramma per il collegamento di attrezzature Wi-Fi aggiuntive alla "malinconia", che le consente di funzionare contemporaneamente in diverse modalità (2,4+5GHz).

(mix di immagini di pubblico dominio)
Facciamo subito presente che non si otterranno velocità esorbitanti. Riesco a estrarre dal mio "malinconia" al massimo 100 Mbps in wireless, e questo copre la velocità del mio provider Internet. A cosa serve un AC così fiacco, se anche con N in teoria si possono ottenere 500 Mbps? Se ti sei posto questa domanda, fai un salto al negozio per un vero router con otto antenne esterne.
0. Cosa serve
- In sostanza, il "prodotto malinconico" di calibro: Pi 3 Model B+ (per raggiungere le ambite velocità e bande a 5GHz);
- Una buona microSD >= 4GB;
- Un workstation con Linux e un lettore/scrittore microSD;
- Competenze adeguate in Linux, l'articolo è per un Geek preparato;
- Collegamento di rete cablato (eth0) tra Raspberry e Linux, server DHCP attivo nella rete locale e accesso a Internet da entrambi i dispositivi.
Un piccolo commento sull'ultimo punto. "Cosa è apparso prima, l'uovo o..." come fare un router Wi-Fi in assenza di qualsiasi attrezzatura di accesso a Internet? Lasciamo questo affascinante esercizio fuori dall'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 televisione aggiuntiva e di un dispositivo di input per configurare la "malinconia".
1. Installazione di CentOS
Al momento della scrittura di questo articolo, la versione funzionante di CentOS sul dispositivo è a 32 bit. Da qualche parte nel vasto mondo di Internet, ho visto opinioni secondo cui le prestazioni di tali sistemi su architettura ARM a 64 bit potrebbero diminuire addirittura del 20%. Lascio questo punto senza commenti.
Su Linux scarichiamo l'immagine minimale con il kernel "-RaspberryPI-» e lo registriamo 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 root all'intero spazio disponibile e disattiviamo SELinux. L'algoritmo è semplice: facciamo una copia della root su Linux, eliminiamo da microSD tutte le partizioni tranne la prima (\/boot), creiamo una nuova root e ripristiniamo il suo contenuto dalla copia.
Esempio delle azioni necessarie (output da console grezza)
# 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 root è il momento di apportare alcune modifiche.
Disattiviamo SELinux in /mnt/etc/selinux/config:
SELINUX=disabled
Modifichiamo /mnt/etc/fstab, lasciando solo due voci sulle partizioni: boot (\/boot, senza modifiche) e root (cambiamo il valore UUID che possiamo ottenere 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, modifichiamo le opzioni di avvio del kernel: specifichiamo la nuova posizione della partizione root, disattiviamo l'output delle informazioni di debug e (facoltativamente) 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
Fattoo:
# cd
# umount /mnt
# sync
Inseriamo microSD nella "malina", accendiamola e otteniamo accesso di rete tramite ssh (root\/centos).
2. Configurazione di CentOS
I primi tre movimenti fondamentali: passwd, yum -y update, reboot.
Gestiamo la rete con networkd:
# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off
Creiamo un file (insieme alle cartelle) /etc/systemd/network/eth0.network:
[Match]
Name=eth0
[Network]
DHCP=ipv4
Riavviamo la "malina" e otteniamo nuovamente accesso di rete tramite ssh (l'indirizzo IP potrebbe cambiare). Ricordate che viene utilizzato /etc/resolv.conf, creato in precedenza dal Network Manager. Pertanto, in caso di problemi con la risoluzione, modificate il suo contenuto. Non utilizzeremo systemd-resolved noi non lo faremo.
Rimuoviamo il "superfluo", ripariamo e velocizziamo l'avvio 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 sopporta i , possono installare quello mancante. /var/log- e guardiamo attraverso journalctl. Se necessitate della cronologia del registro (per impostazione predefinita vengono memorizzate solo le informazioni dal momento dell'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'ora sulla "malina" è una cosa importante. Poiché "out of the box" manca la possibilità hardware di mantenere lo stato attuale dell'orologio al riavvio, è necessaria una sincronizzazione. Un demone molto buono e veloce per questo è — chrony è già installato e si avvia automaticamente. È possibile modificare i server NTP ai 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 utilizzeremo un trucco. Poiché il nostro obiettivo è creare un router Wi-Fi che funzioni a 5GHz, ci prepariamo in anticipo a sorprese regolatore:
# yum info crda
Riepilogo: Daemon di conformità alle normative per reti wireless 802.11
Questa malvagia costruzione, tenendo conto anche del fuso orario, "vietando" l'uso (in Russia) delle frequenze 5GHz e dei canali con numeri "elevati". Il trucco consiste nell'impostare il fuso orario senza utilizzare i nomi dei continenti/città, quindi invece di:
# timedatectl set-timezone Europe/Moscow
Premiamo:
# timedatectl set-timezone Etc/GMT-3
E le ultime rifiniture nello styling del sistema:
# hostnamectl set-hostname router
/root/.bash_profile:
. . .
# Ambiente specifico dell'utente e programmi di avvio
export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin
3. Aggiunte CentOS
Tutto quello che è stato detto sopra può essere considerata una guida completa all'installazione di CentOS "vanilla" su Raspberry Pi. Dovresti ottenere un PC che si (ri)avvia in meno di 10 secondi, utilizza meno di 15 Megabyte di memoria RAM e 1.5 Gigabyte di microSD (in realtà meno di 1 Gigabyte a causa del /boot incompleto, ma restiamo onesti fino alla fine).
Per installare il software del punto di accesso Wi-Fi su questo sistema sarà necessario espandere un po' le capacità della distribuzione standard di CentOS. Prima di tutto aggiorniamo i driver (firmware) dell'adattatore Wi-Fi integrato. Sulla pagina principale del progetto si dice:
Wifi sul Raspberry 3B e 3B+
I file del firmware Raspberry PI 3B/3B+ non possono essere distribuiti dal progetto CentOS. Puoi usare i seguenti articoli per capire il problema, ottenere il firmware e configurare il wifi.
Ciò che non è consentito al progetto CentOS non è vietato a noi per uso personale. Sostituiamo il firmware Wi-Fi della distribuzione in CentOS con quello corrispondente degli sviluppatori Broadcom (quei famosi blob binari…). Questo consentirà, tra l'altro, di utilizzare AC in modalità punto di accesso.
Aggiornamento del firmware Wi-FiScopriamo 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 versione 7.45.18 del 01.03.2015, e ricordiamo il seguente insieme di numeri: 43455 (brcmfmac43455-sdio.bin).
. I pigri possono scrivere l'immagine su microSD e prelevare da lì i file del firmware. Oppure è possibile montare la partizione root 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 ottenuti devono essere copiati sostituendo la 'malina' nella directory /usr/lib/firmware/brcm/
Riavviamo il futuro router e sorridiamo felici:
# 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 sopra, la «malinka» è collegata via cavo alla rete locale. Supponiamo che anche il fornitore offra accesso a Internet nello stesso modo: l'indirizzo nella rete pubblica è assegnato dinamicamente dal server DHCP (potrebbe essere legato a MAC). In questo caso, dopo aver finalizzato la configurazione della «malinka», è sufficiente collegare il cavo del fornitore e tutto è pronto. L'autenticazione tramite systemd-networkd — è un argomento di un articolo a parte e non verrà trattato qui.
Le interfacce Wi-Fi del Raspberry sono la rete locale, mentre l'adattatore Ethernet integrato (eth0) è esterno. Numeriamo staticamente la rete locale, per esempio: 192.168.0.0/24. Indirizzo della «malinka»: 192.168.0.1. Nella rete esterna (Internet) funzionerà il server DHCP.
e — sono 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, senza neppure realizzare di essere stati spinti dalla partenza, inciampano e cadono prima di iniziare a correre il loro ostacolo.
Ma, a dire il vero, la parallelizzazione aggressiva dei processi avviati all'avvio del sistema operativo systemd è una sorta di "ponte degli asini" per i seriosi sviluppatori LSB. Fortunatamente, mettere in ordine questo "caos parallelo" si rivela piuttosto semplice, anche se non sempre ovvio.
Creiamo due interfacce virtuali di bridge con nomi fissi: lan e wan. Collegheremo il primo all'adattatore Wi-Fi, il secondo a eth0 della «malinka».
/etc/systemd/network/lan.netdev:
[NetDev]
Name=lan
Kind=bridge
/etc/systemd/network/lan.network:
[Match]
Name=lan
[Network]
Address=192.168.0.1/24
IPForward=yes
/etc/systemd/network/wan.netdev:
[NetDev]
Name=wan
Kind=bridge
#MACAddress=xx:xx:xx:xx:xx:xx
/etc/systemd/network/wan.network:
[Match]
Name=wan
[Network]
DHCP=ipv4
IPForward=yes
IPForward=yes elimina la necessità di indicare al kernel tramite sysctl di attivare il routing.
MACAddress= scommentiamo e modifichiamo se necessario.
Per prima cosa colleghiamo eth0. Ricordiamoci del "problema della coerenza" e utilizziamo solo l'indirizzo MAC di questa interfaccia, che possiamo conoscere, 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
Rimuoviamo il file di configurazione precedente di eth0, riavviamo il «Raspberry» e otteniamo accesso di rete (l'indirizzo IP probabilmente cambierà):
# rm -fv /etc/systemd/network/eth0.network
# reboot
5. DNSMASQ
Per la creazione di punti di accesso Wi-Fi, non c'è nulla di meglio della dolce coppia di . La cosa più interessante e nuova per me è stata la causa del significante aumento del traffico delle richieste DNS. Di questo e di cosa fare al riguardo parla il mio post. + hostapd non è stato ancora inventato. A mio parere.
Se qualcuno ha dimenticato, allora… — è un componente che gestisce gli adattatori Wi-Fi (in particolare, si occuperà di collegarli a lan «Raspberry» virtuale), autentica e registra i client wireless.
— configura lo stack di rete dei client: assegna indirizzi IP, server DNS, gateway predefinito e altre simili meraviglie.
Cominciamo 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 risiede nel parametro bind-dynamic, che indica al demone dnsmasq di attendere l'apparizione nell sistema interface=lan, e non di andare in crisi da solo dopo l'avvio.
# systemctl enable dnsmasq
# systemctl start dnsmasq; journalctl -f
6. HOSTAPD
Infine, le magiche configurazioni di hostapd. Non ho dubbi che qualcuno legga questo articolo in cerca proprio di queste righe preziose.
Prima di installare hostapd, dobbiamo affrontare il «problema dell'uniformità». L'adattatore Wi-Fi integrato wlan0 può facilmente cambiare nome in wlan1 quando si collega un dispositivo Wi-Fi USB aggiuntivo. Quindi fissiamo i nomi delle interfacce in questo modo: creiamo nomi unici per gli adattatori (wireless) e li colleghiamo 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 saremo sicuri che wl0 — è il Wi-Fi integrato. Riavviamo il «Raspberry» per verificare.
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 per un minuto il , modifichiamo i parametri necessari e verifichiamo manualmente il funzionamento:
# hostapd /etc/hostapd/hostapd.conf
hostapd verrà avviato in modalità interattiva, trasmettendo il suo stato sulla console. Se non ci sono errori, i client compatibili col modo AC potranno già connettersi al punto di accesso. Per fermare hostapd — Ctrl-C.
Resta da attivare hostapd all'avvio del sistema. Se si procede in modo standard (systemctl enable hostapd), dopo un successivo riavvio si potrebbe trovare un demone "sdraiato nel sangue" con la diagnosi "interfaccia wl0 non trovata". Di conseguenza, a causa di un "caos parallelo", hostapd è partito prima che il kernel trovasse l'adattatore wireless.
Su Internet ci sono molte soluzioni: da un timeout forzato prima dell'avvio del demone (di alcuni minuti), a un altro demone che monitora l'apparizione dell'interfaccia e (ri)avvia hostapd. Le soluzioni funzionano, ma sono terribilmente poco eleganti. Chiediamo aiuto al grande systemd con i suoi "obiettivi" e "compiti" delle "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 modifichiamo il suo contenuto nel modo seguente:
[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 consiste nel legare dinamicamente hostapd al nuovo obiettivo: l'interfaccia wl0. All'apparizione dell'interfaccia, il demone si avvia, quando scompare, si arresta. E tutto questo in tempo reale — senza riavviare il sistema. Questa tecnica sarà particolarmente utile quando si collega un adattatore USB Wi-Fi a un "raspberry".
Ora possiamo:
# systemctl enable hostapd
# reboot
7. IPTABLES
"Cosa???" © Sì-sì! Niente systemd. Niente moderni macchinari (come firewalld), che alla fine fanno tutte la stessa cosa.
Utilizziamo il buon vecchio iptables, il cui servizio, dopo l'avvio, caricherà nel kernel le regole di rete e terminerà tranquillamente il suo lavoro, senza restare residente e senza consumare risorse. Systemd ha un elegante IPMasquerade=, ma lasceremo la traduzione degli indirizzi (NAT) e il firewall a iptables.
Installiamo:
# yum install iptables-services
# systemctl enable iptables ip6tables
Preferisco conservare la configurazione di iptables sotto 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 e perdiamo la possibilità di stabilire nuove connessioni ssh cablate con il "raspberry". Esatto, abbiamo realizzato un router Wi-Fi, l'accesso al quale "via Internet" è disabilitato per impostazione predefinita — ora solo "via etere". 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 a disposizione un certo numero di gadget che, a causa delle loro limitazioni costruttive, non riuscivano a vedere affatto la «malina» tramite Wi-Fi. Riconfigurare il router per funzionare in 802.11b/g/n non sarebbe stato sportivo, dato che la massima velocità «in aria» in tal 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, operante sulla frequenza di 2.4GHz, e un secondo punto di accesso. Nel negozio più vicino ho acquistato non il primo, ma il secondo USB Wi-Fi «dongle» che mi è capitato sottomano. Il venditore è stato assalito da domande sul chipset, sulla compatibilità con i core ARM di Linux e sulla possibilità di funzionare in modalità AP (è stato lui a iniziare).
Configuriamo il «dongle» analogamente all'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 del nuovo interfaccia Wi-Fi a un demone hostapd separato, che verrà avviato e fermato in base alla presenza nel sistema del «dongle» definito con precisione: 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 una banale copia/incolla potrebbe tradirvi.
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 modifichiamo il suo contenuto nel modo seguente:
[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 avviare una nuova istanza di hostapd:
# systemctl enable hostapd2
Ecco fatto! Scuotete il «dongle» e il «malina» stesso, e guardate le reti wireless attorno a voi.
Infine, voglio avvertirvi sulla qualità dell'adattatore USB Wi-Fi e sull'alimentazione del Raspberry. Un «dongle» collegato a caldo può talvolta causare il «blocco della malina» a causa di brevi inconvenienti elettrici.
Fonte: habr.com
