Raspberry Pi + CentOS = Wi-Fi Hotspot (of een frambozenrouter met een rode hoed)

Er is een enorme hoeveelheid informatie online over het opzetten van Wi-Fi-toegangspunten met behulp van een Raspberry Pi. Meestal wordt hierbij de native besturingssysteem van de «framboos» gebruikt — Raspbian.

Als voorstander van RPM-gebaseerde systemen kon ik dit kleine wonder niet negeren en mijn favoriete CentOS erop uitproberen.

Dit artikel biedt een handleiding voor het maken van een 5GHz/AC Wi-Fi-router met een Raspberry Pi 3 Model B+ op basis van het besturingssysteem CentOS. Er zullen verschillende standaard, maar weinig bekende trucs worden behandeld, en als bonus een schema voor het aansluiten van extra Wi-Fi-apparatuur op de «framboos», waarmee deze tegelijkertijd in meerdere modi (2,4+5GHz) kan werken.

Raspberry Pi + CentOS = Wi-Fi Hotspot (of een frambozenrouter met een rode hoed)
(mix van afbeeldingen uit het publieke domein)

Laten we meteen opmerken dat je geen buitengewone snelheden kunt verwachten. Ik haal uit mijn «framboos» maximaal 100 Mbit via de lucht, en dat dekt de snelheid van mijn internetprovider. Waarom zou je zo'n trage AC willen als je theoretisch zelfs met N een halve gigabit kunt behalen? Als je je dit afvraagt, ga dan naar de winkel voor een echte router met acht externe antennes.

0. Wat je nodig hebt

  • Eigenlijk is het «frambozenproduct» van kaliber: Pi 3 Model B+ (om die felbegeerde 5GHz-snelheden en -kanalen te behalen);
  • Degelijke microSD >= 4GB;
  • Een werkstation met Linux en een microSD-lezer/-schrijver;
  • Voldoende vaardigheden in Linux; dit artikel is bedoeld voor de ervaren Geek;
  • Bedrade netwerkaansluiting (eth0) tussen de Raspberry en Linux, een werkende DHCP-server in het lokale netwerk en internettoegang op beide apparaten.

Een kleine opmerking over het laatste punt. ‘Wat kwam er eerst, het ei of…’ hoe maak je een Wi-Fi-router zonder enige toegang tot internet? Dit interessante vraagstuk laten we buiten beschouwing en gaan we er gewoon vanuit dat de Raspberry met een kabel aan het lokale netwerk is aangesloten en internettoegang heeft. In dat geval hebben we geen extra televisie of muis nodig om de «framboos» in te stellen.

1. Installatie van CentOS

Huispagina van het project

Op het moment van schrijven van dit artikel is de werkende versie van CentOS op het apparaat — 32-bit. Overal op het wereldwijde netwerk heb ik meningen gezien dat de prestaties van dergelijke besturingssystemen op een 64-bit architectuur van ARM met maar liefst 20% zouden verminderen. Dit laat ik zonder commentaar.

Op Linux downloaden we de minimale afbeelding met de kernel «-RaspberryPI-» en schrijven het naar microSD:

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

Voordat we het image gaan gebruiken, verwijderen we de SWAP-partitie, breiden we de root uit naar de volle beschikbare ruimte en schakelen we SELinux uit. Het algoritme is eenvoudig: we maken een kopie van de root op Linux, verwijderen alle partities van microSD behalve de eerste (/boot), maken een nieuwe root aan en herstellen de inhoud uit de kopie.

Voorbeeld van noodzakelijke acties (ruwe console-uitvoer)

# 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

Na het uitpakken van de inhoud van de root-partitie is het tijd om enkele wijzigingen aan te brengen.

Schakel SELinux uit in /mnt/etc/selinux/config:

SELINUX=disabled

Bewerk /mnt/etc/fstab, waarbij we alleen twee vermeldingen over partities behouden: de opstartpartitie (/boot, zonder wijzigingen) en de root (verander de UUID-waarde, die je kunt ontdekken door de uitvoer van het commando blkid op Linux te bestuderen):

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

Ten slotte wijzigingen we de opstartparameters van de kernel: we geven de nieuwe locatie van de root-partitie op, schakelen de debug-informatie uit en (optioneel) verbieden we de kernel om IPv6-adressen toe te wijzen aan netwerkinterfaces:

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

Breng de inhoud /mnt/cmdline.txt in de volgende vorm (één regel zonder afbrekingen):

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

Klaar:

# cd
# umount /mnt
# sync

