Im Internet gibt es eine große Menge an Informationen zur Erstellung von Wi-Fi-Access-Points basierend auf dem Einplatinencomputer Raspberry. In der Regel wird das Betriebssystem Raspbian verwendet, das standardmäßig für die „Himbeere“ vorgesehen ist.
Als Anhänger von RPM-basierten Systemen konnte ich an diesem kleinen Wunder nicht vorbeigehen und es nicht mit meinem geliebten CentOS ausprobieren.
In diesem Artikel wird eine Anleitung zur Herstellung eines 5GHz/AC Wi-Fi-Routers aus dem Raspberry Pi 3 Model B+ mit dem Betriebssystem CentOS vorgestellt. Es wird einige Standard-, aber wenig bekannte Tricks geben, und als Bonus einen Schaltplan für den Anschluss zusätzlicher Wi-Fi-Ausrüstung an die „Himbeere“, die es ermöglicht, gleichzeitig in mehreren Modi (2,4+5GHz) zu arbeiten.

(Bildmix aus freiem Zugang)
Wir möchten gleich zu Beginn darauf hinweisen, dass es keine übermäßigen Geschwindigkeiten geben wird. Ich erziele mit meiner „Himbeere“ über Funk maximal 100 Mbit, und das deckt die Geschwindigkeit meines Internetanbieters ab. Warum so ein lahmer AC, wenn man sogar mit N theoretisch einen halben Gigabit erreichen könnte? Wenn Sie sich so eine Frage gestellt haben, dann gehen Sie in den Laden und holen sich einen richtigen Router mit acht externen Antennen.
0. Was wird benötigt
- Eigentlich das „Himbeerenprodukt“ Kaliber: Pi 3 Model B+ (um die begehrten 5GHz-Geschwindigkeiten und Kanäle zu erreichen);
- Gute microSD >= 4GB;
- Arbeitsstation mit Linux und microSD-Lese-/Schreibgerät;
- Ausreichende Skills in Linux, der Artikel ist für den fortgeschrittenen Geek;
- Kabelgebundene Netzwerkverbindung (eth0) zwischen Raspberry und Linux, funktionierender DHCP-Server im lokalen Netzwerk und Internetzugang von beiden Geräten.
Ein kleiner Kommentar zu diesem Punkt. „Was war zuerst, das Ei oder…“ wie macht man einen Wi-Fi-Router, wenn kein Internetzugangsgerät vorhanden ist? Lassen wir diese interessante Übung für den Rahmen des Artikels beiseite und nehmen einfach an, dass der Raspberry über Kabel mit dem lokalen Netzwerk verbunden ist und Internetzugang hat. In diesem Fall benötigen wir keinen zusätzlichen Fernseher und Eingabegerät zur Konfiguration der „Himbeere“.
1. Installation von CentOS
Zum Zeitpunkt des Schreibens dieses Artikels ist die funktionierende Version von CentOS auf dem Gerät 32-Bit. Irgendwo im Internet habe ich Meinungen über eine verringerte Leistungsfähigkeit solcher Betriebssysteme auf einer 64-Bit-ARM-Architektur gesehen, die um bis zu 20 % reichen. Ich lasse diesen Punkt ohne Kommentar.
Laden Sie unter Linux das minimale Image mit dem Kernel „-RaspberryPI-“ herunter und schreiben Sie es auf eine microSD:
# xzcat CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz |
dd of=/dev/mmcblk0 bs=4M
# sync
Vor der Verwendung des Images löschen wir die SWAP-Partition, erweitern das Root-Verzeichnis auf den gesamten verfügbaren Speicher und entfernen SELinux. Der Algorithmus ist einfach: Wir erstellen eine Kopie des Root-Verzeichnisses unter Linux, löschen alle Partitionen auf der microSD außer der ersten (\/boot), erstellen ein neues Root-Verzeichnis und stellen dessen Inhalt aus der Kopie wieder her.
Beispiel notwendiger Aktionen (roh Ausgabe des Konsolenbereichs)
# 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
Nach dem Entpacken des Inhalts der Root-Partition ist der richtige Zeitpunkt, einige Änderungen vorzunehmen.
Wir deaktivieren SELinux in /mnt/etc/selinux/config:
Um es zu deaktivieren, ändern Sie den SELINUX-Wert wie folgt:
Bearbeiten wir /mnt/etc/fstab, wobei wir nur zwei Einträge über die Partitionen belassen: die Boot-Partition (\/boot, unverändert) und die Root-Partition (ändern Sie den Wert UUID, der durch die Ausgabe des Befehls blkid unter Linux ermittelt werden kann):
UUID=6a1a0694-8196-4724-a58d-edde1f189b31 \/ ext4 defaults,noatime 0 0
UUID=6938-F4F2 \/boot vfat defaults,noatime 0 0
Schließlich ändern wir die Bootparameter des Kernels: Wir geben den neuen Speicherort der Root-Partition an, deaktivieren die Ausgabe von Debug-Informationen und (optional) verbieten dem Kernel, IPv6-Adressen für die Netzwerkinterfaces zuzuweisen:
# cd
# umount /mnt
# mount /dev/mmcblk0p1 /mnt
Wir bringen den Inhalt /mnt/cmdline.txt in die folgende Form (eine Zeile ohne Umbrüche):
root=\/dev\/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet ipv6.disable_ipv6=1
Fertig:
# cd
# umount /mnt
# sync
Stecken Sie die microSD in die „Maline“, starten Sie sie und erhalten Sie Zugang über ssh (root\/centos).
2. Konfiguration von CentOS
Die ersten drei unveränderlichen Schritte: passwd, yum -y update, neu starten.
Das Netzwerkmanagement übernehmen wir networkd:
# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off
Wir erstellen eine Datei (mit den Verzeichnissen) /etc/systemd/network/eth0.network:
[Match]
Name=eth0
[Network]
DHCP=ipv4
Wir starten die „Maline“ neu und erhalten wieder Zugang über ssh (die IP-Adresse kann sich ändern). Beachten Sie, dass dies verwendet wird /etc/resolv.conf, das zuvor vom Netzwerkmanager erstellt wurde. Falls es Probleme mit der Auflösung gibt, bearbeiten Sie dessen Inhalt. Wir werden systemd-resolved nicht verwenden.
Wir entfernen „Überflüssiges“, reparieren und beschleunigen das Booten des Betriebssystems:
# 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
Wer benötigt Cron und wer die integrierten , kann die fehlenden installieren. /var/log-und wir sehen es durch journalctl. Wenn eine Historie des Journals benötigt wird (es werden standardmäßig nur Daten seit dem Systemstart aufbewahrt):
# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf
Deaktivieren Sie die Verwendung von IPv6 durch die Hauptdienste (falls erforderlich)/etc/ssh/sshd_config:
AddressFamily inet
/etc/sysconfig/chronyd:
OPTIONS="-4"
Die Aktualität der Zeit auf der "Malinke" ist eine wichtige Sache. Da es "out of the box" keine Hardware gibt, um den aktuellen Zustand der Uhr beim Neustart zu speichern, ist eine Synchronisation erforderlich. Ein sehr guter und schneller Daemon dafür ist chrony — der bereits installiert ist und automatisch gestartet wird. Die NTP-Server können auf die nächstgelegenen geändert werden.
/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
Für die Einstellung der Zeitzone werden wir einen Trickverwenden. Da unser Ziel darin besteht, einen WLAN-Router zu erstellen, der auf 5GHz Frequenzen arbeitet, bereiten wir uns im Voraus auf Überraschungen vor des Regulators:
# yum info crda
Zusammenfassung: Daemon zur regulatorischen Einhaltung für drahtloses Networking 802.11
Diese bösartige Konstruktion erlaubt, orientiert sich unter anderem an der Zeitzone, die Verwendung von 5GHz Frequenzen und „hohe“ Kanalnummern (in Russland) "verboten". Der Trick besteht darin, die Zeitzone ohne Verwendung von Kontinentnamen/Städten festzulegen, das heißt anstelle von:
# timedatectl set-timezone Europe/Moscow
Wir drücken hinein:
# timedatectl set-timezone Etc/GMT-3
Und die finalen Schliffe im System:
# hostnamectl set-hostname router
/root/.bash_profile:
. . .
# Benutzerspezifische Umgebung und Startprogramme
export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin
3. CentOS Ergänzungen
Alles, was oben gesagt wurde, kann als vollständige Anleitung zur Installation von "vanilla" CentOS auf dem Raspberry Pi angesehen werden. Sie sollten einen PC haben, der in weniger als 10 Sekunden neu startet, weniger als 15 Megabyte RAM verwendet und 1,5 Gigabyte microSD (tatsächlich weniger als 1 Gigabyte wegen des unvollständigen /boot, aber seien wir ehrlich bis zum Ende).
Um die Software für den WLAN-Zugangspunkt auf diesem System zu installieren, müssen wir die Funktionen der Standarddistribution von CentOS etwas erweitern. Zunächst werden wir den Treiber (die Firmware) des integrierten WLAN-Adapters aufrüsten. Auf der Homepage des Projekts steht:
Wifi auf dem Raspberry 3B und 3B+
Die Firmware-Dateien für Raspberry PI 3B/3B+ dürfen vom CentOS-Projekt nicht verteilt werden. Sie können die folgenden Artikel verwenden, um das Problem zu verstehen, die Firmware zu erhalten und das WLAN einzurichten.
Was dem CentOS-Projekt nicht erlaubt ist, ist uns für dieprivate Nutzung nicht untersagt. Wir ersetzen die distributive WLAN-Firmware in CentOS durch die entsprechende von Broadcom-Entwicklern (die gleichen verhassten Binärblobs…). Dies wird unter anderem die Nutzung von AC im Access-Point-Modus ermöglichen.
WLAN-Firmware-UpgradeWir ermitteln das Modell des Geräts und die aktuelle Firmware-Version:
# 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
Wir sehen, dass die Firmware-Version 7.45.18 vom 01.03.2015 vorliegt und merken uns die folgende Zahlenfolge: 43455 (brcmfmac43455-sdio.bin).
. Fauler können das Abbild auf microSD speichern und die Dateien mit der Firmware von dort abrufen. Man kann auch die Root-Partition des Abbilds unter Linux einhängen und das Nötige dorthin kopieren:
# 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
Die erhaltenen Dateien der Wi-Fi-Firmware müssen mit Ersetzung auf die „Malinka“ in das Verzeichnis kopiert werden. /usr/lib/firmware/brcm/
Wir starten den zukünftigen Router neu und lächeln zufrieden:
# 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 vom 27.02.2018.
Nun natürlich 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. Netzwerk konfigurieren und bevorstehende Schwierigkeiten
Wie bereits oben besprochen, ist die „Malinka“ mit einem Kabel an das lokale Netzwerk angeschlossen. Angenommen, auch der Anbieter bietet genau auf diese Weise Zugang zum Internet: die Adresse im öffentlichen Netzwerk wird dynamisch vom DHCP-Server zugewiesen (möglicherweise an die MAC-Adresse gebunden). In diesem Fall reicht es nach der endgültigen Konfiguration der „Malinka“, das Kabel des Anbieters einzustecken und alles ist bereit. Die Authentifizierung mit systemd-networkd — ist Thema eines separaten Artikels und wird hier nicht behandelt.
Die Wi-Fi-Schnittstelle(n) der Raspberry sind das lokale Netzwerk, während der integrierte Ethernet-Adapter (eth0) extern ist. Wir nummerieren das lokale Netzwerk statisch, zum Beispiel: 192.168.0.0/24. Die Adresse der „Malinka“: 192.168.0.1. Im externen Netzwerk (Internet) wird der DHCP-Server arbeiten.
und — zwei unangenehme Schwierigkeiten, die jeden erwarten, der mit der Konfiguration von Netzwerkschnittstellen und -diensten in systemd-Distributionen beschäftigt ist.
Paralleler Chaos (lyrische Abschweifung)Lennart Poettering hat sein Programm erstellt systemd sehr gut. Dieses systemd startet andere Programme so schnell, dass sie, bevor sie sich vom Pfiff des Schiedsrichters erholt haben, stolpern und am Start fallen, ohne ihren Hindernislauf begonnen zu haben.
Aber um es ernst zu sagen, die aggressive Parallelisierung der gestarteten Prozesse beim Start des systemd-OS ist eine Art "Eselbrücke" für eingefleischte sequenzielle LSB-Entwickler. Glücklicherweise ist es recht einfach, dieses "parallele Chaos" wieder in Ordnung zu bringen, wenn auch nicht immer offensichtlich.
Wir erstellen zwei virtuelle Brücken-Schnittstellen (bridge) mit festen Namen: lan und wan. An die erste schließen wir die Wi-Fi-Adapter an, an die zweite – eth0 der „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 entlastet uns von der Notwendigkeit, dem Kernel über sysctl zu signalisieren, dass das Routing aktiviert werden soll.
MACAddress= Entkommentieren und bei Bedarf ändern.
Zuerst "verbinden" wir eth0. Denken Sie an das "Problem der Einheitlichkeit" und verwenden Sie nur die MAC-Adresse dieses Interfaces, die man zum Beispiel so herausfinden kann:
# cat /sys/class/net/eth0/address
Erstellen /etc/systemd/network/eth.network:
[Match]
MACAddress=b8:27:eb:xx:xx:xx
[Network]
Bridge=wan
Wir entfernen die vorherige Konfigurationsdatei von eth0, starten die "Maline" neu und erhalten Zugriff auf das Netzwerk (die IP-Adresse wird wahrscheinlich geändert):
# rm -fv /etc/systemd/network/eth0.network
# reboot
5. DNSMASQ
Für die Erstellung von WLAN-Zugangspunkten gibt es nichts besseres als das süße Paar aus dnsmasq + hostapd wurde noch nicht erfunden. Meiner Meinung nach.
Falls jemand es vergessen hat, ... — ist das Ding, das die WLAN-Adapter verwaltet (insbesondere kümmert es sich um die Verbindung zu den virtuellen lan „Maline“), autorisiert und registriert drahtlose Clients.
— konfiguriert den Netzwerkstack der Clients: weist IP-Adressen, DNS-Server, Standardgateway und ähnliche Annehmlichkeiten zu.
Wir beginnen mit dnsmasq:
# yum install dnsmasq
Vorlage /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
wir bearbeiten es nach unseren Wünschen.
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
Die "Magie" liegt hier im Parameter bind-dynamic, der dem dnsmasq-Daemon sagt, dass er auf das Erscheinen in der System wartet interface=lan, anstatt ohnmächtig vor Stolz zu stürzen nach dem Start.
# systemctl enable dnsmasq
# systemctl start dnsmasq; journalctl -f
6. HOSTAPD
Und schließlich die magischen Konfigurationen von hostapd. Ich zweifle nicht daran, dass jemand diesen Artikel liest, um genau diese geheimen Zeilen zu finden.
Vor der Installation von hostapd müssen wir gegen das "Problem der Einheitlichkeit" kämpfen. Der integrierte WLAN-Adapter wlan0 kann seinen Namen leicht in wlan1 ändern, wenn zusätzliches USB-WLAN-Equipment angeschlossen wird. Daher befestigen wir die Namen der Interfaces wie folgt: Wir denken uns einzigartige Namen für (drahtlose) Adapter aus und binden sie an MAC-Adressen.
Für den integrierten WLAN-Adapter, der noch wlan0 ist:
# cat /sys/class/net/wlan0/address
b8:27:eb:xx:xx:xx
Erstellen /etc/systemd/network/wl0.link:
[Match]
MACAddress=b8:27:eb:xx:xx:xx
[Link]
Name=wl0
Jetzt sind wir uns sicher, dass wl0 — das integrierte WLAN ist. Wir starten die "Maline" neu, um uns davon zu überzeugen.
Wir installieren:
# yum install hostapd wireless-tools
Konfigurationsdatei /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
Denken Sie nicht einmal für eine Minute an , wir ändern die notwendigen Parameter und überprüfen manuell die Funktionsfähigkeit:
# hostapd /etc/hostapd/hostapd.conf
hostapd wird im interaktiven Modus gestartet und gibt seinen Status auf der Konsole aus. Wenn keine Fehler auftreten, können sich bereits Clients, die den AC-Modus unterstützen, mit dem Access Point verbinden. Um hostapd zu stoppen – Ctrl-C.
Nun bleibt es, hostapd in den Systemstart einzufügen. Wenn man es standardmäßig macht (systemctl enable hostapd), kann nach dem nächsten Neustart ein „blutüberströmter“ Dämon mit der Diagnose „Schnittstelle wl0 nicht gefunden„ entstehen. Das Ergebnis des „parallel Chaos“ war, dass hostapd schneller gestartet wurde, als der Kernel den drahtlosen Adapter fand.
Im Internet gibt es viele Lösungen: von einem erzwungenen Timeout vor dem Start des Dämonen (einige Minuten) bis zu einem weiteren Dämon, der das Erscheinen der Schnittstelle überwacht und hostapd (neu) startet. Diese Lösungen funktionieren gut, sind aber äußerst unschön. Wir rufen den großen systemd mit seinen „Zielen“ und „Aufgaben“ „Abhängigkeiten“ zur Hilfe.
Wir kopieren die distributive service-Datei nach /etc/systemd/system/hostapd.service:
# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system
und bringen ihren Inhalt in die folgende Form:
[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
Die Magie der aktualisierten Service-Datei besteht in der dynamischen Bindung von hostapd an das neue Ziel – die Schnittstelle wl0. Bei Erscheinen der Schnittstelle wird der Dämon gestartet, bei Verschwinden wird er gestoppt. Und das alles online – ohne das System neu zu starten. Diese Technik wird besonders nützlich sein, wenn man einen USB-WLAN-Adapter an die „Raspberry Pi“ anschließt.
Jetzt können wir:
# systemctl enable hostapd
# reboot
7. IPTABLES
„Was???“ © Ja, genau! Keinerlei systemd. Keine modischen Kombi-Lösungen (in Form von firewalld), die letztendlich dasselbe tun.
Wir verwenden das gute alte iptables, dessen Dienst nach dem Start die Netzwerkregeln in den Kernel lädt und nach getaner Arbeit beendet, ohne resident zu bleiben und Ressourcen zu verbrauchen. systemd hat eine elegante IPMasquerade=, aber die Adressübersetzung (NAT) und die Firewall überlassen wir lieber iptables.
Wir installieren:
# yum install iptables-services
# systemctl enable iptables ip6tables
Die Konfiguration von iptables bewahre ich gerne in Form eines Skripts (Beispiel):
#!/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
Wir führen das oben genannte Skript aus und verlieren die Möglichkeit, neue kabelgebundene SSH-Verbindungen mit dem „Raspberry“ herzustellen. Alles richtig, wir haben einen Wi-Fi-Router hergestellt, dessen Zugang „über das Internet“ standardmäßig verboten ist — jetzt nur „über die Luft“. Wir verbinden das Kabel des Anbieters mit dem Ethernet-Port und beginnen mit dem Surfen!
8. Bonus: +2,4GHz
Als ich den ersten Raspberry-Router nach dem oben beschriebenen Plan zusammengestellt hatte, stellte ich fest, dass ich einige Geräte in meinem Haushalt hatte, die aufgrund ihrer konstruktiven Einschränkungen das Wi-Fi-Signal der „Raspberry“ überhaupt nicht sehen konnten. Es wäre unsportlich gewesen, den Router auf 802.11b/g/n umzustellen, da die maximale Geschwindigkeit „über die Luft“ in diesem Fall 40 Mbit nicht überstieg, während mein bevorzugter Internetanbieter mir 100 (über Kabel) anbietet.
Tatsächlich war die Lösung des Problems bereits gefunden: eine zweite Wi-Fi-Schnittstelle, die auf 2,4GHz arbeitet, und ein zweiter Access Point. In der nächsten Bude kaufte ich nicht den ersten, sondern den zweiten mir begegneten USB-Wi-Fi „Stick“. Der Verkäufer wurde von Fragen über den Chipsatz, die Kompatibilität mit ARM-Kernen unter Linux und die Möglichkeit, im AP-Modus zu arbeiten, geplagt (er hatte damit angefangen).
Wir konfigurieren den „Stick“ analog zum integrierten Wi-Fi-Adapter.
Zuerst benennen wir ihn um 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
Wir beauftragen einen separaten Daemon, hostapd, mit der Verwaltung der neuen Wi-Fi-Schnittstelle, der je nach Vorhandensein des genau definierten „Sticks“ in der Systemumgebung gestartet oder gestoppt wird: wl1.
Konfigurationsdatei /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]
Der Inhalt dieser Datei hängt direkt vom Modell des USB-Wi-Fi-Adapters ab, daher kann das banale Copy/Paste Sie in Schwierigkeiten bringen.
Wir kopieren die distributive service-Datei nach /etc/systemd/system/hostapd2.service:
# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system/hostapd2.service
und bringen ihren Inhalt in die folgende Form:
[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
Es bleibt nur noch, die neue Instanz von hostapd zu starten:
# systemctl enable hostapd2
Das ist alles! Ziehen Sie am „Stick“ und an der „Raspberry“, und sehen Sie sich die drahtlosen Netzwerke um Sie herum an.
Und zuletzt möchte ich vor der Qualität des USB-Wi-Fi-Adapters und der Stromversorgung der Raspberry warnen. Ein „Stick“, der „hot-plugged“ angeschlossen wird, kann gelegentlich die „Raspberry“ wegen kurzzeitiger elektrischer Probleme zum Absturz bringen.
Quelle: habr.com
