Raspberry Pi + CentOS = Wi-Fi Hotspot (sau router zmeură cu pălărie roșie)

Există o cantitate imensă de informații pe Internet despre crearea punctelor de acces Wi-Fi bazate pe un computer cu o singură placă Raspberry. De regulă, aceasta înseamnă utilizarea sistemului de operare Raspbian nativ pentru Raspberry.

Fiind un adept al sistemelor bazate pe RPM, nu am putut trece pe lângă acest mic miracol și să nu încerc pe iubitul meu CentOS.

Articolul oferă instrucțiuni pentru realizarea unui router Wi-Fi 5GHz/AC dintr-un Raspberry Pi 3 Model B+ bazat pe sistemul de operare CentOS. Vor exista mai multe trucuri standard, dar puțin cunoscute, și ca bonus - un desen pentru conectarea echipamentelor Wi-Fi suplimentare la Raspberry, permițându-i să funcționeze simultan în mai multe moduri (2,4+5GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (sau router zmeură cu pălărie roșie)
(mix de imagini disponibile gratuit)

Să observăm imediat că unele viteze cosmice nu vor funcționa. Strâng maxim 100 Mbps din Raspberry-ul meu prin aer, iar acest lucru acoperă viteza furnizorului meu de internet. De ce ai nevoie de un AC atât de lent, dacă teoretic poți obține jumătate de gigabit chiar și pe N? Dacă ți-ai pus această întrebare, atunci mergi la magazin pentru a cumpăra un router adevărat cu opt antene externe.

0. Ce vei avea nevoie

  • De fapt, „produsul zmeură” în sine este de calibru: Pi 3 Model B+ (pentru a atinge vitezele și canalele râvnite de 5GHz);
  • MicroSD bun >= 4GB;
  • Stație de lucru cu cititor/scriitor Linux și microSD;
  • Disponibilitatea unor abilități suficiente în Linux, articolul este pentru un Geek instruit;
  • Conectivitate la rețea prin cablu (eth0) între Raspberry și Linux, rulând server DHCP în rețeaua locală și acces la Internet de pe ambele dispozitive.

Un mic comentariu asupra ultimului punct. „Care a fost primul, oul sau...” cum să faci un router Wi-Fi în absența oricărui echipament de acces la internet? Să lăsăm acest exercițiu distractiv în afara domeniului de aplicare al articolului și să presupunem pur și simplu că Raspberry este conectat la rețeaua locală prin cablu și are acces la Internet. În acest caz, nu vom avea nevoie de un televizor suplimentar și de un manipulator pentru a configura „zmeura”.

1. Instalați CentOS

Pagina principală a proiectului

La momentul scrierii acestui articol, versiunea de rulare a CentOS pe dispozitiv este pe 32 de biți. Undeva pe World Wide Web am dat peste păreri că performanța unor astfel de sisteme de operare pe arhitectura ARM pe 64 de biți este redusă cu până la 20%. Voi părăsi acest moment fără comentarii.

Pe Linux, descărcați imaginea minimă cu nucleul "-RaspberryPI-"și scrieți-l pe microSD:

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

Înainte de a începe să folosim imaginea, vom elimina partiția SWAP din ea, vom extinde rădăcina la întregul volum disponibil și vom scăpa de SELinux. Algoritmul este simplu: faceți o copie a rădăcinii pe Linux, ștergeți toate partițiile de pe microSD, cu excepția primei (/boot), creați o nouă rădăcină și returnați conținutul acesteia din copie.

Exemplu de acțiuni necesare (ieșire severă din consolă)

# 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

După despachetarea conținutului partiției rădăcină, este timpul să-i faceți câteva modificări.

Dezactivați SELinux în /mnt/etc/selinux/config:

SELINUX=disabled

Editare /mnt/etc/fstab, lăsând în el doar două intrări despre partiții: boot (/boot, no changes) și root (schimbăm valoarea UUID, care poate fi aflată studiind rezultatul comenzii blkid pe Linux):

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

În cele din urmă, modificăm parametrii de pornire a nucleului: specificăm o nouă locație pentru partiția rădăcină, dezactivăm ieșirea informațiilor de depanare și (opțional) interzicem nucleului să atribuie adrese IPv6 pe interfețele de rețea:

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

Iată conținutul /mnt/cmdline.txt la următoarea formă (un rând fără cratime):

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

Finish:

# cd
# umount /mnt
# sync

Rearanjam microSD-ul în „zmeura”, îl lansăm și obținem acces la rețea prin ssh (root/centos).

2. Configurarea CentOS

Primele trei mișcări de neclintit: passwd, yum -y actualizare, reporniți.

Oferim managementul rețelei în rețea:

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

Creați un fișier (împreună cu directoare) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Repornim „zmeura” și obținem din nou acces la rețea prin ssh (adresa IP se poate schimba). Atenție la ceea ce se folosește /etc/resolv.conf, creat anterior de Network Manager. Prin urmare, în caz de probleme cu rezolvarea, editați conținutul acestuia. Utilizare sistem-rezolvat nu vom.

Eliminam „inutilul”, reparăm și accelerăm încărcarea sistemului de operare:

# 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

Cine are nevoie cron si cine nu digera incorporatul cronometre systemd, poate stabili ce lipsește. / var / log- și uită-te prin jurnalctl. Dacă aveți nevoie de istoricul jurnalului (în mod implicit, informațiile sunt stocate numai din momentul pornirii sistemului):

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

Dezactivați utilizarea IPv6 de către serviciile de bază (dacă este necesar)/ Etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Relevanța timpului pentru „zmeura” este un lucru important. Deoarece din cutie nu există nicio capacitate hardware de a salva starea curentă a ceasului la repornire, este necesară sincronizarea. Un demon foarte bun și rapid pentru asta este cronică - deja instalat și pornește automat. Puteți schimba serverele NTP cu cele mai apropiate.

/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

Pentru a seta fusul orar vom folosi truc. Deoarece scopul nostru este să creăm un router Wi-Fi care să funcționeze la frecvențe de 5GHz, ne vom pregăti pentru surprize în avans regulator:

# yum info crda
Rezumat: Daemon de conformitate cu reglementările pentru rețelele fără fir 802.11

Acest design malefic, bazat și pe fusul orar, „interzice” utilizarea (în Rusia) a frecvențelor de 5 GHz și a canalelor cu numere „înalte”. Trucul este să setați un fus orar fără a folosi numele continentelor/orașelor, adică în loc de:

# timedatectl set-timezone Europe/Moscow

Apăsăm:

# timedatectl set-timezone Etc/GMT-3

Și ultimele retușuri la coafura sistemului:

# 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. Suplimente CentOS

Tot ceea ce s-a spus mai sus poate fi considerat instrucțiuni complete pentru instalarea „vanilie” CentOS pe Raspberry Pi. Ar trebui să ajungeți cu un PC care (re)pornește în mai puțin de 10 secunde, folosește mai puțin de 15 Megaocteți de RAM și 1.5 Gigaocteți de microSD (de fapt, mai puțin de 1 Gigabyte din cauza unui /boot incomplet, dar să fim sinceri).

Pentru a instala software pentru punctul de acces Wi-Fi pe acest sistem, va trebui să extindeți ușor capacitățile distribuției standard CentOS. În primul rând, să facem upgrade la driverul (firmware-ul) adaptorului Wi-Fi încorporat. Pagina de start a proiectului spune:

Wifi pe Raspberry 3B și 3B+

Fișierele firmware Raspberry PI 3B/3B+ nu pot fi distribuite de către proiectul CentOS. Puteți folosi următoarele articole pentru a înțelege problema, a obține firmware-ul și a configura wifi-ul.

Ceea ce este interzis pentru proiectul CentOS nu ne este interzis pentru uz personal. Înlocuim firmware-ul Wi-Fi de distribuție în CentOS cu cel corespunzător de la dezvoltatorii Broadcom (aceleași blob-uri binare urâte...). Acest lucru, în special, vă va permite să utilizați AC în modul punct de acces.

Actualizare firmware Wi-FiAflați modelul dispozitivului și versiunea actuală de firmware:

# 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 

Vedem că versiunea de firmware este 7.45.18 din 01.03.2015/XNUMX/XNUMX și ne amintim următorul set de numere: 43455 (brcmfmac43455-sdio.bin).

Descărcați imaginea actuală Raspbian. Leneșii pot scrie imaginea pe microSD și pot lua fișierele cu firmware-ul de acolo. Sau puteți monta partiția rădăcină a imaginii în Linux și copiați ceea ce aveți nevoie de acolo:

# 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

Fișierele de firmware rezultate ale adaptorului Wi-Fi trebuie copiate și înlocuite cu „zmeura” în director /usr/lib/firmware/brcm/

Repornim viitorul router și zâmbim mulțumiți:

# 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 

Versiunea: 7.45.154 din 27.02.2018.

Și bineînțeles 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. Configurarea rețelei și provocările viitoare

După cum am convenit mai sus, „zmeura” este conectată prin „sârmă” la rețeaua locală. Să presupunem că furnizorul oferă acces la Internet exact în același mod: adresa de pe rețeaua publică este emisă dinamic de serverul DHCP (poate cu legare MAC). În acest caz, după configurarea finală a zmeurii, trebuie doar să „conectați” cablul furnizorului și ați terminat. Utilizare autorizare systemd-networkd - subiectul unui articol separat și nu este discutat aici.

Interfața (interfețele) Wi-Fi a Raspberry este o rețea locală, iar adaptorul Ethernet încorporat (eth0) este extern. Să numerotăm rețeaua locală în mod static, de exemplu: 192.168.0.0/24. Adresa Zmeura: 192.168.0.1. Un server DHCP va funcționa pe rețeaua externă (Internet).

Problemă de consistență a denumirii и celebru programator din Guatemala - două necazuri care așteaptă pe oricine configurează interfețele și serviciile de rețea în distribuțiile systemd.

Haos paralel (digresiune lirică)Lennart Pottering și-a compilat propriul program systemd Foarte bun. Acest systemd lansează atât de repede alte programe încât aceștia, neavând timp să-și revină din fluierul arbitrului, se poticnesc și cad la start fără măcar să-și înceapă cursa cu obstacole.

Dar, serios, paralelizarea agresivă a proceselor lansate la începutul sistemului de operare systemd este un fel de „punte de măgar” pentru specialiștii LSB secvențiali experimentați. Din fericire, punerea ordinii în acest „haos paralel” se dovedește a fi simplă, deși nu întotdeauna evidentă.

Creăm două interfețe bridge virtuale cu nume constante: lan и spălăcit. Vom „conecta” adaptorul(e) Wi-Fi la primul, iar eth0 „zmeura” la al doilea.

/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=da elimină necesitatea de a sugera nucleul prin sysctl pentru a activa rutarea.
MACAddress= Să decomentăm și să schimbăm dacă este necesar.

Mai întâi „conectăm” eth0. Ne amintim „problema de uniformitate” și folosim doar adresa MAC a acestei interfețe, care poate fi găsită, de exemplu, astfel:

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

Noi creăm /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Ștergem fișierul de configurare anterior eth0, repornim Raspberry și obținem acces la rețea (adresa IP se va schimba cel mai probabil):

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

5.DNSMASQ

Pentru a crea puncte de acces Wi-Fi, nimic nu bate un cuplu dulce dnsmasq + hostapd încă nu mi-am dat seama. În opinia mea.

În caz că cineva a uitat, atunci...hostapd - acesta este lucrul care controlează adaptoarele Wi-Fi (în special, se va ocupa de conectarea lor la virtual lan „zmeura”), autorizează și înregistrează clienții wireless.

dnsmasq — configurează stiva de clienți din rețea: emite adrese IP, servere DNS, gateway implicit și delicii similare.

Să începem cu dnsmasq:

# yum install dnsmasq

șablon /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

editați-l după bunul plac.

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

„Magia” aici constă în parametru bind-dinamic, care îi spune demonului dnsmasq să aștepte până când apare pe sistem interfață=lan, și nu leșin de o criză de singurătate mândră după început.

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

6. HOSTAPD

Și în sfârșit, configurațiile magice hostapd. Nu am nicio îndoială că cineva citește acest articol în căutarea tocmai a acestor rânduri prețuite.

Înainte de a instala hostapd, trebuie să depășiți „problema de uniformitate”. Adaptorul Wi-Fi încorporat wlan0 își poate schimba cu ușurință numele în wlan1 atunci când conectați echipamente Wi-Fi USB suplimentare. Prin urmare, vom repara numele interfețelor în felul următor: vom veni cu nume unice pentru adaptoarele (wireless) și le vom lega la adrese MAC.

Pentru adaptorul Wi-Fi încorporat, care este încă wlan0:

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

Noi creăm /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Acum vom fi siguri că wl0 - Acesta este Wi-Fi încorporat. Repornim Raspberry pentru a ne asigura de acest lucru.

Instalare:

# yum install hostapd wireless-tools

Fișier de configurare /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

Fără a uita nicio clipă GKChP, modificați parametrii de care avem nevoie și verificați manual funcționalitatea:

# hostapd /etc/hostapd/hostapd.conf

hostapd va porni în modul interactiv, difuzând starea sa către consolă. Dacă nu există erori, atunci clienții care acceptă modul AC se vor putea conecta la punctul de acces. Pentru a opri hostapd - Ctrl-C.

Tot ce rămâne este să activați hostapd la pornirea sistemului. Dacă faceți lucrul standard (systemctl enable hostapd), atunci după următoarea repornire puteți obține un demon care „se rostogolește în sânge” cu diagnosticul „interfața wl0 nu a fost găsită". Ca urmare a „haosului paralel”, hostapd a pornit mai repede decât a găsit nucleul adaptorul wireless.

Internetul este plin de remedii: de la un timeout forțat înainte de a porni demonul (câteva minute), la un alt demon care monitorizează aspectul interfeței și (re)pornește hostpad-ul. Soluțiile sunt destul de viabile, dar teribil de urâte. Îl chemăm pe cel mare pentru ajutor systemd cu „obiectivele” și „sarcinile” și „dependențele” sale.

Copiați fișierul serviciului de distribuție în /etc/systemd/system/hostapd.service:

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

și reduceți conținutul acestuia la următoarea 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

Magia fișierului de serviciu actualizat constă în legarea dinamică a hostapd la noua țintă - interfața wl0. Când apare interfața, demonul pornește; când dispare, se oprește. Și totul este online - fără a reporni sistemul. Această tehnică va fi utilă în special atunci când conectați un adaptor USB Wi-Fi la un Raspberry.

Acum poti:

# systemctl enable hostapd
# reboot

7. IPTABLES

„Stha???” © Da, da! Nici unul systemd. Fără combine noi (sub formă firewalld), care ajung să facă același lucru.

Să-l folosim pe cel vechi bun iptables, ale căror servicii, după pornire, vor încărca regulile de rețea în nucleu și se vor opri în liniște, fără a rămâne rezidente și fără a consuma resurse. systemd are un elegant IPMasquerade=, dar vom încredința în continuare traducerea adresei (NAT) și firewall-ului iptables.

Instalare:

# yum install iptables-services
# systemctl enable iptables ip6tables

Prefer să stochez configurația iptables ca script (exemplu):

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

Executăm scriptul de mai sus și pierdem capacitatea de a stabili noi conexiuni SSH prin cablu cu Raspberry. Așa este, am realizat un router Wi-Fi, la care accesul „prin internet” este interzis implicit - acum doar „over the air”. Conectăm cablul Ethernet al furnizorului și începem navigarea!

8. Bonus: +2,4 GHz

Când am asamblat primul router Raspberry folosind desenul descris mai sus, am descoperit o serie de gadgeturi în gospodăria mea care, din cauza limitărilor lor de design Wi-Fi, nu puteau vedea deloc „zmeura”. Reconfigurarea routerului pentru a funcționa în 802.11b/g/n a fost nesportiv, deoarece viteza maximă „over the air” în acest caz nu a depășit 40 Mbit, iar furnizorul meu de internet preferat îmi oferă 100 (prin cablu).

De fapt, o soluție la problemă a fost deja inventată: o a doua interfață Wi-Fi care funcționează la o frecvență de 2,4 GHz și un al doilea punct de acces. La o tarabă din apropiere nu am cumpărat primul, ci al doilea „fluier” USB Wi-Fi pe care l-am întâlnit. Vânzătorul a fost chinuit de întrebări legate de chipset, compatibilitatea cu nucleele ARM Linux și posibilitatea de a lucra în modul AP (el a fost primul care a început).

Configuram „fluierul” prin analogie cu adaptorul Wi-Fi încorporat.

Mai întâi, să-l redenumim în 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

Vom încredința gestionarea noii interfețe Wi-Fi unui demon hostapd separat, care va porni și se va opri în funcție de prezența unui „fluier” strict definit în sistem: wl1.

Fișier de configurare /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]

Conținutul acestui fișier depinde direct de modelul adaptorului USB Wi-Fi, așa că o copiere/lipire banală vă poate eșua.

Copiați fișierul serviciului de distribuție în /etc/systemd/system/hostapd2.service:

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

și reduceți conținutul acestuia la următoarea 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

Tot ce rămâne este să activați o nouă instanță de hostapd:

# systemctl enable hostapd2

Asta e tot! Trageți „fluierul” și „zmeura” în sine, uitați-vă la rețelele wireless din jurul vostru.

Și, în sfârșit, vreau să vă avertizez despre calitatea adaptorului USB Wi-Fi și a sursei de alimentare a Raspberry. „Fluierul fierbinte” conectat poate provoca uneori „înghețarea zmeurii” din cauza unor probleme electrice pe termen scurt.

Sursa: www.habr.com

Adauga un comentariu