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

Er is een enorme hoeveelheid informatie op internet over het creëren van Wi-Fi-toegangspunten op basis van een Raspberry single-board pc. In de regel betekent dit dat u het Raspbian-besturingssysteem gebruikt dat eigen is aan de Raspberry.

Als aanhanger van op RPM gebaseerde systemen kon ik niet aan dit kleine wonder voorbijgaan en mijn geliefde CentOS er niet op uitproberen.

Het artikel bevat instructies voor het maken van een 5GHz/AC Wi-Fi-router van een Raspberry Pi 3 Model B+ op basis van het CentOS-besturingssysteem. Er zullen verschillende standaard maar weinig bekende trucs zijn, en als bonus - een tekening voor het aansluiten van extra Wi-Fi-apparatuur op de Raspberry, waardoor deze tegelijkertijd in verschillende modi (2,4+5GHz) kan werken.

Raspberry Pi + CentOS = Wi-Fi Hotspot (of frambozenrouter met rode hoed)
(mix van vrij beschikbare afbeeldingen)

Laten we meteen opmerken dat sommige kosmische snelheden niet zullen werken. Ik pers maximaal 100 Mbps uit mijn Raspberry via de ether, en dit dekt de snelheid van mijn internetprovider. Waarom heb je zo'n trage AC nodig, als je in theorie zelfs op N een halve gigabit kunt krijgen? Als je jezelf deze vraag hebt gesteld, ga dan naar de winkel om een ​​echte router met acht externe antennes te kopen.

0. Wat je nodig hebt

  • Eigenlijk is het “frambozenproduct” zelf van kaliber: Pi 3 Model B+ (om de felbegeerde 5GHz-snelheden en kanalen te bereiken);
  • Goede microSD >= 4GB;
  • Werkstation met Linux en microSD-lezer/schrijver;
  • Beschikbaarheid van voldoende vaardigheden in Linux, het artikel is voor een getrainde nerd;
  • Bekabelde netwerkconnectiviteit (eth0) tussen Raspberry en Linux, draaiende DHCP-server op het lokale netwerk en internettoegang vanaf beide apparaten.

Een kleine opmerking over het laatste punt. “Wat was er eerst, het ei of...” hoe maak je een Wi-Fi-router als er geen internettoegangsapparatuur is? Laten we deze vermakelijke oefening buiten het bestek van het artikel laten en er eenvoudigweg van uitgaan dat de Raspberry via een kabel met het lokale netwerk is verbonden en toegang heeft tot internet. In dit geval hebben we geen extra tv en manipulator nodig om de "framboos" in te stellen.

1. Installeer CentOS

Homepagina van het project

Op het moment dat dit artikel wordt geschreven, is de actieve versie van CentOS op het apparaat 32-bit. Ergens op het World Wide Web kwam ik meningen tegen dat de prestaties van dergelijke besturingssystemen op 64-bits ARM-architectuur met maar liefst 20% worden verminderd. Ik verlaat dit moment zonder commentaar.

Download op Linux de minimale afbeelding met de kernel "-FramboosPI-"en schrijf het naar microSD:

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

Voordat we de image gaan gebruiken, zullen we de SWAP-partitie ervan verwijderen, de root uitbreiden naar het gehele beschikbare volume en SELinux verwijderen. Het algoritme is eenvoudig: maak een kopie van de root op Linux, verwijder alle partities van de microSD behalve de eerste (/boot), maak een nieuwe root en retourneer de inhoud van de kopie.

