Raspberry Pi + CentOS = Wi-Fi Hotspot (oder Himbeer-Router mit rotem Hut)

Im Internet gibt es eine Fülle von Informationen zur Erstellung von Wi-Fi-Hotspots auf Basis des Einplatinencomputers Raspberry. Dabei wird in der Regel das für die „Himbeere“ native Betriebssystem — Raspbian — verwendet.

Als Anhänger von RPM-basierten Systemen konnte ich an diesem kleinen Wunder nicht vorbeigehen und musste es mit meinem bevorzugten CentOS ausprobieren.

In diesem Artikel finden Sie eine Anleitung zur Einrichtung eines 5GHz/AC Wi-Fi-Routers aus dem Raspberry Pi 3 Model B+ basierend auf dem Betriebssystem CentOS. Es werden einige gängige, aber wenig bekannte Tricks vorgestellt und als Bonus ein Schaltplan für den Anschluss zusätzlicher Wi-Fi-Hardware an die „Himbeere“, die es ermöglicht, gleichzeitig in mehreren Modis (2,4+5GHz) zu arbeiten.

Raspberry Pi + CentOS = Wi-Fi Hotspot (oder Himbeer-Router mit rotem Hut)
(Mix aus Bildern aus öffentlicher Domain)

Zunächst einmal, es werden keine astronomischen Geschwindigkeiten erzielt. Ich bekomme von meinem „Raspberry“ über WLAN maximal 100 Mbit, und das entspricht der Geschwindigkeit meines Internetanbieters. Warum sollte man ein so schwaches AC verwenden, wenn man theoretisch mit N sogar eine halbe Gigabit erreichen kann? Wenn Sie sich diese Frage stellen, gehen Sie in den Laden und holen Sie sich einen richtigen Router mit acht externen Antennen.

0. Was wird benötigt

  • Das eigentliche „Himbeergerät“ im Kaliber: Pi 3 Model B+ (um die begehrten 5GHz Geschwindigkeiten und Kanäle zu erreichen);
  • Eine gute microSD >= 4GB;
  • Ein Arbeitsstation mit Linux und einem microSD-Leser/Schreiber;
  • Ausreichende Kenntnisse in Linux, der Artikel ist für den vorbereiteten Geek gedacht;
  • Kabelgebundene Netzwerkverbindung (eth0) zwischen Raspberry und Linux, ein funktionierender DHCP-Server im lokalen Netzwerk und Internetzugang von beiden Geräten.

Ein kurzer Kommentar zu Punkt eins. „Was war zuerst da, das Ei oder...“ Wie man einen Wi-Fi-Router einrichtet, wenn keinerlei Zugangsinfrastruktur zum Internet vorhanden ist? Lassen wir dieses interessante Gedankenexperiment beiseite und nehmen wir einfach an, dass der Raspberry über ein Kabel mit einem lokalen Netzwerk verbunden ist und Zugang zum Internet hat. In diesem Fall brauchen wir keinen zusätzlichen Fernseher und keine Eingabegeräte für die Konfiguration des „Malinchen“.

1. Installation von CentOS

Startseite des Projekts

Zum Zeitpunkt des Schreibens dieses Artikels ist die funktionierende Version von CentOS auf dem Gerät 32-Bit. An verschiedenen Orten im Internet habe ich die Meinung gelesen, dass solche Betriebssysteme auf einer 64-Bit-Architektur von ARM die Leistung um bis zu 20 % verringern. Diesen Punkt lasse ich ohne Kommentar.

Bei Linux laden wir das minimale Abbild mit dem Kernel „-RaspberryPI-“ herunter und schreiben es auf die microSD:

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

Bevor wir das Abbild verwenden, entfernen wir die SWAP-Partition, erweitern das Root-Dateisystem auf den gesamten verfügbaren Speicherplatz und entfernen SELinux. Der Algorithmus ist einfach: Wir erstellen eine Kopie des Roots unter Linux, löschen alle Partitionen auf der microSD außer der ersten (/boot), erstellen einen neuen Root und stellen dessen Inhalt aus der Kopie wieder her.

