Raspberry Pi + CentOS = Wi-Fi Hotspot (eller bringebærruter med rød lue)

Det er en enorm mengde informasjon på Internett om å lage Wi-Fi-tilgangspunkter basert på en Raspberry enkeltbretts-PC. Som regel betyr dette å bruke Raspbian-operativsystemet som er hjemmehørende i Raspberry.

Siden jeg er en tilhenger av RPM-baserte systemer, kunne jeg ikke gå forbi dette lille miraklet og ikke prøve mitt elskede CentOS på det.

Artikkelen gir instruksjoner for å lage en 5GHz/AC Wi-Fi-ruter fra en Raspberry Pi 3 Model B+ basert på CentOS-operativsystemet. Det vil være flere standard, men lite kjente triks, og som en bonus - en tegning for å koble ekstra Wi-Fi-utstyr til Raspberry, slik at den kan operere i flere moduser (2,4+5GHz) samtidig.

Raspberry Pi + CentOS = Wi-Fi Hotspot (eller bringebærruter med rød lue)
(blanding av fritt tilgjengelige bilder)

La oss merke med en gang at noen kosmiske hastigheter ikke vil fungere. Jeg presser maksimalt 100 Mbps ut av Raspberry min over luften, og dette dekker hastigheten til internettleverandøren min. Hvorfor trenger du en så treg AC, hvis du i teorien kan få en halv gigabit selv på N? Hvis du har stilt deg selv dette spørsmålet, gå til butikken for å kjøpe en ekte ruter med åtte eksterne antenner.

0. Hva du trenger

  • Faktisk er selve "bringebærproduktet" av kaliber: Pi 3 Model B+ (for å oppnå de ettertraktede 5GHz-hastighetene og kanalene);
  • God microSD >= 4GB;
  • Arbeidsstasjon med Linux og microSD-leser/skriver;
  • Tilgjengelighet av tilstrekkelige ferdigheter i Linux, artikkelen er for en trent Geek;
  • Kablet nettverkstilkobling (eth0) mellom Raspberry og Linux, kjører DHCP-server på det lokale nettverket og Internett-tilgang fra begge enhetene.

En liten kommentar til det siste punktet. "Hvilken kom først, egget eller ..." hvordan lage en Wi-Fi-ruter i fravær av Internett-tilgangsutstyr? La oss la denne underholdende øvelsen ligge utenfor rammen av artikkelen og ganske enkelt anta at Raspberry er koblet til det lokale nettverket via ledning og har tilgang til Internett. I dette tilfellet trenger vi ikke en ekstra TV og en manipulator for å sette opp "bringebær".

1. Installer CentOS

Prosjektets hjemmeside

På tidspunktet for skriving av denne artikkelen er den kjørende versjonen av CentOS på enheten 32-bit. Et sted på World Wide Web kom jeg over meninger om at ytelsen til slike OSer på 64-bit ARM-arkitektur er redusert med så mye som 20%. Jeg vil forlate dette øyeblikket uten kommentarer.

På Linux, last ned det minimale bildet med kjernen "-RaspberryPI-"og skriv det til microSD:

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

Før vi begynner å bruke bildet, vil vi fjerne SWAP-partisjonen fra det, utvide roten til hele det tilgjengelige volumet og bli kvitt SELinux. Algoritmen er enkel: lag en kopi av roten på Linux, slett alle partisjoner fra microSD-en unntatt den første (/boot), lag en ny rot og returner innholdet fra kopien.

Eksempel på nødvendige handlinger (alvorlig konsollutgang)

# 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

Etter å ha pakket ut innholdet i rotpartisjonen, er det på tide å gjøre noen endringer i den.

Deaktiver SELinux i /mnt/etc/selinux/config:

SELINUX=disabled

Redigering /mnt/etc/fstab, og etterlater bare to oppføringer om partisjonene: boot (/boot, ingen endringer) og root (vi endrer UUID-verdien, som du kan finne ut ved å studere utdataene til blkid-kommandoen på Linux):

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

Til slutt endrer vi kjernens oppstartsparametere: vi spesifiserer en ny plassering for rotpartisjonen, deaktiverer utdata for feilsøkingsinformasjon og (valgfritt) forbyr kjernen å tildele IPv6-adresser på nettverksgrensesnitt:

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

Her er innholdet /mnt/cmdline.txt til følgende form (en linje uten bindestrek):

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

Finish:

# cd
# umount /mnt
# sync

Vi omorganiserer microSD til "bringebær", starter den og får nettverkstilgang til den via ssh (root/centos).