Plaats de microSD in de 'malinka', start deze op en verkrijg netwerktoegang via ssh (root/centos).

2. Configuratie van CentOS

De eerste drie onwrikbare stappen: passwd, yum -y update, herstarten.

Het netwerkbeheer geven we aan networkd:

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

We maken een bestand aan (inclusief de mappen) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Herstart de 'malinka' en verkrijg weer netwerktoegang via ssh (het IP-adres kan gewijzigd worden). Let op dat er gebruik wordt gemaakt van /etc/resolv.conf, dat eerder door Network Manager is aangemaakt. Bij problemen met resolven, bewerk zijn inhoud. Gebruik systemd-resolved gaan we niet doen.

Verwijder 'overbodige' delen, repareer en versnel de opstart van het OS:

# 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

Wie nodig heeft cron en wie geen ingebouwde systemd-timers, kan de ontbrekende installeren. /var/log- en bekijken via journalctl. Als je een logboekgeschiedenis nodig hebt (standaard worden alleen gegevens vanaf het opstarten van het systeem opgeslagen):

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

Schakel het gebruik van IPv6 uit voor de belangrijkste diensten (indien nodig)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

De tijdsynchronisatie op de 'malinka' is een belangrijke zaak. Aangezien de hardware geen mogelijkheid heeft om de huidige tijd bij een herstart op te slaan, is synchronisatie nodig. Een zeer goede en snelle daemon hiervoor is chrony is al reeds geïnstalleerd en wordt automatisch gestart. Je kunt de NTP-servers wijzigen naar de dichtstbijzijnde.

/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

Voor de installatie van de tijdzone gaan we het gebruiken truc. Aangezien ons doel is om een Wi-Fi-router te maken die werkt op 5GHz-frequenties, bereiden we ons voor op verrassingen regelgever:

# yum info crda
Samenvatting: Regelgevende compliance-daemon voor 802.11 draadloze netwerken

Dit kwaadaardige ontwerp, gericht ook op de tijdzone, "verbiedt" het gebruik van (in Rusland) 5GHz-frequenties en kanalen met "grote" nummers. De truc is om de tijdzone in te stellen zonder namen van continenten/steden te gebruiken, dus in plaats van:

# timedatectl set-timezone Europe/Moscow

Drukken we in:

# timedatectl set-timezone Etc/GMT-3

En de laatste handtekeningen in de haarstijl van het systeem:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Gebruikersspecifieke omgeving en opstartprogramma's

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

3. Aanvullingen CentOS

Alles wat hierboven is gezegd, kan worden beschouwd als een afgeronde instructie voor de installatie van 'vanilla' CentOS op Raspberry Pi. Je zou een pc moeten hebben die (her)start in minder dan 10 seconden, minder dan 15 megabyte RAM gebruikt en 1,5 gigabyte microSD (eigenlijk minder dan 1 gigabyte vanwege de onvolledige /boot, maar laten we eerlijk zijn).

Voor de installatie van de software voor het Wi-Fi-toegangspunt op dit systeem is het nodig om de standaard CentOS-distributie iets uit te breiden. Eerst 'upgraden' we de driver (firmware) van de ingebouwde Wi-Fi-adapter. Op de homepage van het project staat:

Wifi op de Raspberry 3B en 3B+

De firmwarebestanden voor de Raspberry PI 3B/3B+ mogen niet door het CentOS-project worden verspreid. Je kunt de volgende artikelen gebruiken om het probleem te begrijpen, de firmware te verkrijgen en de wifi in te stellen.

Wat het CentOS-project niet mag, is ons niet verboden voor persoonlijk gebruik. We vervangen de distributie Wi-Fi-firmware in CentOS door die van de ontwikkelaars van Broadcom (dezelfde gehate binaire blobs…). Dit maakt het onder andere mogelijk om AC in de accespoint-modus te gebruiken.

Wi-Fi firmware-upgradeWe ontdekken het model van het apparaat en de huidige versie van de 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 

We zien dat de firmware versie 7.45.18 van 01.03.2015 is, en onthouden de volgende set cijfers: 43455 (brcmfmac43455-sdio.bin).

Laten we de actuele afbeelding van Raspbian downloaden. Lui kunnen de afbeelding op microSD schrijven en de bestanden met de firmware daaruit halen. Of je kunt de hoofdpartitie van de afbeelding in Linux monteren en de benodigde bestanden daaruit kopiëren:

# 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

De verkregen bestanden van de Wi-Fi-adapter-firmware moeten met vervanging naar de 'framboos' in de map worden gekopieerd. /usr/lib/firmware/brcm/

We restart the future router and smile happily:

# 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 

Version: 7.45.154 from 27.02.2018.

And of course 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. Network configuration and upcoming challenges

As agreed above, the 'raspberry' is connected 'wired' to the local network. Let's assume that the provider offers Internet access in exactly the same way: an address in the public network is issued dynamically by a DHCP server (which may be tied to the MAC). In this case, after the final setup of the 'raspberry', it's enough to 'plug in' the provider's cable, and everything is ready. Authorization via systemd-networkd is a separate topic and is not discussed here.

The Wi-Fi interface(s) on the Raspberry is the local network, while the built-in Ethernet adapter (eth0) is external. We will number the local network statically, for example: 192.168.0.0/24. The 'raspberry' address: 192.168.0.1. In the external network (Internet), a DHCP server will operate.

The issue of the uniform naming en is a well-known Guatemalan programmer — two troubles await anyone dealing with the configuration of network interfaces and services in systemd-based distributions.

Parallel chaos (a lyrical digression)Lennart Poettering wrote his program systemd very well. This systemd launches other programs so quickly that they stumble and fall at the start before even beginning their hurdle race.

But seriously, the aggressive parallelization of processes started during the boot of systemd OS serves as a kind of 'donkey bridge' for seasoned sequential LSB developers. Fortunately, bringing order to this 'parallel chaos' turns out to be simple, though not always obvious.

We create two virtual bridge interfaces with permanent names: lan en wan. We 'connect' Wi-Fi adapter(s) to the first, and eth0 of the 'raspberry' to the second.

/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 eliminates the need to hint the kernel about enabling routing via sysctl.
MACAddress= we will uncomment and change if necessary.

First, we 'connect' eth0. Remember the 'issue of uniformity' and use only the MAC address of this interface, which can be found out, for example, like this:

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

We create /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Verwijder het vorige configuratiebestand eth0, herstart de 'Raspberry Pi' en krijg netwerktoegang (het IP-adres zal hoogstwaarschijnlijk veranderen):

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

5. DNSMASQ

Voor het maken van Wi-Fi toegangspunten is er niets beter dan de gouden combinatie van dnsmasq + hostapd werd nog niet uitgevonden. Naar mijn mening.

Als iemand het vergeten is,…hostapd — dat is het ding dat Wi-Fi-adapters beheert (specifiek neemt het de taak op zich om ze te verbinden met de virtuele lan ‘Raspberry Pi’), authenticates en registreert draadloze clients.

dnsmasq — configureert de netstack van clients: geeft IP-adressen, DNS-servers, standaard gateways en dergelijke.

Laten we beginnen met dnsmasq:

# yum install dnsmasq

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

bewerk het naar eigen smaak.

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

De ‘magie’ hier ligt in de parameter bind-dynamic, die de dnsmasq daemon opdraagt om te wachten op de verschijning van interface=lan, in plaats van te flauwvallen van trots eenzaamheid na de start.

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

6. HOSTAPD

En tenslotte, de magische configuraties van hostapd. Ik twijfel er niet aan dat iemand dit artikel leest op zoek naar precies deze gewilde regels.

Voordat we hostapd installeren, moeten we strijden tegen het ‘eenvormigheidsprobleem’. De ingebouwde Wi-Fi-adapter wlan0 kan eenvoudig van naam veranderen naar wlan1 bij het aansluiten van extra USB Wi-Fi-apparatuur. Daarom zullen we de namen van de interface op de volgende manier vastleggen: we verzinnen unieke namen voor de (draadloze) adapters en koppelen ze aan MAC-adressen.

Voor de ingebouwde Wi-Fi-adapter, die nog steeds wlan0 is:

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

We create /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Nu zijn we er zeker van dat wl0 — dit is de ingebouwde Wi-Fi. Herstart de 'Raspberry Pi' om dit te bevestigen.

We installeren:

# yum install hostapd wireless-tools

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

Vergeet niet even aan de GKCHP, pas de benodigde parameters aan en controleer handmatig op functionaliteit:

# hostapd /etc/hostapd/hostapd.conf

hostapd wordt in interactieve modus gestart en toont zijn status op de console. Als er geen fouten zijn, kunnen clients die AC-modus ondersteunen verbinding maken met het toegangspunt. Gebruik Ctrl-C om hostapd te stoppen.