Beispiel notwendiger Schritte (rohe Konsolenausgabe)

# 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 es an der Zeit, einige Änderungen vorzunehmen.

Deaktivieren wir SELinux in /mnt/etc/selinux/config:

SELINUX=disabled

Bearbeiten wir /mnt/etc/fstab, wobei wir nur zwei Einträge zu den Partitionen belassen: die Boot-Partition (/boot, unverändert) und die Root-Partition (Ändern Sie den UUID-Wert, den Sie durch die Verwendung des Befehls blkid unter Linux abrufen können):

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 Kernel-Boot-Optionen: Wir geben den neuen Ort der Root-Partition an, deaktivieren die Ausgabe von Debug-Informationen und (optional) verbieten dem Kernel, IPv6-Adressen an den Netzwerkschnittstellen 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

Setzen Sie die microSD-Karte in die „Raspberry Pi“, starten Sie sie und erhalten Sie SSH-Netzwerkzugang (root/centos).

2. CentOS konfigurieren

Die ersten drei unumstößlichen Schritte: passwd, yum -y update, reboot.

Das Netzwerkmanagement übergeben wir networkd:

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

Wir erstellen eine Datei (samt Verzeichnissen) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Wir starten die „Raspberry Pi“ neu und erhalten wieder Netzwerkzugang über SSH (die IP-Adresse kann sich ändern). Bitte beachten Sie, dass die vom Network Manager erstellte Verbindung verwendet wird. /etc/resolv.confBei Problemen mit der Namensauflösung, bearbeiten Sie den Inhalt entsprechend. systemd-resolved werden wir nicht verwenden.

Wir entfernen Überflüssiges, reparieren und beschleunigen den Bootvorgang 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 braucht cron und wer die integrierten systemd-Timernicht mag, kann die fehlenden installieren. /var/log- und schauen über journalctl. Wenn Sie die Protokollhistorie benötigen (standardmäßig werden nur Informationen seit dem Systemstart gespeichert):

# 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 „Raspberry Pi“ ist wichtig. Da es „out of the box“ keine Hardware gibt, die den aktuellen Zustand der Uhr beim Neustart speichert, ist eine Synchronisierung erforderlich. Ein sehr guter und schneller Daemon dafür ist chrony — bereits installiert und wird automatisch gestartet. NTP-Server können auf die nächsten geändert werden.

/etc/chrony.conf:

server 0.de.pool.ntp.org iburst
server 1.de.pool.ntp.org iburst
server 2.de.pool.ntp.org iburst
server 3.de.pool.ntp.org iburst

Um die Zeitzone einzustellen, verwenden wir einen Trick. Da unser Ziel die Schaffung eines WLAN-Routers ist, der auf 5GHz Frequenzen arbeitet, bereiten wir uns im Voraus auf Überraschungen vor. Regulierungsbehörde:

# yum info crda
Zusammenfassung: Daemon für die Einhaltung von Vorschriften für drahtlose 802.11 Netzwerke

Dieses bösartige Konstrukt verbietet, basierend unter anderem auf der Zeitzone, die Nutzung von 5GHz Frequenzen und Kanälen mit "höheren" Nummern (in Russland). Der Trick besteht darin, die Zeitzone ohne Verwendung von Kontinent-/Stadtbezeichnungen einzustellen, also statt:

# timedatectl set-timezone Europe/Moscow

Drücken wir:

# timedatectl set-timezone Etc/GMT-3

Und die letzten Handgriffe am System:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Benutzerdefinierte Umgebung und Startprogramme

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

3. Ergänzungen zu CentOS

Alles, was oben gesagt wurde, kann als vollständige Anleitung zur Installation von "Vanilla" CentOS auf dem Raspberry Pi betrachtet werden. Sie sollten einen PC erhalten, der in weniger als 10 Sekunden (neu) startet, weniger als 15 Megabyte RAM verwendet und 1,5 Gigabyte microSD (in Wirklichkeit weniger als 1 Gigabyte aufgrund des unvollständigen /boot, aber seien wir ehrlich bis zum Ende).

