Raspberry Pi + CentOS = Wi-Fi Hotspot (eller hindbær-router i rød hat)

Internettet har en enorm mængde information om oprettelse af Wi-Fi adgangspunkter baseret på en Raspberry Pi enkeltkort-PC. Som regel henvises der til brugen af det native operativsystem for 'malinen' — Raspbian.

Som tilhænger af RPM-baserede systemer kunne jeg ikke gå forbi dette lille vidunder og ikke teste min yndlings CentOS på det.

Artiklen præsenterer en vejledning til at fremstille en 5GHz/AC Wi-Fi router ud fra Raspberry Pi 3 Model B+ baseret på operativsystemet CentOS. Der vil være flere standard, men mindre kendte tricks, samt et bonusdiagram til tilslutning af ekstra Wi-Fi udstyr til 'malinen', hvilket gør det muligt for den at fungere i flere tilstande (2,4+5GHz) samtidigt.

Raspberry Pi + CentOS = Wi-Fi Hotspot (eller hindbær-router i rød hat)
(mix af billeder fra fri adgang)

Lad os straks bemærke, at vi ikke vil opnå nogen kosmiske hastigheder. Jeg presser maksimalt 100 Mbit ud af min 'maline' trådløst, og det dækker hastigheden fra min internetudbyder. Hvad skal man med en så sløv AC, hvis man endda i teorien kan få et halvt gigabit på N? Hvis du har stillet dig selv dette spørgsmål, så gå til butikken for at få en rigtig router med otte eksterne antenner.

0. Hvad du skal bruge

  • Selve 'maline produktet' kaliber: Pi 3 Model B+ (for at opnå de eftertragtede 5GHz hastigheder og kanaler);
  • En solid microSD >= 4GB;
  • En arbejdsstation med Linux og en læser/skriver til microSD;
  • Tilstrækkelige færdigheder i Linux, artiklen er for den forberedte nørd;
  • Kablet netværk (eth0) forbindelser mellem Raspberry og Linux, en fungerende DHCP-server i det lokale netværk og internetadgang på begge enheder.

En lille kommentar til det sidste punkt. 'Hvad kom først, ægget eller…' hvordan laver man en Wi-Fi router i mangel på noget som helst internetadgangsudstyr? Lad os efterlade denne interessante øvelse uden for rammerne af artiklen og blot antage, at Raspberry er tilsluttet det lokale netværk med kabel og har internetadgang. I dette tilfælde har vi ikke brug for en ekstra TV eller manipulator til at konfigurere 'malinen'.

1. Installation af CentOS

Hjemmesiden for projektet

På tidspunktet for skrivningen af denne artikel er den fungerende version af CentOS på enheden — 32-bit. Jeg er stødt på meninger på internettet om, at ydelsen af sådanne operativsystemer på 64-bit ARM-arkitektur kan falde med op til 20%. Jeg efterlader dette punkt uden kommentarer.

På Linux downloader vi det minimale billede med kernen '-RaspberryPI-» og skriver det til microSD:

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

Før vi bruger billedet, skal vi fjerne SWAP-delen, udvide rodpartitionen til hele den tilgængelige kapacitet og slippe af med SELinux. Algoritmen er enkel: vi laver en kopi af roden i Linux, fjerner alle partitioner fra microSD undtagen den første (\/boot), opretter en ny rod og gendanner dens indhold fra kopien.

Eksempel på nødvendige handlinger (rå konsoluddata)

# 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

Efter udpakning af indholdet af rodpartitionen er det det rigtige tidspunkt at foretage nogle ændringer.

Vi deaktiverer SELinux i /mnt/etc/selinux/config:

SELINUX=disabled

Redigerer /mnt/etc/fstab, idet vi efterlader kun to poster om partitionerne: boot-partitionen (\/boot, uden ændringer) og rodpartitionen (ændrer UUID-værdien, som kan findes ved at undersøge output af kommandoen blkid i Linux):

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

Endelig ændrer vi indstillingerne for kernelopstarten: angiver den nye placering af rodpartitionen, deaktiverer visning af fejlinformation og (valgfrit) forhindrer kerne i at tildele IPv6-adresser på netværksgrænsefladerne:

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

Vi tilpasser indholdet /mnt/cmdline.txt til følgende format (én linje uden linjeskift):

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

Færdig:

# cd
# umount /mnt
# sync

Vi sætter microSD i 'malina', starter og får netværksadgang til den via ssh (root\/centos).

2. Konfiguration af CentOS