2. Sette opp CentOS

De tre første urokkelige bevegelsene: passwd, yum-en oppdatering, omstart.

Vi gir bort nettverksadministrasjon nettverksbasert:

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

Lag en fil (sammen med kataloger) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Vi starter "bringebær" på nytt og får igjen nettverkstilgang til den via ssh (IP-adressen kan endres). Vær oppmerksom på hva som brukes / Etc / resolv.conf, opprettet tidligere av Network Manager. Derfor, i tilfelle problemer med å løse, rediger innholdet. Bruk systemd-løst vi vil ikke.

Vi fjerner det "unødvendige", reparerer og øker belastningen av operativsystemet:

# 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 trenger cron og som ikke fordøyer det innebygde systemd tidtakere, kan fastslå hva som mangler. / var / logg- og se gjennom journalctl. Hvis du trenger logghistorikk (som standard lagres informasjon kun fra det øyeblikket systemet starter):

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

Deaktiver bruken av IPv6 av grunnleggende tjenester (hvis nødvendig)/ Etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Relevansen av tid på "bringebær" er en viktig ting. Siden ut av esken er det ingen maskinvaremulighet for å lagre den nåværende tilstanden til klokken ved omstart, er synkronisering nødvendig. En veldig god og rask demon for dette er chrony - allerede installert og starter automatisk. Du kan endre NTP-servere 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

For å stille inn tidssonen vi skal bruke triks. Siden målet vårt er å lage en Wi-Fi-ruter som opererer på 5GHz-frekvenser, vil vi forberede oss på overraskelser på forhånd regulator:

# nam info crda
Sammendrag: Daemon for overholdelse av forskrifter for 802.11 trådløst nettverk

Denne onde designen, også basert på tidssonen, "forbyr" bruk (i Russland) av 5GHz-frekvenser og kanaler med "høye" tall. Trikset er å sette en tidssone uten å bruke navnene på kontinenter/byer, det vil si i stedet for:

# timedatectl set-timezone Europe/Moscow

Vi trykker på:

# timedatectl set-timezone Etc/GMT-3

Og siste finpuss til frisyren til systemet:

# 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-tillegg

Alt som ble sagt ovenfor kan betraktes som komplette instruksjoner for å installere "vanilla" CentOS på Raspberry Pi. Du bør ende opp med en PC som (re)starter på mindre enn 10 sekunder, bruker mindre enn 15 Megabyte RAM og 1.5 Gigabyte med microSD (faktisk mindre enn 1 Gigabyte på grunn av en ufullstendig /boot, men la oss være ærlige).

For å installere Wi-Fi-tilgangspunktprogramvare på dette systemet, må du utvide mulighetene til standard CentOS-distribusjonen litt. Først av alt, la oss oppgradere driveren (fastvaren) til den innebygde Wi-Fi-adapteren. Prosjektets hjemmeside sier:

Wifi på Raspberry 3B og 3B+

Raspberry PI 3B/3B+-fastvarefilene er ikke tillatt å distribueres av CentOS Project. Du kan bruke følgende artikler for å forstå problemet, få fastvaren og sette opp wifi.

Det som er forbudt for CentOS-prosjektet er ikke forbudt for oss til personlig bruk. Vi erstatter distribusjons-Wi-Fi-fastvaren i CentOS med den tilsvarende fra Broadcom-utviklerne (de samme hatede binære klossene...). Dette vil spesielt tillate deg å bruke AC i tilgangspunktmodus.

Wi-Fi-fastvareoppgraderingFinn ut enhetsmodellen og gjeldende fastvareversjon:

# 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 fastvareversjonen er 7.45.18 datert 01.03.2015/XNUMX/XNUMX, og husk følgende sett med tall: 43455 (brcmfmac43455-sdio.bin).

Last ned gjeldende Raspbian-bilde. Late mennesker kan skrive bildet til microSD og ta filene med fastvaren derfra. Eller du kan montere rotpartisjonen til bildet i Linux og kopiere det du trenger 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 resulterende Wi-Fi-adapterfastvarefilene må kopieres og erstattes med "bringebær" inn i katalogen /usr/lib/firmware/brcm/

Vi starter den fremtidige ruteren på nytt og smiler fornøyd:

# 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 

Versjon: 7.45.154 datert 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. Nettverkskonfigurasjon og utfordringer fremover