Voorbeeld van vereiste acties (ernstige 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

Nadat u de inhoud van de rootpartitie hebt uitgepakt, is het tijd om er enkele wijzigingen in aan te brengen.

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

SELINUX=disabled

Bewerken /mnt/etc/fstab, waarbij we slechts twee vermeldingen over de partities achterlaten: boot (/boot, geen wijzigingen) en root (we veranderen de UUID-waarde, die kan worden ontdekt door de uitvoer van het blkid-commando 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 veranderen we de opstartparameters van de kernel: we specificeren een nieuwe locatie voor de rootpartitie, schakelen de uitvoer van foutopsporingsinformatie uit en verbieden (optioneel) dat de kernel IPv6-adressen op netwerkinterfaces toewijst:

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

Hier is de inhoud /mnt/cmdline.txt naar het volgende formulier (één regel zonder koppeltekens):

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

Finish:

# cd
# umount /mnt
# sync

We herschikken de microSD in de "framboos", starten deze en krijgen netwerktoegang ertoe via ssh (root/centos).

2. CentOS instellen

De eerste drie onwrikbare bewegingen: passwd, yum -y update, opnieuw op te starten.

Wij geven netwerkbeheer weg genetwerkt:

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

Maak een bestand aan (samen met mappen) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

We herstarten de “framboos” en krijgen er opnieuw netwerktoegang toe via ssh (het IP-adres kan veranderen). Let op wat er gebruikt wordt / Etc / resolv.conf, eerder gemaakt door Network Manager. Bewerk daarom, in geval van problemen met de oplossing, de inhoud ervan. Gebruik systemd-opgelost we zullen niet.

We verwijderen het “onnodige”, repareren en versnellen het laden van het besturingssysteem:

# 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 heeft nodig cron en wie het ingebouwde niet verteert systemd-timers, kan vaststellen wat er ontbreekt. / Var / log- en kijk er doorheen journalctl. Als u de loggeschiedenis nodig heeft (standaard wordt informatie alleen opgeslagen vanaf het moment dat het systeem opstart):

# 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 door basisdiensten uit (indien nodig)/ Etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

De relevantie van tijd voor de "framboos" is belangrijk. Omdat er standaard geen hardwaremogelijkheid is om de huidige status van de klok op te slaan bij het opnieuw opstarten, is synchronisatie nodig. Een hele goede en snelle daemon hiervoor is chrony - al geïnstalleerd en start automatisch. U kunt 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

Om de tijdzone in te stellen die we zullen gebruiken truc. Omdat het ons doel is om een ​​Wi-Fi-router te maken die op 5GHz-frequenties werkt, zullen we ons van tevoren op verrassingen voorbereiden regelaar:

#jammie info crda
Samenvatting: Naleving van regelgeving voor draadloze 802.11-netwerken

Dit kwaadaardige ontwerp, ook gebaseerd op de tijdzone, ‘verbiedt’ (in Rusland) het gebruik van 5GHz-frequenties en kanalen met ‘hoge’ getallen. De truc is om een ​​tijdzone in te stellen zonder de namen van continenten/steden te gebruiken, dat wil zeggen in plaats van:

# timedatectl set-timezone Europe/Moscow

Wij drukken op:

# timedatectl set-timezone Etc/GMT-3

En de laatste hand aan het kapsel van het systeem:

# 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 wat hierboven is gezegd, kan worden beschouwd als volledige instructies voor het installeren van "vanille" CentOS op de Raspberry Pi. Je zou een pc moeten krijgen die in minder dan 10 seconden (opnieuw) opstart, minder dan 15 Megabyte RAM en 1.5 Gigabyte microSD gebruikt (eigenlijk minder dan 1 Gigabyte vanwege een onvolledige /boot, maar laten we eerlijk zijn).

Om Wi-Fi-toegangspuntsoftware op dit systeem te installeren, moet u de mogelijkheden van de standaard CentOS-distributie enigszins uitbreiden. Laten we eerst het stuurprogramma (firmware) van de ingebouwde Wi-Fi-adapter upgraden. Op de startpagina van het project staat:

Wifi op de Raspberry 3B en 3B+

De Raspberry PI 3B/3B+ firmwarebestanden mogen niet worden gedistribueerd door het CentOS Project. U kunt de volgende artikelen gebruiken om het probleem te begrijpen, de firmware op te halen en de wifi in te stellen.

Wat verboden is voor het CentOS-project, is voor ons niet verboden voor persoonlijk gebruik. We vervangen de Wi-Fi-firmware voor de distributie in CentOS door de overeenkomstige versie van de Broadcom-ontwikkelaars (diezelfde gehate binaire blobs...). Hierdoor kunt u met name AC gebruiken in de toegangspuntmodus.

Wi-Fi-firmware-upgradeOntdek het apparaatmodel en de huidige firmwareversie:

# 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 firmwareversie 7.45.18 is, gedateerd 01.03.2015-XNUMX-XNUMX, en onthouden de volgende reeks cijfers: 43455 (brcmfmac43455-sdio.bin).

Download de huidige Raspbian-afbeelding. Luie mensen kunnen de afbeelding naar microSD schrijven en de bestanden met de firmware daar vandaan halen. Of je kunt de rootpartitie van de image in Linux mounten en vanaf daar kopiëren wat je nodig hebt:

# 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 resulterende firmwarebestanden van de Wi-Fi-adapter moeten naar de map worden gekopieerd en vervangen door "raspberry". /usr/lib/firmware/brcm/

We starten de toekomstige router opnieuw op en glimlachen tevreden:

# 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 

Versie: 7.45.154 gedateerd 27.02.2018-XNUMX-XNUMX.

En natuurlijk 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. Netwerkconfiguratie en toekomstige uitdagingen

Zoals we hierboven hebben afgesproken, is de "framboos" via "draad" verbonden met het lokale netwerk. Laten we aannemen dat de provider op precies dezelfde manier internettoegang biedt: het adres op het openbare netwerk wordt dynamisch uitgegeven door de DHCP-server (eventueel met MAC-binding). In dit geval hoeft u na de definitieve installatie van de Raspberry alleen maar de kabel van de provider erop te “pluggen” en u bent klaar. Autorisatie gebruik systemd-netwerkd - het onderwerp van een apart artikel en wordt hier niet besproken.

De Wi-Fi-interface(s) van Raspberry is een lokaal netwerk en de ingebouwde Ethernet-adapter (eth0) is extern. Laten we het lokale netwerk statisch nummeren, bijvoorbeeld: 192.168.0.0/24. Raspberry-adres: 192.168.0.1. Op het externe netwerk (internet) zal een DHCP-server werken.

Consistentieprobleem bij naamgeving и beroemde Guatemalteekse programmeur - twee problemen die iedereen te wachten staan ​​die netwerkinterfaces en -services in systeemdistributies configureert.

Parallelle chaos (lyrische uitweiding)Lennart Pottering heeft een eigen programma samengesteld systemd Erg goed. Dit systemd lanceert andere programma's zo snel dat ze, omdat ze geen tijd hebben om te herstellen van het fluitsignaal van de scheidsrechter, bij de start struikelen en vallen zonder zelfs maar aan hun hindernisbaan te zijn begonnen.

Maar serieus: de agressieve parallellisatie van gelanceerde processen aan het begin van het besturingssysteem is een soort ‘ezelbrug’ voor doorgewinterde sequentiële LSB-specialisten. Gelukkig blijkt het brengen van orde in deze “parallelle chaos” eenvoudig, hoewel niet altijd vanzelfsprekend.

We creëren twee virtuele bridge-interfaces met constante namen: lan и gemaakt. We zullen de Wi-Fi-adapter(s) “verbinden” met de eerste, en de eth0 “framboos” met de tweede.

/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 elimineert de noodzaak om via sysctl naar de kernel te verwijzen om routering mogelijk te maken.
MAC-adres= Laten we het commentaar verwijderen en indien nodig veranderen.

Eerst ‘verbinden’ we eth0. We onthouden het “uniformiteitsprobleem” en gebruiken alleen het MAC-adres van deze interface, dat bijvoorbeeld als volgt kan worden achterhaald:

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

We creëren /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

We verwijderen het vorige configuratiebestand eth0, herstarten de Raspberry en krijgen er netwerktoegang toe (het IP-adres zal hoogstwaarschijnlijk veranderen):

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

5.DNSMASQ

Voor het maken van Wi-Fi-toegangspunten gaat er niets boven een paar lieve dnsmasq + hostapd ben er nog niet achter. Naar mijn mening.

Mocht iemand het vergeten zijn, dan...hostapd - dit is het ding dat Wi-Fi-adapters bestuurt (in het bijzonder zorgt het ervoor dat ze met de virtuele verbinding worden verbonden lan "frambozen"), autoriseert en registreert draadloze clients.

dnsmasq - configureert de netwerkstack van clients: geeft IP-adressen, DNS-servers, standaardgateway en soortgelijke geneugten uit.

Laten we beginnen met dnsmasq:

# yum install dnsmasq

Patroon / 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 wens.

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” ligt hier in de parameter bind-dynamisch, wat de dnsmasq-daemon vertelt te wachten totdat deze op het systeem verschijnt interface=lan, en na de start niet flauwvallen door een vlaag van trotse eenzaamheid.

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

6. HOSTAP

En tot slot de magische hostapd-configuraties. Ik twijfel er niet aan dat iemand dit artikel leest op zoek naar precies deze dierbare regels.

Voordat u hostapd installeert, moet u het “uniformiteitsprobleem” overwinnen. De ingebouwde Wi-Fi-adapter wlan0 kan zijn naam eenvoudig veranderen in wlan1 wanneer u extra USB Wi-Fi-apparatuur aansluit. Daarom gaan we de interfacenamen op de volgende manier vastleggen: we bedenken unieke namen voor de (draadloze) adapters en koppelen deze 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 creëren /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Nu weten we het zeker wl0 - Dit is ingebouwde Wi-Fi. We herstarten de Raspberry om hier zeker van te zijn.

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

Zonder een moment te vergeten GKChP, wijzig de parameters die we nodig hebben en controleer handmatig op functionaliteit:

# hostapd /etc/hostapd/hostapd.conf

hostapd start in interactieve modus en zendt de status ervan naar de console. Als er geen fouten zijn, kunnen clients die de AC-modus ondersteunen verbinding maken met het toegangspunt. Om hostapd te stoppen - Ctrl-C.

Het enige dat overblijft is het inschakelen van hostapd bij het opstarten van het systeem. Als je het standaard doet (systemctl enable hostapd), dan kun je na de volgende herstart een demon krijgen die “in bloed rolt” met de diagnose “interface wl0 niet gevonden". Als gevolg van de ‘parallelle chaos’ startte hostapd sneller op dan de kernel de draadloze adapter vond.

Het internet staat vol met remedies: van een gedwongen time-out voordat de daemon wordt gestart (enkele minuten), tot een andere daemon die het uiterlijk van de interface controleert en het hostpad (opnieuw) opstart. De oplossingen zijn redelijk werkbaar, maar vreselijk lelijk. Wij roepen de Grote om hulp systemd met zijn “doelen” en “taken” en “afhankelijkheden”.

Kopieer het distributieservicebestand naar /etc/systemd/system/hostapd.service:

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

en reduceer de inhoud ervan tot de volgende vorm:

[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 servicebestand ligt in de dynamische binding van hostapd aan het nieuwe doel: de wl0-interface. Wanneer de interface verschijnt, start de daemon; wanneer deze verdwijnt, stopt deze. En dit is allemaal online - zonder het systeem opnieuw op te starten. Deze techniek is vooral handig bij het aansluiten van een USB Wi-Fi-adapter op een Raspberry.

Nu kan je:

# systemctl enable hostapd
# reboot

7. IPTABLES

“Stha???” © Ja, ja! Geen systemd. Geen nieuwerwetse maaidorsers (in de vorm firewalld), die uiteindelijk hetzelfde doen.

Laten we de goede oude gebruiken iptables, waarvan de services, na het starten, netwerkregels in de kernel zullen laden en stilletjes zullen afsluiten zonder resident te blijven en zonder bronnen te verbruiken. systemd heeft een elegante IPMaskerade=, maar we zullen de adresvertaling (NAT) en firewall nog steeds aan iptables toevertrouwen.

Installeren:

# yum install iptables-services
# systemctl enable iptables ip6tables

Ik geef er de voorkeur aan om de iptables-configuratie op te slaan als 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

We voeren het bovenstaande script uit en verliezen de mogelijkheid om nieuwe bekabelde SSH-verbindingen tot stand te brengen met de Raspberry. Dat klopt, we hebben een Wi-Fi-router gemaakt, waarvan de toegang "via internet" standaard verboden is - nu alleen "via de ether". We sluiten de Ethernet-kabel van de provider aan en beginnen met surfen!

8. Bonus: +2,4 GHz

Toen ik de eerste Raspberry-router in elkaar zette met behulp van de hierboven beschreven tekening, ontdekte ik een aantal gadgets in mijn huishouden die, vanwege hun Wi-Fi-ontwerpbeperkingen, de "framboos" helemaal niet konden zien. Het opnieuw configureren van de router om te werken in 802.11b/g/n was onsportief, aangezien de maximale snelheid “via de ether” in dit geval niet hoger was dan 40 Mbit, en mijn favoriete internetprovider mij 100 biedt (via de kabel).

Er is zelfs al een oplossing voor het probleem bedacht: een tweede Wi-Fi-interface die werkt op een frequentie van 2,4 GHz, en een tweede toegangspunt. Bij een nabijgelegen kraampje kocht ik niet het eerste, maar het tweede USB Wi-Fi “fluitje” dat ik tegenkwam. De verkoper werd gekweld door vragen over de chipset, compatibiliteit met ARM Linux-kernels en de mogelijkheid om in AP-modus te werken (hij was de eerste die begon).

We configureren het “fluitje” naar analogie met de ingebouwde Wi-Fi-adapter.

Laten we het eerst hernoemen 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 zullen het beheer van de nieuwe Wi-Fi-interface toevertrouwen aan een afzonderlijke hostapd-daemon, die zal starten en stoppen afhankelijk van de aanwezigheid van een strikt gedefinieerd “fluit” 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 is rechtstreeks afhankelijk van het model van de USB Wi-Fi-adapter, dus een banaal kopiëren/plakken kan mislukken.

Kopieer het distributieservicebestand naar /etc/systemd/system/hostapd2.service:

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

en reduceer de inhoud ervan tot de volgende vorm:

[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 een nieuw exemplaar van hostapd:

# systemctl enable hostapd2

Dat is alles! Trek aan het "fluitje" en de "framboos" zelf, kijk naar de draadloze netwerken om je heen.

En tot slot wil ik je waarschuwen voor de kwaliteit van de USB Wi-Fi-adapter en voeding van de Raspberry. Een aangesloten “hete fluit” kan soms “frambozenbevriezing” veroorzaken als gevolg van kortstondige elektrische problemen.

Bron: www.habr.com

Voeg een reactie