De første tre uforanderlige skridt: passwd, yum -y update, reboot.

Vi overlader netværksstyring til networkd:

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

Vi opretter en fil (sammen med mapperne) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Vi genstarter 'malina' og får igen netværksadgang til den via ssh (IP-adressen kan ændre sig). Vær opmærksom på, at der bruges /etc/resolv.conf, oprettet tidligere af Network Manager. Derfor, i tilfælde af problemer med resolve, rediger dens indhold. At bruge Som systemisk DNS-resolver tilbydes nu vil vi ikke.

Vi fjerner det 'overflødige', reparerer og fremskynder boot af OS:

# systemctl set-default multi-user.target
# yum remove GeoIP Network* aic* alsa* cloud-utils-growpart 
  cronie* dhc* firewal* initscripts iwl* kexec* logrotate 
  postfix rsyslog selinux-pol* teamd wpa_supplicant

Hvem har brug for cron og som ikke kan lide de indbyggede systemd-timere, kan installere det manglende. /var/log- og ser gennem journalctl. Hvis du har brug for loghistorik (som standard gemmes oplysninger kun fra systemstart):

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

Deaktiver brugen af IPv6 af de vigtigste tjenester (hvis nødvendigt)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Tidsrelevans på 'malina' er en vigtig ting. Da der 'ud af boksen' ikke er hardwaremulighed for at gemme den nuværende tilstand af uret ved genstart, er der brug for synkronisering. En meget god og hurtig dæmon til dette er chrony — er allerede installeret og kører automatisk. Det er muligt at ændre NTP-serverne til de nærmeste.

/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

Til installation af tidszonen vil vi bruge tricket. Da vores mål er at skabe en Wi-Fi-router, der fungerer på 5GHz-frekvenser, forbereder vi os på overraskelser regulator:

# yum info crda
Sammenfatning: Reguleringsoverholdelse dæmon for 802.11 trådløs netværkning

Denne onde konstruktion, der blandt andet tager hensyn til tidszonen, "forbyder" brug af (i Rusland) 5GHz frekvenser og kanaler med "store" numre. Tricket består i at indstille tidszonen uden at bruge navne på kontinenter/byer, det vil sige i stedet for:

# timedatectl set-timezone Europe/Moscow

Vi presser:

# timedatectl set-timezone Etc/GMT-3

Og de sidste detaljer i systemets frisure:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Bruger specifikt miljø og opstartprogrammer

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

3. CentOS-tilføjelser

Alt, hvad der er nævnt ovenfor, kan betragtes som en afsluttet instruktion til installation af "vanilla" CentOS på Raspberry Pi. Du skal have en PC, der (gen)starter på mindre end 10 sekunder, bruger mindre end 15 Megabyte RAM og 1,5 Gigabyte microSD (faktisk mindre end 1 Gigabyte på grund af den ufuldstændige /boot, men lad os være ærlige til slut).

For at installere softwaren til Wi-Fi adgangspunkt på dette system skal vi udvide funktionerne i standard CentOS-distributionen en smule. Først opgraderer vi driveren (firmware) til den indbyggede Wi-Fi-adapter. På projektets hjemmeside står der:

Wifi på Raspberry 3B og 3B+

Raspberry PI 3B/3B+ firmwarefiler må ikke distribueres af CentOS-projektet. Du kan bruge følgende artikler til at forstå problemet, få firmwaren og opsætte wifi.

Hvad der ikke er tilladt af CentOS-projektet, er ikke forbudt for os til personlig brug. Vi erstatter distributions-Wi-Fi-firmwaren i CentOS med den passende fra Broadcoms udviklere (de samme hadede binære blobs…). Dette vil blandt andet gøre det muligt at bruge AC i adgangspunktet.

Wi-Fi firmwareopgraderingFind modelnummeret på enheden og den nuværende version af firmwaren:

# 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 

Vi ser, at firmwaren version 7.45.18 fra 01.03.2015 er, og husker følgende sæt tal: 43455 (brcmfmac43455-sdio.bin).

Hent den aktuelle Raspbian-billede. De dovne kan skrive billedet til microSD og hente filerne med firmwaren derfra. Eller man kan montere rodpartitionen af billedet i Linux og kopiere det nødvendige derfra:

# 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 opnåede filer til driveren til Wi-Fi-adapteren skal kopieres med erstatning til "malinchen" i biblioteket /usr/lib/firmware/brcm/

Genstarter den kommende router og smiler fornøjet:

# 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 fra 27.02.2018.

Og selvfølgelig 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. Netværkskonfiguration og kommende udfordringer