Som vi ble enige om ovenfor, er "bringebær" koblet med "ledning" til det lokale nettverket. La oss anta at leverandøren gir Internett-tilgang på nøyaktig samme måte: adressen på det offentlige nettverket utstedes dynamisk av DHCP-serveren (kanskje med MAC-binding). I dette tilfellet, etter det endelige oppsettet av bringebæret, trenger du bare å "plugge" leverandørens kabel inn i den, og du er ferdig. Autorisasjon ved hjelp av systemd-nettverkd - emnet for en egen artikkel og diskuteres ikke her.

Raspberrys Wi-Fi-grensesnitt(er) er et lokalt nettverk, og den innebygde Ethernet-adapteren (eth0) er ekstern. La oss nummerere det lokale nettverket statisk, for eksempel: 192.168.0.0/24. Bringebæradresse: 192.168.0.1. En DHCP-server vil operere på det eksterne nettverket (Internett).

Navngivningskonsistensproblem и kjent guatemalansk programmerer - to problemer som venter på alle som konfigurerer nettverksgrensesnitt og tjenester i systemdistribusjoner.

Parallelt kaos (lyrisk digresjon)Lennart Pottering har satt sammen et eget program systemd Veldig bra. Dette systemd lanserer andre programmer så raskt at de, som ikke har tid til å komme seg etter dommerens fløyteslag, snubler og faller i starten uten engang å starte sin hinderløype.

Men seriøst, den aggressive parallelliseringen av lanserte prosesser ved starten av systemd OS er en slags "eselbro" for erfarne sekvensielle LSB-spesialister. Heldigvis viser det seg å være enkelt å bringe orden i dette "parallelle kaoset", men ikke alltid åpenbart.

Vi lager to virtuelle brogrensesnitt med konstante navn: lan и wan. Vi vil "koble" Wi-Fi-adapteren(e) til den første, og eth0 "bringebær" til den andre.

/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 eliminerer behovet for å hint til kjernen via sysctl for å aktivere ruting.
MACA-adresse= La oss fjerne kommentarer og endre om nødvendig.

Først "kobler" vi eth0. Vi husker "uniformitetsproblemet" og bruker bare MAC-adressen til dette grensesnittet, som for eksempel kan bli funnet ut slik:

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

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

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

[Network]
Bridge=wan

Vi sletter den forrige konfigurasjonsfilen eth0, starter Raspberry på nytt og får nettverkstilgang til den (IP-adressen vil mest sannsynlig endres):

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

5.DNSMASQ

For å lage Wi-Fi-tilgangspunkter er det ingenting som slår et søtt par dnsmasq + hostapd har ikke funnet ut av det enda. Etter min mening.

I tilfelle noen har glemt det, så...hostapd - dette er tingen som styrer Wi-Fi-adaptere (spesielt vil den ta seg av å koble dem til den virtuelle lan "bringebær"), autoriserer og registrerer trådløse klienter.

dnsmasq — konfigurerer nettverksstabelen med klienter: utsteder IP-adresser, DNS-servere, standard gateway og lignende gleder.

La oss starte med dnsmasq:

# yum install dnsmasq

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

rediger den etter eget ønske.

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" her ligger i parameteren bind-dynamisk, som ber dnsmasq-demonen vente til den vises på systemet interface=lan, og ikke besvime av et anfall av stolt ensomhet etter start.

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

6. HOSTAPD

Og til slutt, de magiske hostapd-konfigurasjonene. Jeg er ikke i tvil om at noen leser denne artikkelen på jakt etter nettopp disse dyre linjene.

Før du installerer hostapd, må du overvinne "uniformitetsproblemet". Den innebygde Wi-Fi-adapteren wlan0 kan enkelt endre navn til wlan1 når du kobler til ekstra USB Wi-Fi-utstyr. Derfor vil vi fikse grensesnittnavnene på følgende måte: vi vil komme opp med unike navn for de (trådløse) adapterene og binde dem til MAC-adresser.

For den innebygde Wi-Fi-adapteren, som fortsatt er wlan0:

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

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

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

[Link]
Name=wl0

Nå skal vi være sikre på det wl0 – Dette er innebygd Wi-Fi. Vi starter Raspberry på nytt for å være sikker på dette.

Installere:

# yum install hostapd wireless-tools

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

Uten å glemme et øyeblikk Statens beredskapsutvalg, endre parameterne vi trenger og sjekk manuelt for funksjonalitet:

# hostapd /etc/hostapd/hostapd.conf

hostapd vil starte i interaktiv modus og kringkaste statusen til konsollen. Hvis det ikke er noen feil, vil klienter som støtter AC-modus kunne koble seg til tilgangspunktet. For å stoppe hostapd - Ctrl-C.

Alt som gjenstår er å aktivere hostapd i systemoppstarten. Hvis du gjør standardtingen (systemctl aktiver hostapd), kan du etter neste omstart få en demon som "ruller i blod" med diagnosen "grensesnitt wl0 ikke funnet". Som et resultat av "parallelt kaos" startet hostapd opp raskere enn kjernen fant den trådløse adapteren.

Internett er fullt av rettsmidler: fra en tvungen tidsavbrudd før du starter demonen (flere minutter), til en annen demon som overvåker utseendet til grensesnittet og (re)starter hostpad. Løsningene er ganske brukbare, men fryktelig stygge. Vi ber den store om hjelp systemd med sine "mål" og "oppgaver" og "avhengigheter".

Kopier distribusjonstjenestefilen til /etc/systemd/system/hostapd.service:

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

og reduser innholdet til følgende 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

Magien med den oppdaterte tjenestefilen ligger i den dynamiske bindingen av hostapd til det nye målet - wl0-grensesnittet. Når grensesnittet vises, starter demonen; når den forsvinner, stopper den. Og alt dette er online - uten å starte systemet på nytt. Denne teknikken vil være spesielt nyttig når du kobler en USB Wi-Fi-adapter til en bringebær.

Nå kan du:

# systemctl enable hostapd
# reboot

7. IPTABLER

"Hva???" © Ja, ja! Ingen systemd. Ingen nymotens skurtreskere (i form brannmur), som ender opp med å gjøre det samme.

La oss bruke den gode gamle iptables, hvis tjenester, etter oppstart, vil laste nettverksregler inn i kjernen og stille ned uten å forbli hjemmehørende og uten å bruke ressurser. systemd har en elegant IPMasquerade=, men vi vil fortsatt overlate adresseoversettelsen (NAT) og brannmuren til iptables.

Installere:

# yum install iptables-services
# systemctl enable iptables ip6tables

Jeg foretrekker å lagre iptables-konfigurasjonen som et skript (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

Vi kjører skriptet ovenfor og mister muligheten til å etablere nye kablede SSH-forbindelser med Raspberry. Det er riktig, vi har laget en Wi-Fi-ruter, tilgang til som "via Internett" er forbudt som standard - nå bare "over luften". Vi kobler til leverandørens Ethernet-kabel og begynner å surfe!

8. Bonus: +2,4GHz

Da jeg satte sammen den første bringebærruteren ved å bruke tegningen beskrevet ovenfor, oppdaget jeg en rekke dingser i husholdningen min som på grunn av deres Wi-Fi-designbegrensninger ikke kunne se "bringebæret" i det hele tatt. Å rekonfigurere ruteren til å fungere i 802.11b/g/n var usportslig, siden den maksimale hastigheten "over luften" i dette tilfellet ikke oversteg 40 Mbit, og min favoritt Internett-leverandør tilbyr meg 100 (via kabel).

Faktisk er en løsning på problemet allerede oppfunnet: et andre Wi-Fi-grensesnitt som opererer med en frekvens på 2,4 GHz, og et andre tilgangspunkt. På en bod i nærheten kjøpte jeg ikke den første, men den andre USB Wi-Fi-fløyten jeg kom over. Selgeren ble plaget av spørsmål om brikkesettet, kompatibilitet med ARM Linux-kjerner og muligheten for å jobbe i AP-modus (han var den første som startet).

Vi konfigurerer "fløyten" analogt med den innebygde Wi-Fi-adapteren.

Først, la oss gi det nytt navn 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 overlate administrasjonen av det nye Wi-Fi-grensesnittet til en egen hostapd-demon, som vil starte og stoppe avhengig av tilstedeværelsen av en strengt definert "fløyte" i systemet: wl1.

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

Innholdet i denne filen avhenger direkte av modellen til USB Wi-Fi-adapteren, så en banal kopi/lim inn kan svikte deg.

Kopier distribusjonstjenestefilen til /etc/systemd/system/hostapd2.service:

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

og reduser innholdet 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

Alt som gjenstår er å aktivere en ny forekomst av hostapd:

# systemctl enable hostapd2

Det er alt! Trekk i "fløyten" og selve "bringebæret", se på de trådløse nettverkene rundt deg.

Og til slutt vil jeg advare deg om kvaliteten på USB Wi-Fi-adapteren og strømforsyningen til Raspberry. Tilkoblet "varm fløyte" kan noen ganger forårsake "bringebærfrysing" på grunn av kortvarige elektriske problemer.

Kilde: www.habr.com

Legg til en kommentar