Um die Software für den Wi-Fi Access Point auf diesem System zu installieren, müssen wir die Möglichkeiten der Standarddistribution von CentOS etwas erweitern. Zunächst aktualisieren wir den Treiber (Firmware) des integrierten Wi-Fi Adapters. Auf der Homepage des Projekts steht:

Wifi auf dem Raspberry 3B und 3B+

Die Firmware-Dateien für den 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 Wifi einzurichten.

Was dem CentOS Projekt nicht erlaubt ist, steht uns für den persönlichen Gebrauch nicht im Wege. Wir ersetzen die distributive Wi-Fi Firmware in CentOS durch die entsprechende von Broadcom (diese verhassten binären Blobs…). Dadurch wird es unter anderem möglich, AC im Access Point-Modus zu nutzen.

Wi-Fi Firmware-UpgradeWir ermitteln die Modellnummer 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 Zahlensetzung: 43455 (brcmfmac43455-sdio.bin).

Laden Sie das aktuelle Raspbian-Image herunter. Faulenzende können das Image auf eine microSD-Karte schreiben und die Dateien mit der Firmware direkt dort entnehmen. Alternativ kann man das Root-Verzeichnis des Images unter Linux einhängen und die benötigten Dateien von dort 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 Wi-Fi Firmware-Dateien müssen mit Ersetzung auf die "Maline" 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.

Und 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. Netzwerkconfigurations und bevorstehenden Herausforderungen

Wie bereits erwähnt, ist der 'Raspberry' per 'Kabel' mit dem lokalen Netzwerk verbunden. Nehmen wir an, dass der Anbieter Zugriff auf das Internet auf die gleiche Weise bereitstellt: Die Adresse im öffentlichen Netzwerk wird dynamisch über einen DHCP-Server zugewiesen (möglicherweise mit Bindung an die MAC-Adresse). In diesem Fall genügt es, nachdem die 'Raspberry' endgültig konfiguriert ist, das Kabel des Anbieters anzuschließen, und alles ist bereit. Die Authentifizierung über systemd-networkd — ist ein eigenes Thema und wird hier nicht behandelt.

Die Wi-Fi-Schnittstelle(n) des Raspberry — ist das lokale Netzwerk, und der integrierte Ethernet-Adapter (eth0) — ist extern. Wir nummerieren das lokale Netzwerk statisch, zum Beispiel: 192.168.0.0/24. Die Adresse des 'Raspberry': 192.168.0.1. Im externen Netzwerk (Internet) wird der DHCP-Server arbeiten.

Das Problem der einheitlichen Namensgebung und ein bekannter guatemaltekischer Programmierer — zwei Probleme, die jeden erwarten, der sich mit der Konfiguration von Netzwerkinterfaces und Diensten in systemd-Distributionen beschäftigt.

Paralleles Chaos (lyrische Abschweifung)Lennart Poettering hat sein Programm erstellt systemd sehr gut. Dieser systemd führt andere Programme so schnell aus, dass sie kaum vom Schiedsrichterpfiff erholt, stolpern und schon am Start scheitern, ohne mit ihrem Hürdenlauf zu beginnen.

Aber im Ernst, das aggressive Parallelisieren von gestarteten Prozessen beim Start des systemd-Betriebssystems fungiert als eine Art "Eselbrücke" für erfahrene, sequentielle LSB-Administratoren. Glücklicherweise stellt es sich als einfach heraus, dieses "parallel Chaos" in Ordnung zu bringen, wenn auch nicht immer auf den ersten Blick offensichtlich.

Wir erstellen zwei virtuelle Bridge-Schnittstellen mit festen Namen: lan und wan. An die erste "verbinden" wir die Wi-Fi-Adapter, an die zweite – eth0 der „Raspberry Pi“.

/etc/systemd/network/lan.netdev:

[NetDev]
Name=lan
Kind=bridge