Som vi aftalte ovenfor, er "raspberry" tilsluttet "kabel" til det lokale netværk. Lad os antage, at udbyderen også giver internetadgang på samme måde: adressen i det offentlige netværk tildeles dynamisk af DHCP-serveren (måske med binding til MAC). I dette tilfælde, efter den endelige opsætning af "raspberry", er det tilstrækkeligt at "stikke" leverandørens kabel i den, og så er det klar. Godkendelsen via systemd-networkd — er et emne for en separat artikel og behandles ikke her.

Wi-Fi interface(r) hos Raspberry er det lokale netværk, mens den indbyggede Ethernet-adapter (eth0) er ekstern. Lad os nummerere det lokale netværk statisk, for eksempel: 192.168.0.0/24. Adressen for "raspberry": 192.168.0.1. I det eksterne netværk (internet) vil DHCP-serveren fungere.

Problemet med ensartet navngivning og en velkendt guatemalsk programmør — to uheld, der venter enhver, der arbejder med opsætningen af netværksinterfaces og tjenester i systemd-distributioner.

Parallel kaos (lyrisk afstikker)Lennart Poettering har lavet sit program systemd meget godt. Det systemd starter andre programmer så hurtigt, at de, ikke i stand til at forstå dommerens fløjt, snubler og falder ved startlinjen, før de overhovedet er begyndt deres forhindringsløb.

Men alvorligt talt, så er den aggressive parallellisering af de processer, der startes ved opstart af systemd-OS, en slags «æselsbro» for erfarne sekventielle LSB-ere. Heldigvis viser det sig at være en enkel, omend ikke altid åbenlys opgave at bringe denne «parallelle kaos» i orden.

Vi opretter to virtuelle bridge interfaces med faste navne: lan og wan. Til den første "tilslutter vi" Wi-Fi adapter(e), til den anden — eth0 fra "raspberry".

/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 fjerner behovet for at antyde til kernen via sysctl, at aktivering af routning.
MACAddress= udkommenterer vi og ændrer om nødvendigt.

Først "tilslutter vi" eth0. Husk på "problemet med ensartethed" og brug kun MAC-adressen for denne grænseflade, som du kan finde ud af, for eksempel sådan:

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

Vi opretter /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Vi fjerner den tidligere konfigurationsfil for eth0, genstarter "malinen" og får netværksadgang til den (IP-adressen ændrer sig sandsynligvis):

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

5. DNSMASQ

Til fremstilling af Wi-Fi-adgangspunkter er der ikke noget der slår det søde par af dnsmasq + hostapd det er der ikke tænkt på endnu. Efter min mening.

Hvis nogen har glemt, så…hostapd — det er en enhed, der styrer Wi-Fi-adaptere (især vil den tage sig af opgaven med at forbinde dem til den virtuelle lan "maline"), autentificerer og registrerer trådløse klienter.

dnsmasq — konfigurerer klienternes netværksstak: tildeler IP-adresser, DNS-servere, standardgateway og lignende frynsegoder.

Vi begynder med dnsmasq:

# yum install dnsmasq

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

redigerer vi den efter vores smag.

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

"Magien" ligger i parameteren bind-dynamic, som instruerer dnsmasq-dæmonen om at vente på, at der optræder en interface=lan, og ikke falde om af stolt ensomhed efter opstart.

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

6. HOSTAPD

Og endelig, de magiske konfigurationer af hostapd. Jeg er ikke i tvivl om, at nogen læser denne artikel i håbet om at finde netop disse dyrebare linjer.

Før installationen af hostapd skal vi tage kampen op mod "ensartethedsproblemet". Den indbyggede Wi-Fi-adapter wlan0 kan nemt ændre sit navn til wlan1, når der tilsluttes yderligere USB Wi-Fi-udstyr. Derfor låser vi interface-navnene på følgende måde: vi giver (trådløse) adaptere unikke navne og knytter dem til MAC-adresser.

For den indbyggede Wi-Fi-adapter, der stadig er wlan0:

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

Vi opretter /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Nu kan vi være sikre på, at wl0 — det er den indbyggede Wi-Fi. Vi genstarter "malinen" for at bekræfte dette.

Installerer:

# yum install hostapd wireless-tools

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

Uden nogensinde at glemme om GKChP, ændrer vi de nødvendige parametre og kontrollerer manuelt for funktionalitet:

# hostapd /etc/hostapd/hostapd.conf