Het is tijd om hostapd automatisch op te starten. Als je het standaard doet (systemctl enable hostapd), kun je na de volgende herstart een 'bloedende' daemon krijgen met de diagnose 'interface wl0 niet gevonden'. Als gevolg van de 'parallelle chaos' startte hostapd sneller dan de kernel de draadloze adapter vond.

Op het internet zijn er volop oplossingen: van verplicht wachten voor de opstart van de daemon (voor een paar minuten), tot een andere daemon die de verschijning van de interface controleert en hostapd (her)start. Dit zijn functionele, maar vreselijk lelijke oplossingen. We doen een beroep op de grote systemd met zijn 'doelen' en 'taken' en 'afhankelijkheden'.

We kopiëren het distributie service-bestand naar /etc/systemd/system/hostapd.service:

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

en passen de inhoud aan naar het volgende formaat:

[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

De magie van het bijgewerkte service-bestand ligt in de dynamische koppeling van hostapd aan het nieuwe doel — de interface wl0. Bij de verschijning van de interface wordt de daemon gestart, en bij verdwijning wordt deze gestopt. En dat allemaal online — zonder systeemherstart. Deze techniek is vooral nuttig bij het aansluiten van een USB Wi-Fi adapter op de 'Raspberry Pi'.

Nu kunnen we:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Wat???" © Ja, ja! Geen systemd. Geen hippe combi's (in de vorm van firewalld), die uiteindelijk hetzelfde doen.

We gebruiken de goede oude iptables, wiens service na de opstart de netwerknormen in de kernel laadt en rustig eindigt zonder resident te blijven en geen resources te verbruiken. Systemd heeft een elegante IPMasquerade=, maar we laten de adresvertaling (NAT) en de firewall toch aan iptables over.

We installeren:

# yum install iptables-services
# systemctl enable iptables ip6tables

Ik bewaar de configuratie van iptables in de vorm van een script (voorbeeld):

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

Voer het bovenstaande script uit en verlies de mogelijkheid om nieuwe bedrade ssh-verbindingen met de 'Raspberry Pi' op te zetten. Dat klopt, we hebben een Wi-Fi router gemaakt, waarvan de toegang 'via het internet' standaard is verboden — nu alleen 'in de lucht'. Plug een kabel van de provider in de Ethernet-poort en begin met surfen!

8. Bonus: +2,4GHz

Toen ik de eerste Raspberry-router volgens het bovenstaande schema had samengesteld, ontdekte ik een aantal gadgets in mijn omgeving die vanwege hun constructieve beperkingen de Wi-Fi van de 'framboos' helemaal niet konden zien. De router opnieuw instellen op 802.11b/g/n was niet sportief, aangezien de maximale snelheid 'in de lucht' in dat geval niet meer dan 40 Mbit zou bedragen, terwijl mijn favoriete internetprovider mij 100 aanbiedt (via kabel).

Eigenlijk was de oplossing al bedacht: een tweede Wi-Fi-interface die werkt op de frequentie van 2,4 GHz en een tweede toegangspunt. In de dichtstbijzijnde winkel kocht ik niet de eerste, maar de tweede USB Wi-Fi 'dongle' die ik tegenkwam. De verkoper werd lastiggevallen met vragen over de chipset, compatibiliteit met ARM-kernen van Linux en de mogelijkheid om in AP-modus te werken (hij begon als eerste).

Laten we de 'dongle' configureren op dezelfde manier als de ingebouwde Wi-Fi-adapter.

Eerst hernoemen we deze naar 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

We laten een aparte daemon hostapd het nieuwe Wi-Fi-interface beheren, die wordt gestart en gestopt op basis van de aanwezigheid van de strikt bepaalde 'dongle' in het systeem: wl1.

Configuratiebestand /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]

De inhoud van dit bestand hangt rechtstreeks af van het model van de USB Wi-Fi-adapter, dus een simpele copy/paste kan je in de problemen brengen.

We kopiëren het distributie service-bestand naar /etc/systemd/system/hostapd2.service:

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

en passen de inhoud aan naar het volgende formaat:

[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

Het enige dat overblijft is het inschakelen van het nieuwe exemplaar van hostapd:

# systemctl enable hostapd2

Dat is alles! Trek aan de 'dongle' en de 'framboos', kijk naar de draadloze netwerken om je heen.

Tot slot wil ik waarschuwen voor de kwaliteit van de USB Wi-Fi-adapter en de voeding van de Raspberry. Een 'dongle' die warm is aangesloten, kan soms leiden tot het 'bevriezen van de framboos' door kortdurende elektrische problemen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster