Raspberry Pi + CentOS = Hotspot Wi-Fi (o un router Raspberry Pi con un 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 lasciarmi sfuggire questo piccolo miracolo e non provare il mio preferito su di esso CentOS.

Questo articolo fornisce istruzioni su come costruire un router Wi-Fi 5GHz/AC da un Raspberry Pi 3 Model B+ con sistema operativo CentOSVerranno illustrati diversi trucchi standard, ma poco conosciuti, e, come bonus, uno schema per collegare ulteriori dispositivi Wi-Fi al Raspberry Pi, consentendogli di operare simultaneamente in più modalità (2,4 + 5 GHz).

Raspberry Pi + CentOS = Hotspot Wi-Fi (o un router Raspberry Pi con un 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 Linux e lettore/scrittore di schede microSD;
  • Possedere competenze sufficienti in Linux, articolo - per il geek preparato;
  • Connettività di rete cablata (eth0) tra Raspberry e Linux, un server DHCP funzionante 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. Installazione CentOS

Home page del progetto

Al momento della stesura di questo articolo, la versione di lavoro CentOS Il dispositivo utilizza un sistema a 32 bit. Ho letto online che le prestazioni di tali sistemi operativi su architettura ARM a 64 bit diminuiscono fino al 20%. Non mi pronuncio ulteriormente su questo punto.

Su Linux-e 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 utilizzare l'immagine, rimuoveremo la partizione SWAP, espanderemo la root all'intero volume disponibile e ci libereremo di SE.LinuxL'algoritmo è semplice: creiamo una copia della radice su Linux, elimina tutte le partizioni dalla microSD tranne la prima (/boot), crea una nuova partizione root e ripristina il suo 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 в /mnt/etc/selinux/config:

SELINUX=disabled

La modifica /mnt/etc/fstab, lasciando in esso solo due voci relative alle partizioni: boot (/boot, invariato) e root (cambiamo il valore UUID, che può essere scoperto esaminando l'output del comando blkid su Linux-e):

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

Spostiamo la microSD nel Raspberry Pi, lo avviamo e otteniamo l'accesso alla rete tramite ssh (root/centos).

2. Installazione 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. Aggiunte CentOS

Tutto quanto detto sopra può essere considerato un'istruzione completa per l'installazione "vanilla" CentOS su un Raspberry Pi. Dovresti ottenere un PC che si (ri)avvia in meno di 10 secondi, utilizza meno di 15 megabyte di RAM e 1.5 gigabyte di scheda 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, sarà necessario espandere leggermente le funzionalità della distribuzione standard. CentOSInnanzitutto, aggiorniamo il driver (firmware) per l'adattatore Wi-Fi integrato. La pagina web del progetto afferma:

Wifi sul Raspberry 3B e 3B+

Non è consentito distribuire i file del firmware Raspberry PI 3B/3B+ CentOS Progetto. Puoi utilizzare i seguenti articoli per comprendere il problema, ottenere il firmware e configurare il Wi-Fi.

Cosa non è consentito fare al progetto CentOS, quindi non ci è vietato utilizzarlo per uso personale. Stiamo sostituendo il firmware Wi-Fi di distribuzione in CentOS alla corrispondente versione degli sviluppatori Broadcom (quei soliti odiati blob binari...). Questo, in particolare, permetterà di utilizzare l'AC in modalità punto di accesso.

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 correnteChi è pigro può masterizzare l'immagine su una microSD ed estrarre i file del firmware da lì. In alternativa, è possibile montare la partizione root dell'immagine in Linux e copia 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 realtà, una soluzione era già stata ideata: una seconda interfaccia Wi-Fi operante a 2,4 GHz e un secondo punto di accesso. Presso un chiosco lì vicino, ho acquistato non la prima, ma la seconda chiavetta Wi-Fi USB che ho trovato. Il commesso mi assillava con domande sul chipset e sulla sua compatibilità con i core ARM. Linux e riguardo alla possibilità di lavorare in modalità AP (è stato lui a iniziare per primo).

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

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