/etc/systemd/network/lan.network:

[Match]
Name=lan

[Network]
Address=192.168.0.1/24
IPForward=yes

/etc/systemd/network/wan.netdev:

[NetDev]
Name=wan
Kind=bridge
#MACAddress=xx:xx:xx:xx:xx:xx

/etc/systemd/network/wan.network:

[Match]
Name=wan

[Network]
DHCP=ipv4
IPForward=yes

IPForward=yes verhindert die Notwendigkeit, dem Kernel über sysctl zu signalisieren, dass das Routing aktiviert werden soll.
MACAddress= entkommentieren wir und ändern es bei Bedarf.

Zunächst "verbinden" wir eth0. Denken Sie an das "Einheitlichkeitsproblem" und verwenden Sie nur die MAC-Adresse dieser Schnittstelle, die Sie zum Beispiel so herausfinden können:

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

Wir 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 „Raspberry Pi“ neu und erhalten Netzwerkzugang (die IP-Adresse wird sich wahrscheinlich ändern):

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

5. DNSMASQ

Um WLAN-Zugangspunkte zu erstellen, gibt es nichts Besseres als das süße Paar aus dnsmasq + hostapd und das ist meine persönliche Meinung.

Falls jemand es vergessen hat, …hostapd — das ist ein Programm, das die Wi-Fi-Adapter verwaltet (insbesondere kümmert es sich um die Verbindung zu der virtuellen lan „Raspberry Pi“), authentifiziert und registriert drahtlose Clients.

dnsmasq — es konfiguriert den Netzwerkstapel der Clients: es vergibt IP-Adressen, DNS-Server, Standardgateway und ähnliche Schönheiten.

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 unserem Geschmack.

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 anzeigt, dass er auf das Erscheinen des Systems warten soll interface=lan, anstatt nach dem Start vom einsamen Stolz umzufallen.

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

6. HOSTAPD

Und schließlich die magischen Konfigurationen von hostapd. Ich bin mir sicher, dass jemand diesen Artikel auf der Suche nach genau diesen geheimen Zeilen liest.

Vor der Installation von hostapd müssen wir uns mit dem "Einheitlichkeitsproblem" auseinandersetzen. Der integrierte Wi-Fi-Adapter wlan0 kann seinen Namen leicht in wlan1 ändern, wenn zusätzliches USB-Wi-Fi-Gerät angeschlossen wird. Daher werden wir die Namen der Interfaces auf folgende Weise festlegen: Wir geben (drahtlosen) Adaptern einzigartige Namen und verknüpfen sie mit den MAC-Adressen.

Für den integrierten Wi-Fi-Adapter, der momentan noch wlan0 ist:

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

Wir erstellen /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Jetzt können wir sicher sein, dass wl0 — das integrierte Wi-Fi ist. Wir starten die „Malina“ neu, um dies zu überprüfen.

Installation:

# 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

Ohne einen Moment lang an GKChP, ändern wir die benötigten Parameter und überprüfen manuell die Funktionalität:

# 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 nun Clients, die den AC-Modus unterstützen, mit dem Access Point verbinden. Zum Stoppen von hostapd drücken Sie Ctrl-C.

Jetzt muss hostapd für den Systemstart aktiviert werden. Wenn Sie es auf die Standardart tun (systemctl enable hostapd), könnte der Dienst nach einem weiteren Neustart mit dem Diagnosefehler "Schnittstelle wl0 nicht gefunden" enden. Aufgrund des "parallelen Chaos" hat hostapd schneller gestartet, als der Kernel den WLAN-Adapter gefunden hat.

Im Internet gibt es viele Lösungen: von einem erzwungenen Timeout vor dem Start des Daemons (einige Minuten) bis hin zu einem weiteren Daemon, der das Erscheinen der Schnittstelle überwacht und hostapd (neu) startet. Diese Lösungen sind durchaus funktionsfähig, aber schrecklich unansehnlich. Hier rufen wir den großen systemd mit seinen "Zielen" und "Aufgaben" und "Abhängigkeiten" zur Hilfe.

Wir kopieren die distribuierten Service-Datei nach /etc/systemd/system/hostapd.service:

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

und passen ihren Inhalt wie folgt an:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authentifizierer
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 Servicedatei liegt in der dynamischen Bindung von hostapd an das neue Ziel — das Interface wl0. Bei Auftauchen des Interfaces wird der Daemon gestartet, bei Verschwinden gestoppt. Und das alles online — ohne das System neu zu starten. Diese Technik ist besonders nützlich, wenn man einen USB-Wi-Fi-Adapter an eine 'Raspberry Pi' anschließt.

Jetzt ist es möglich:

# systemctl enable hostapd
# reboot

7. IPTABLES

„Was???“ © Ja, genau! Nichts systemd. Keine neumodischen Kombis (in Form von firewalld), die am Ende dasselbe tun.

Wir verwenden das gute alte iptables, dessen Dienste nach dem Start die Netzwerkregeln ins Kernel laden und den Betrieb ruhig beenden, ohne residuellen Betrieb und ohne Ressourcenverbrauch. Systemd hat ein elegantes IPMasquerade=, aber die Adressumsetzung (NAT) und die Firewall überlassen wir trotzdem iptables.

Installation:

# yum install iptables-services
# systemctl enable iptables ip6tables

Die Konfiguration von iptables halte ich bevorzugt 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 erwähnte Skript aus und verlieren die Möglichkeit, neue kabelgebundene SSH-Verbindungen mit dem "Raspberry" herzustellen. Das ist korrekt, wir haben einen Wi-Fi-Router hergestellt, dessen Zugang "über das Internet" standardmäßig deaktiviert ist – jetzt nur noch "over the air". Wir schließen das Kabel des Anbieters an den Ethernet-Port an und beginnen mit dem Surfen!

8. Bonus: +2,4GHz

Als ich gemäß dem obigen Plan den ersten Raspberry-Router zusammengebaut habe, stellte ich fest, dass ich einige Geräte hatte, die aufgrund ihrer Konstruktionsbeschränkungen das Wi-Fi-Signal der "Malina" überhaupt nicht sehen konnten. Es war unsportlich, den Router auf den Modus 802.11b/g/n umzustellen, da die maximale Geschwindigkeit "over the air" in diesem Fall 40 Mbit nicht überschreiten würde, während mein Lieblings-Internetprovider 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 dem nächsten Laden kaufte ich nicht den ersten, sondern den zweiten USB-Wi-Fi-"Dongle", der mir über den Weg lief. Der Verkäufer wurde mit Fragen zu Chipsatz, Kompatibilität mit ARM-Kernen von Linux und der Möglichkeit des Betriebs im AP-Modus (er hat mit den Fragen angefangen) gequält.

Konfigurieren Sie das 'Dongle' ähnlich wie einen integrierten WLAN-Adapter.

Zunächst benennen wir es 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

Die Verwaltung des neuen WLAN-Interfaces wird einem separaten Daemon namens hostapd übertragen, der abhängig vom Vorhandensein des bestimmten 'Dongles': wl1 in das System gestartet und gestoppt wird.

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-WLAN-Adapters ab, daher könnte ein einfacher Copy/Paste Sie in Schwierigkeiten bringen.

Wir kopieren die distribuierten Service-Datei nach /etc/systemd/system/hostapd2.service:

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

und passen ihren Inhalt wie folgt an:

[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

Jetzt bleibt nur noch, die neue Instanz von hostapd zu starten:

# systemctl enable hostapd2

Das war's! Ziehen Sie am 'Dongle' und an der 'Himbeere', und schauen Sie sich die drahtlosen Netzwerke um.

Zu guter Letzt möchte ich auf die Qualität des USB-Wi-Fi-Adapters und die Stromversorgung des Raspberry Pi hinweisen. Ein "Hot-Plug"-Adapter kann manchmal das System zum "Hängen" bringen, da es zu kurzzeitigen elektrischen Problemen kommen kann.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster