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

Im Internet gibt es zahlreiche Informationen zum Erstellen von WLAN-Zugangspunkten auf Basis eines Raspberry-Single-Board-PCs. In der Regel bedeutet dies, dass das Raspberry-native Betriebssystem Raspbian zum Einsatz kommt.

Als Anhänger RPM-basierter Systeme konnte ich an diesem kleinen Wunder nicht vorbeigehen und mein geliebtes CentOS nicht darauf ausprobieren.

Der Artikel enthält Anweisungen zum Erstellen eines 5-GHz/AC-WLAN-Routers aus einem Raspberry Pi 3 Model B+ basierend auf dem CentOS-Betriebssystem. Es wird mehrere standardmäßige, aber wenig bekannte Tricks geben und als Bonus eine Zeichnung zum Anschließen zusätzlicher Wi-Fi-Geräte an den Raspberry, sodass dieser gleichzeitig in mehreren Modi (2,4 + 5 GHz) arbeiten kann.

Raspberry Pi + CentOS = Wi-Fi Hotspot (oder Himbeer-Router mit rotem Hut)
(Mischung aus frei verfügbaren Bildern)

Beachten wir gleich, dass einige kosmische Geschwindigkeiten nicht funktionieren. Ich quetsche per Funk maximal 100 Mbit/s aus meinem Raspberry heraus, das deckt die Geschwindigkeit meines Internetproviders ab. Warum braucht man so einen trägen AC, wenn man theoretisch sogar mit N ein halbes Gigabit erreichen kann? Wenn Sie sich diese Frage gestellt haben, dann gehen Sie in den Laden, um einen echten Router mit acht externen Antennen zu kaufen.

0. Was Sie brauchen

  • Tatsächlich ist das „Himbeerprodukt“ selbst von Kaliber: Pi 3 Model B+ (um die begehrten 5-GHz-Geschwindigkeiten und Kanäle zu erreichen);
  • Gute microSD >= 4GB;
  • Workstation mit Linux und microSD-Lese-/Schreibgerät;
  • Verfügbarkeit ausreichender Linux-Kenntnisse; der Artikel richtet sich an einen geschulten Geek;
  • Kabelgebundene Netzwerkverbindung (eth0) zwischen Raspberry und Linux, laufender DHCP-Server im lokalen Netzwerk und Internetzugang von beiden Geräten.

Ein kleiner Kommentar zum letzten Punkt. „Was war zuerst da, das Ei oder …“ Wie baut man einen WLAN-Router, wenn keine Geräte für den Internetzugang vorhanden sind? Lassen wir diese unterhaltsame Übung über den Rahmen des Artikels hinaus und gehen einfach davon aus, dass der Raspberry per Kabel mit dem lokalen Netzwerk verbunden ist und Zugang zum Internet hat. In diesem Fall benötigen wir keinen zusätzlichen Fernseher und keinen Manipulator, um die „Himbeere“ einzurichten.

1. Installieren Sie CentOS

Projekthomepage

Zum Zeitpunkt des Schreibens dieses Artikels ist die laufende Version von CentOS auf dem Gerät eine 32-Bit-Version. Irgendwo im World Wide Web bin ich auf Meinungen gestoßen, dass die Leistung solcher Betriebssysteme auf der 64-Bit-ARM-Architektur um bis zu 20 % sinkt. Ich werde diesen Moment kommentarlos verlassen.

Laden Sie unter Linux das Minimal-Image mit dem Kernel herunter.-RaspberryPI-„und schreibe es auf microSD:

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

Bevor wir mit der Verwendung des Images beginnen, entfernen wir die SWAP-Partition, erweitern das Stammverzeichnis auf das gesamte verfügbare Volume und entfernen SELinux. Der Algorithmus ist einfach: Erstellen Sie eine Kopie des Stammverzeichnisses unter Linux, löschen Sie alle Partitionen von der microSD bis auf die erste (/boot), erstellen Sie ein neues Stammverzeichnis und geben Sie dessen Inhalt aus der Kopie zurück.

Beispiel für erforderliche Aktionen (schwerwiegende 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

Nachdem Sie den Inhalt der Root-Partition entpackt haben, ist es an der Zeit, einige Änderungen daran vorzunehmen.

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

SELINUX=disabled

Bearbeitung /mnt/etc/fstab, wobei nur zwei Einträge zu den Partitionen übrig bleiben: boot (/boot, keine Änderungen) und root (wir ändern den UUID-Wert, den Sie herausfinden können, indem Sie die Ausgabe des blkid-Befehls unter Linux studieren):

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

Abschließend ändern wir die Boot-Parameter des Kernels: Wir geben einen neuen Speicherort für die Root-Partition an, deaktivieren die Ausgabe von Debugging-Informationen und verbieten (optional) dem Kernel die Vergabe von IPv6-Adressen an Netzwerkschnittstellen:

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

Hier ist der Inhalt /mnt/cmdline.txt in folgender Form (eine Zeile ohne Bindestriche):

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

Erledigt:

# cd
# umount /mnt
# sync

Wir ordnen die microSD in die „Himbeere“ um, starten sie und erhalten über ssh (root/centos) Netzwerkzugriff darauf.

2. CentOS einrichten

Die ersten drei unerschütterlichen Bewegungen: passwd, Yum -y aktualisieren, rebooten.

Wir verschenken Netzwerkmanagement Netzwerkd:

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

Erstellen Sie eine Datei (zusammen mit Verzeichnissen) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Wir starten die „Himbeere“ neu und erhalten per SSH erneut Netzwerkzugriff darauf (die IP-Adresse kann sich ändern). Achten Sie darauf, was verwendet wird / Etc / resolv.conf, zuvor von Network Manager erstellt. Bearbeiten Sie daher bei Problemen mit der Lösung den Inhalt. Verwenden systemd aufgelöst wir werden nicht.

Wir entfernen das „Unnötige“, reparieren und beschleunigen das Laden 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 verdaut das Eingebaute nicht Systemd-Timer, kann feststellen, was fehlt. / var / log- und durchschauen journalctl. Wenn Sie einen Protokollverlauf benötigen (standardmäßig werden Informationen nur ab dem Zeitpunkt des Systemstarts 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 Basisdienste (falls erforderlich)/ etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Die Relevanz der Zeit auf der „Himbeere“ ist eine wichtige Sache. Da die Hardware standardmäßig nicht in der Lage ist, den aktuellen Stand der Uhr beim Neustart zu speichern, ist eine Synchronisierung erforderlich. Ein sehr guter und schneller Daemon hierfür ist chronisch - bereits installiert und startet automatisch. Sie können die NTP-Server auf die nächstgelegenen ändern.

/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

Um die Zeitzone festzulegen, verwenden wir Trick. Da unser Ziel darin besteht, einen WLAN-Router zu entwickeln, der mit 5-GHz-Frequenzen arbeitet, werden wir uns im Voraus auf Überraschungen einstellen Regler:

# lecker info crda
Zusammenfassung: Daemon zur Einhaltung gesetzlicher Vorschriften für drahtlose 802.11-Netzwerke

Dieses böse Design, das auch auf der Zeitzone basiert, „verbietet“ die Verwendung (in Russland) von 5-GHz-Frequenzen und Kanälen mit „hohen“ Nummern. Der Trick besteht darin, eine Zeitzone festzulegen, ohne die Namen von Kontinenten/Städten zu verwenden, d. h. anstelle von:

# timedatectl set-timezone Europe/Moscow

Wir drücken:

# timedatectl set-timezone Etc/GMT-3

Und der letzte Schliff für die Frisur des Systems:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# User specific environment and startup programs

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

3. CentOS-Add-ons

Alles, was oben gesagt wurde, kann als vollständige Anleitung zur Installation von „Vanilla“ CentOS auf dem Raspberry Pi betrachtet werden. Am Ende sollten Sie einen PC haben, der in weniger als 10 Sekunden (neu) startet, weniger als 15 Megabyte RAM und 1.5 Gigabyte microSD verbraucht (eigentlich weniger als 1 Gigabyte aufgrund eines unvollständigen /boot, aber seien wir ehrlich).

Um die Wi-Fi-Zugangspunktsoftware auf diesem System zu installieren, müssen Sie die Funktionen der Standard-CentOS-Distribution leicht erweitern. Lassen Sie uns zunächst den Treiber (Firmware) des integrierten WLAN-Adapters aktualisieren. Auf der Projekthomepage heißt es:

WLAN auf dem Raspberry 3B und 3B+

Die Raspberry PI 3B/3B+ Firmware-Dateien dürfen vom CentOS-Projekt nicht verbreitet werden. Mithilfe der folgenden Artikel können Sie das Problem verstehen, die Firmware herunterladen und das WLAN einrichten.

Was für das CentOS-Projekt verboten ist, ist uns für den persönlichen Gebrauch nicht verboten. Wir ersetzen die Distributions-WLAN-Firmware in CentOS durch die entsprechende der Broadcom-Entwickler (dieselben verhassten Binär-Blobs ...). Dies ermöglicht Ihnen insbesondere die Nutzung von AC im Access Point-Modus.

Wi-Fi-Firmware-UpgradeFinden Sie das Gerätemodell und die aktuelle Firmware-Version heraus:

# 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 ist, und erinnern uns an die folgenden Zahlen: 43455 (brcmfmac43455-sdio.bin).

Laden Sie das aktuelle Raspbian-Image herunter. Faule Leute können das Image auf microSD schreiben und von dort die Dateien mit der Firmware übernehmen. Oder Sie können die Root-Partition des Images unter Linux mounten und von dort kopieren, was Sie benötigen:

# 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 resultierenden WLAN-Adapter-Firmwaredateien müssen kopiert und durch „raspberry“ in das Verzeichnis ersetzt 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. Netzwerkkonfiguration und bevorstehende Herausforderungen

Wie wir oben vereinbart haben, ist die „Himbeere“ per „Kabel“ mit dem lokalen Netzwerk verbunden. Nehmen wir an, dass der Provider den Internetzugang auf genau die gleiche Weise bereitstellt: Die Adresse im öffentlichen Netzwerk wird dynamisch vom DHCP-Server vergeben (ggf. mit MAC-Bindung). In diesem Fall müssen Sie nach der endgültigen Einrichtung des Raspberry nur noch das Kabel des Anbieters „einstecken“ und fertig. Autorisierung mit systemd-netzwerkd - das Thema eines separaten Artikels und wird hier nicht besprochen.

Die Wi-Fi-Schnittstelle(n) von Raspberry ist ein lokales Netzwerk und der integrierte Ethernet-Adapter (eth0) ist extern. Nummerieren wir das lokale Netzwerk statisch, zum Beispiel: 192.168.0.0/24. Raspberry-Adresse: 192.168.0.1. Im externen Netzwerk (Internet) wird ein DHCP-Server betrieben.

Problem der Namenskonsistenz и berühmter guatemaltekischer Programmierer - zwei Probleme, die jeden erwarten, der Netzwerkschnittstellen und -dienste in systemd-Distributionen konfiguriert.

Paralleles Chaos (lyrischer Exkurs)Lennart Pottering hat ein eigenes Programm zusammengestellt systemd sehr gut. Das systemd andere Programme so schnell startet, dass sie, ohne Zeit zu haben, sich von dem Pfiff des Schiedsrichters zu erholen, am Start stolpern und stürzen, ohne ihren Hindernisparcours überhaupt begonnen zu haben.

Aber im Ernst: Die aggressive Parallelisierung gestarteter Prozesse beim Start des systemd-Betriebssystems ist eine Art „Eselsbrücke“ für erfahrene sequentielle LSB-Spezialisten. Glücklicherweise erweist es sich als einfach, wenn auch nicht immer offensichtlich, Ordnung in dieses „parallele Chaos“ zu bringen.

Wir erstellen zwei virtuelle Bridge-Schnittstellen mit konstanten Namen: lan и fahl. Wir werden den/die Wi-Fi-Adapter mit dem ersten „verbinden“ und den eth0 „Raspberry“ mit dem zweiten.

/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=Ja Es ist nicht mehr erforderlich, über sysctl Hinweise auf den Kernel zu geben, um das Routing zu aktivieren.
MACAddress= Lassen Sie uns den Kommentar entfernen und bei Bedarf ändern.

Zuerst „verbinden“ wir eth0. Wir erinnern uns an das „Uniformity-Problem“ und verwenden nur die MAC-Adresse dieser Schnittstelle, die beispielsweise so ermittelt werden 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 löschen die bisherige Konfigurationsdatei eth0, starten den Raspberry neu und verschaffen uns Netzwerkzugriff darauf (die IP-Adresse wird sich höchstwahrscheinlich ändern):

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

5.DNSMASQ

Für die Einrichtung von Wi-Fi-Zugangspunkten gibt es nichts Besseres als ein paar nette Leute dnsmasq + Hostapd Habe es noch nicht herausgefunden. Meiner Meinung nach.

Falls es jemand vergessen hat, dann...Hostapd - Dies ist die Sache, die Wi-Fi-Adapter steuert (insbesondere kümmert es sich darum, sie mit dem Virtuellen zu verbinden). lan „raspberries“), autorisiert und registriert drahtlose Clients.

dnsmasq – Konfiguriert den Netzwerkstapel der Clients: Vergibt IP-Adressen, DNS-Server, Standard-Gateway und ähnliche Freuden.

Beginnen wir mit dnsmasq:

# yum install dnsmasq

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

Bearbeiten Sie es nach Ihren 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-dynamisch, was den dnsmasq-Daemon anweist, zu warten, bis es auf dem System erscheint Schnittstelle=LAN, und nicht ohnmächtig vor einem Anfall stolzer Einsamkeit nach dem Start.

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

6. HOSTAPD

Und schließlich die magischen Hostapd-Konfigurationen. Ich habe keinen Zweifel, dass jemand diesen Artikel auf der Suche nach genau diesen wertvollen Zeilen liest.

Bevor Sie hostapd installieren, müssen Sie das „Einheitlichkeitsproblem“ überwinden. Der integrierte WLAN-Adapter wlan0 kann seinen Namen problemlos in wlan1 ändern, wenn zusätzliche USB-WLAN-Geräte angeschlossen werden. Daher werden wir die Schnittstellennamen wie folgt festlegen: Wir werden eindeutige Namen für die (drahtlosen) Adapter erarbeiten und sie an MAC-Adressen binden.

Für den eingebauten WLAN-Adapter, der immer 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 werden wir sicher sein wl0 - Dies ist integriertes WLAN. Um dies sicherzustellen, starten wir den Raspberry neu.

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

Ohne einen Moment zu vergessen GKChP, ändern Sie die benötigten Parameter und prüfen Sie manuell die Funktionalität:

# hostapd /etc/hostapd/hostapd.conf

hostapd startet im interaktiven Modus und sendet seinen Status an die Konsole. Wenn keine Fehler vorliegen, können Clients, die den AC-Modus unterstützen, eine Verbindung zum Access Point herstellen. So stoppen Sie hostapd: Strg-C.

Es bleibt nur noch, hostapd beim Systemstart zu aktivieren. Wenn Sie das Standardverfahren ausführen (systemctl enable hostapd), können Sie nach dem nächsten Neustart einen Dämon bekommen, der „im Blut wälzt“ und die Diagnose „Schnittstelle wl0 nicht gefunden". Aufgrund des „parallelen Chaos“ startete hostapd schneller, als der Kernel den WLAN-Adapter fand.

Das Internet ist voller Abhilfemaßnahmen: von einem erzwungenen Timeout vor dem Start des Daemons (mehrere Minuten) bis hin zu einem anderen Daemon, der das Erscheinungsbild der Schnittstelle überwacht und das Hostpad (neu) startet. Die Lösungen sind durchaus praktikabel, aber furchtbar hässlich. Wir rufen den Großen um Hilfe an systemd mit seinen „Zielen“ und „Aufgaben“ und „Abhängigkeiten“.

Kopieren Sie die Verteilungsdienstdatei nach /etc/systemd/system/hostapd.service:

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

und reduzieren Sie seinen Inhalt auf 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

Der Zauber der aktualisierten Servicedatei liegt in der dynamischen Bindung von hostapd an das neue Ziel – die wl0-Schnittstelle. Wenn die Schnittstelle erscheint, startet der Daemon; wenn er verschwindet, stoppt er. Und das alles online – ohne Neustart des Systems. Diese Technik ist besonders nützlich, wenn Sie einen USB-WLAN-Adapter an einen Raspberry anschließen.

Jetzt kannst du:

# systemctl enable hostapd
# reboot

7. IPTABLES

„Was???“ © Ja, ja! Keiner systemd. Keine neumodischen Mähdrescher (in der Form Feuerland), die am Ende das Gleiche tun.

Benutzen wir das gute alte iptables, dessen Dienste nach dem Start Netzwerkregeln in den Kernel laden und stillschweigend herunterfahren, ohne resident zu bleiben und ohne Ressourcen zu verbrauchen. systemd hat eine elegante IPMasquerade=, aber wir werden die Adressübersetzung (NAT) und die Firewall weiterhin iptables anvertrauen.

Installieren:

# yum install iptables-services
# systemctl enable iptables ip6tables

Ich bevorzuge es, die iptables-Konfiguration als Skript zu speichern (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 obige Skript aus und verlieren die Möglichkeit, neue kabelgebundene SSH-Verbindungen mit dem Raspberry aufzubauen. Richtig, wir haben einen WLAN-Router entwickelt, dessen Zugriff „über das Internet“ standardmäßig verboten ist – jetzt nur noch „über Funk“. Wir schließen das Ethernet-Kabel des Anbieters an und beginnen mit dem Surfen!

8. Bonus: +2,4 GHz

Als ich den ersten Raspberry-Router anhand der oben beschriebenen Zeichnung zusammenbaute, entdeckte ich eine Reihe von Geräten in meinem Haushalt, die aufgrund ihrer Wi-Fi-Designbeschränkungen die „Himbeere“ überhaupt nicht sehen konnten. Den Router so umzukonfigurieren, dass er in 802.11b/g/n funktioniert, war unsportlich, da die maximale Geschwindigkeit „over the air“ in diesem Fall 40 Mbit nicht überschritt und mein Lieblings-Internetprovider mir 100 Mbit (über Kabel) anbietet.

Tatsächlich wurde bereits eine Lösung für das Problem erfunden: eine zweite WLAN-Schnittstelle mit einer Frequenz von 2,4 GHz und ein zweiter Zugangspunkt. An einem nahegelegenen Stand kaufte ich nicht die erste, sondern die zweite USB-WLAN-„Pfeife“, die mir begegnete. Der Verkäufer wurde von Fragen zum Chipsatz, zur Kompatibilität mit ARM-Linux-Kerneln und der Möglichkeit, im AP-Modus zu arbeiten, gequält (er war der Erste, der damit begann).

Wir konfigurieren die „Pfeife“ analog zum eingebauten WLAN-Adapter.

Zuerst 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

Wir werden die Verwaltung der neuen Wi-Fi-Schnittstelle einem separaten hostapd-Daemon anvertrauen, der je nach Vorhandensein einer genau definierten „Pfeife“ im System startet und stoppt: 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-WLAN-Adapters ab, sodass ein banales Kopieren/Einfügen möglicherweise fehlschlägt.

Kopieren Sie die Verteilungsdienstdatei nach /etc/systemd/system/hostapd2.service:

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

und reduzieren Sie seinen Inhalt auf 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

Jetzt muss nur noch eine neue Instanz von hostapd aktiviert werden:

# systemctl enable hostapd2

Das ist alles! Ziehen Sie die „Pfeife“ und die „Himbeere“ selbst und schauen Sie sich die drahtlosen Netzwerke um Sie herum an.

Und zum Schluss möchte ich Sie vor der Qualität des USB-WLAN-Adapters und der Stromversorgung des Raspberry warnen. Eine angeschlossene „Hot Whistle“ kann aufgrund kurzfristiger elektrischer Störungen manchmal zum „Himbeer-Einfrieren“ führen.

Source: habr.com

Kommentar hinzufügen