hostapd vil starte i interaktiv tilstand, og vil vise sin status på konsollen. Hvis der ikke opstår fejl, kan klienter, der understøtter AC-tilstand, nu tilslutte sig adgangspunktet. For at stoppe hostapd - Ctrl-C.

Det mangler kun at aktivere hostapd til systemopstart. Hvis man gør det standardmæssigt (systemctl enable hostapd), kan man efter den næste genstart få en "liggende i blodet" daemon med diagnosen "interface wl0 ikke fundet". Som resultat af "parallelt kaos" blev hostapd startet hurtigere, end kernen fandt det trådløse adapter.

Der er masser af løsninger på internettet: fra en tvungen timeout før daemonens opstart (et antal minutter), til en anden daemon, der overvåger fremkomsten af interface og (gen)starter hostpad. Løsningerne fungerer fint, men ser forfærdeligt ud. Vi kalder på den store systemd med sine "mål" og "opgaver" og "afhængigheder".

Vi kopierer distributions-servicefilen til /etc/systemd/system/hostapd.service:

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

og bringer dens indhold til følgende form:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Godkender
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

Magien ved den opdaterede servicefil ligger i den dynamiske binding af hostapd til det nye mål - interface wl0. Når interface dukker op - startes daemonen, når det forsvinder - stoppes den. Og det hele foregår online - uden at genstarte systemet. Især denne teknik vil være nyttig ved tilslutning af en USB Wi-Fi adapter til "Raspberry Pi".

Nu kan vi:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Hvad???" © Ja-jo! Ingen systemd. Ingen fashionable kombinationsløsninger (i form af firewalld), der til sidst gør det samme.

Vi bruger den gamle gode iptables, hvis service efter opstart vil indlæse netværksreglerne i kernen og derefter pænt afslutte sit arbejde uden at forblive resident og uden at bruge ressourcer. systemd har en elegant IPMasquerade=, men vi vil stadig overlade adresseoversættelse (NAT) og firewall til iptables.

Installerer:

# yum install iptables-services
# systemctl enable iptables ip6tables

Jeg foretrækker at gemme iptables konfiguration i form af et script (eksempel):

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

Udfør det ovenstående script og mister muligheden for at oprette nye trådløse ssh-forbindelser til "Raspberry Pi". Det er rigtigt, vi har lavet en Wi-Fi router, som adgang til "over internettet" som standard er forbudt - nu kun "over luften". Tilslut leverandørens kabel til Ethernet og begynd at surfe!

8. Bonus: +2,4GHz

Da jeg samlede den første Raspberry-router ud fra den ovenfor beskrevne skitse, opdagede jeg, at jeg havde et antal gadgets, som af konstruktionsmæssige årsager ikke kunne se "malin" via Wi-Fi overhovedet. Det ville være usportsligt at omkonfigurere routeren til at arbejde i 802.11b/g/n, da den maksimale hastighed i så fald ikke ville overstige 40 Mbit, mens min yndlingsinternetudbyder tilbyder mig 100 (via kabel).

Faktisk var løsningen på problemet allerede blevet opfundet: en anden Wi-Fi-interface, der arbejder på frekvensen 2,4GHz, og et andet adgangspunkt. Jeg købte i den nærmeste kiosk ikke den første, men den anden USB Wi-Fi "dongle" jeg fandt. Sælgeren blev overfaldet med spørgsmål om chipsettet, kompatibilitet med ARM-linux-kerner og muligheden for at arbejde i AP-tilstand (det var ham, der startede).

Vi konfigurerer "donglen" analogt med den indbyggede Wi-Fi-adapter.

Først - lad os omdøbe den til 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

Vi vil overdrage styringen af det nye Wi-Fi-interface til en separat daemon hostapd, som vil blive startet og stoppet i afhængighed af, om den specifikke "dongle": wl1 er til stede i systemet.

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

Indholdet af denne fil afhænger direkte af modellen af USB Wi-Fi-adapteren, så en simpel copy/paste kan føre til problemer.

Vi kopierer distributions-servicefilen til /etc/systemd/system/hostapd2.service:

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

og bringer dens indhold til følgende 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

Det er nu tid til at aktivere den nye instans af hostapd:

# systemctl enable hostapd2

Og så er det gjort! Ryst "donglen" og selve "malinen", og kig på de trådløse netværk omkring dig.

Til sidst vil jeg gerne advare om kvaliteten af USB Wi-Fi-adapteren og strømforsyningen til Raspberry. En tilsluttet "dongle" kan nogle gange forårsage "frysninger" af malinen på grund af kortvarige elektriske problemer.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster