Există o cantitate uriașă de informații pe internet despre cum să creezi puncte de acces Wi-Fi pe baza unui PC cu un singur tablou Raspberry. De obicei, se presupune utilizarea sistemului de operare nativ pentru "mălincă" — Raspbian.
Fiind un adept al sistemelor bazate pe RPM, nu am putut să trec cu vederea această mică minune și să nu încerc pe ea CentOS, preferatul meu.
Articolul de față prezintă un ghid pentru fabricarea unui router Wi-Fi 5GHz/AC din Raspberry Pi 3 Model B+ pe baza sistemului de operare CentOS. Vor fi câteva trucuri standard, dar mai puțin cunoscute, iar ca bonus — un desen de conectare a echipamentului Wi-Fi suplimentar la "mălincă", permițându-i să funcționeze simultan în mai multe moduri (2,4+5GHz).

(mix de imagini din acces gratuit)
Să menționăm imediat că nu veți obține viteze cosmice. Eu scot de la "mălincă" prin aer maximum 100 Mbps, iar aceasta acoperă viteza furnizorului meu de Internet. De ce ai avea nevoie de un AC atât de lent, când în teorie poți obține o jumătate de gigabit chiar și cu N? Dacă te-ai întrebat asta, atunci du-te la magazin și cumpără un router adevărat cu opt antene externe.
0. Ce va fi necesar
- Practic, produsul "mălinii" calibrat: Pi 3 Model B+ (pentru a atinge vitezele și canalele dorite de 5GHz);
- O microSD bună >= 4GB;
- Un stație de lucru cu Linux și un cititor/scritor microSD;
- Să ai suficiente abilități în Linux, articolul este destinat unui Geek pregătit;
- O conexiune de rețea prin cablu (eth0) între Raspberry și Linux, un server DHCP funcțional în rețeaua locală și acces la Internet de pe ambele dispozitive.
Un mic comentariu cu privire la ultimul punct. "Ce a apărut prima dată, oul sau..." cum să faci un router Wi-Fi în absența oricărui echipament de acces la Internet? Vom lăsa acest exercițiu captivant în afara articolului și doar vom presupune că Raspberry este conectată la rețeaua locală prin cablu și are acces la Internet. În acest caz, nu avem nevoie de un televizor suplimentar sau de un manipulator pentru a configura "mălinca".
1. Instalarea CentOS
La momentul scrierii acestui articol, versiunea funcțională a CentOS pe dispozitiv este 32-biți. Pe undeva pe întinderile rețelei mondiale, am întâlnit păreri despre o scădere a performanței acestor OS-uri pe arhitectura ARM de 64 biți cu până la 20%. Voi lăsa acest aspect fără comentarii.
Pe Linux, descărcăm imaginea minimă cu kernel "-RaspberryPI-» și îl scriem pe microSD:
# xzcat CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz |
dd of=/dev/mmcblk0 bs=4M
# sync
Înainte de a folosi imaginea, vom elimina partiția SWAP, vom extinde rădăcina la întreaga capacitate disponibilă și ne vom debarasa de SELinux. Algoritmul este simplu: facem o copie a rădăcinii pe Linux, eliminăm toate partițiile de pe microSD, cu excepția primei (\/boot), creăm o nouă partiție de rădăcină și returnăm conținutul acesteia din copie.
Exemplu de acțiuni necesare (ieșire brută 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ă dezarhivarea conținutului partiției de rădăcină, este momentul să facem unele modificări.
Dezactivăm SELinux în /mnt/etc/selinux/config:
Pentru a dezactiva, modificați parametrul SELINUX astfel:
Edităm /mnt/etc/fstab, lăsându-i doar două înregistrări despre partiții: una pentru boot (\/boot, fără modificări) și una pentru rădăcină (schimbăm valoarea UUID, care poate fi aflată din ieșirea 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ă, schimbăm parametrii de boot ai nucleului: indicăm noua locație a partitiei de rădăcină, dezactivăm ieșirea informațiilor de depanare și (opțional) interzicem nucleului să aloce adrese IPv6 pe interfețele de rețea:
# cd
# umount /mnt
# mount /dev/mmcblk0p1 /mnt
Aducem conținutul /mnt/cmdline.txt la următoarea formă (o linie fără întreruperi):
root=\/dev\/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet ipv6.disable_ipv6=1
Gata:
# cd
# umount /mnt
# sync
Mutăm microSD în «malină», pornim și obținem acces de rețea prin ssh (root\/centos).
2. Configurarea CentOS
Primele trei mișcări de neclintit: passwd, yum -y update, repornire.
Predăm gestionarea rețelei networkd:
# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off
Creăm fișierul (împreună cu directoarele) /etc/systemd/network/eth0.network:
[Match]
Name=eth0
[Network]
DHCP=ipv4
Rebootăm «malina» și obținem din nou acces de rețea prin ssh (IP-ul se poate schimba). Vă rugăm să rețineți că se folosește /etc/resolv.conf, creat anterior de Network Manager. Prin urmare, în cazul unor probleme cu rezolvarea, editați conținutul acestuia. Nu vom folosi systemd-resolved .
Eliminăm «de prisos», reparăm și accelerăm boot-ul OS-ului:
# 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 de cron și cine nu suportă încorporatele , pot instala lipsa aceasta. /var/log- și ne uităm prin journalctl. Dacă va fi nevoie de istoricul jurnalului (în mod implicit, informațiile sunt păstrate doar din momentul pornirii sistemului):
# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf
Dezactivăm utilizarea IPv6 de către principalele servicii (dacă este necesar)/etc/ssh/sshd_config:
AddressFamily inet
/etc/sysconfig/chronyd:
OPTIONS="-4"
Relevanța timpului pe «malină» este o chestiune importantă. Deoarece «din cutie» lipsește capacitatea hardware de a păstra starea curentă a ceasului la repornire, este necesară sincronizarea. Un daemon foarte bun și rapid pentru asta este chrony — este deja instalat și se pornește automat. Se pot 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 stabili fusul orar, vom folosi un truc. Deoarece obiectivul nostru este crearea unui router Wi-Fi care să funcționeze pe frecvențe de 5GHz, ne pregătim din timp pentru surprize regulator:
# yum info crda
Sumar: Demon de conformitate regulamentară pentru rețelele wireless 802.11
Această construcție malefică, luând în considerare și fusul orar, "interzice" utilizarea (în Rusia) frecvențelor de 5GHz și canalelor cu numere "mare". Trucul constă în setarea zonei de timp fără a folosi denumiri de continente/orașe, adică în loc de:
# timedatectl set-timezone Europe/Moscow
Împingem:
# timedatectl set-timezone Etc/GMT-3
Iar ultimele retușuri în coafura sistemului:
# hostnamectl set-hostname router
/root/.bash_profile:
. . .
# Mediu specific utilizatorului și programe de pornire
export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin
3. Extensii CentOS
Tot ce a fost spus mai sus poate fi considerat un ghid complet pentru instalarea „vanilă” CentOS pe Raspberry Pi. Trebuie să obțineți un PC care (re)pornește în mai puțin de 10 secunde, folosește mai puțin de 15 Megabytes de memorie RAM și 1.5 Gigabytes de microSD (de fapt, mai puțin de 1 Gigabyte din cauza partiției incomplecte /boot, dar să fim sinceri până la capăt).
Pentru a instala software-ul pentru punctul de acces Wi-Fi pe acest sistem, va fi necesar să extindem puțin capacitățile distribuției standard CentOS. În primul rând, vom "îmbunătăți" driverul (firmware) adaptorului Wi-Fi încorporat. Pe pagina principală a proiectului se specifică:
Wifi pe Raspberry 3B și 3B+
Fișierele de firmware pentru Raspberry PI 3B/3B+ nu pot fi distribuite de 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 nu poate face proiectul CentOS, nu ne este interzis pentru uz personal. Înlocuim firmware-ul Wi-Fi din distribuție în CentOS cu cel corespunzător dezvoltat de Broadcom (celebrele blob-uri binare…). Aceasta, printre altele, va permite utilizarea AC în modul punct de acces.
Actualizare firmware Wi-FiIdentificăm modelul dispozitivului și versiunea curentă a firmware-ului:
# 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ă firmware-ul versiunea 7.45.18 din 01.03.2015, și memorăm următorul set de cifre: 43455 (brcmfmac43455-sdio.bin).
. Cei leneși pot scrie imaginea pe microSD și de acolo pot obține fișierele de firmware. Sau se poate monta partiția rădăcină a imaginii în Linux și copia ce e necesar 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 ale adaptorului Wi-Fi trebuie copiate cu înlocuirea pe „malin” în director /usr/lib/firmware/brcm/
Rebootăm routerul viitor și zâmbim fericit:
# 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 dificultățile viitoare
Așa cum am convenit anterior, „raspberry” este conectat „prin cablu” la rețeaua locală. Să presupunem că și providerul oferă acces la Internet în exact același mod: adresa din rețeaua publică este alocată dinamic de serverul DHCP (poate fi legată de MAC). În acest caz, după configurarea finală a „raspberry”, este suficient să „introducem” cablul providerului în ea și totul este gata. Autorizarea prin systemd-networkd — este un subiect aparte și nu este discutat aici.
Interfața Wi-Fi a Raspberry este rețeaua locală, iar adaptorul Ethernet încorporat (eth0) este extern. Să numerotăm rețeaua locală static, de exemplu: 192.168.0.0/24. Adresa „raspberry”: 192.168.0.1. În rețeaua externă (Internet) va funcționa serverul DHCP.
și — sunt două neplăceri care așteaptă pe oricine se ocupă de configurarea interfețelor de rețea și a serviciilor în distribuțiile systemd.
Haosul paralel (o digresiune lirică)Lennart Poettering și-a elaborat programul systemd foarte bine. Acesta systemd lansează alte programe atât de repede, încât acestea, neavând timp să se dezmeticească de lovitura de start, se împiedică și cad la start fără a începe chiar cursa cu obstacole.
Dacă vorbim serios, atunci paralelizarea agresivă a proceselor lansate la startul sistemului de operare systemd este un fel de „pod de măgar” pentru veteranii LSB secvențiali. Din fericire, a aduce acest „haos paralel” în ordine se dovedește a fi o sarcină simplă, deși nu întotdeauna evidentă.
Creăm două interfețe virtuale de tip bridge cu nume permanente: lan și wan. La primul „ne vom conecta” adaptorul Wi-Fi, iar la al doilea — eth0 de la „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 elimină necesitatea de a sugera kernelului prin sysctl să activeze rutarea.
MACAddress= o vom desfunda și modifica dacă este necesar.
Mai întâi „ne conectăm” eth0. Să ne amintim de „problema uniformității” și să folosim doar adresa MAC a acestei interfețe, pe care o putem afla, de exemplu, așa:
# cat /sys/class/net/eth0/address
Creăm /etc/systemd/network/eth.network:
[Match]
MACAddress=b8:27:eb:xx:xx:xx
[Network]
Bridge=wan
Eliminăm fișierul de configurare et0 anterior, repornim „măcelarul” ș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 crearea punctelor de acces Wi-Fi, nu există o combinație mai bună decât dnsmasq + hostapd încă nu s-a găsit. În opinia mea.
Dacă cineva a uitat, atunci... — este un program care gestionează adaptoarele Wi-Fi (în special, va prelua sarcina de a le conecta la lan „măcelarul” virtual), autorizează și înregistrează clienții wireless.
— configurează stiva de rețea a clienților: oferă adrese IP, servere DNS, gateway implicit și alte asemenea facilități.
Î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
îl edităm după bunul nostru 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 parametrul bind-dynamic, care indică demonului dnsmasq să aștepte apariția în sistem interface=lan, și nu să panică de singurătate mândră după pornire.
# 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 acestor rânduri prețioase.
Înainte de a instala hostapd, trebuie să ne confruntăm cu „problema uniformității”. Adaptorul Wi-Fi încorporat wlan0 își poate schimba ușor numele în wlan1 atunci când se conectează un echipament USB Wi-Fi suplimentar. Așadar, să fixăm numele interfețelor în felul următor: să venim cu denumiri unice pentru adaptoarele (wireless) și să le corelăm cu adresele MAC.
Pentru adaptorul Wi-Fi încorporat, care este încă wlan0:
# cat /sys/class/net/wlan0/address
b8:27:eb:xx:xx:xx
Creăm /etc/systemd/network/wl0.link:
[Match]
MACAddress=b8:27:eb:xx:xx:xx
[Link]
Name=wl0
Acum vom fi siguri că wl0 — este Wi-Fi-ul încorporat. Repornim „măcelarul” pentru a ne asigura de acest lucru.
Instalăm:
# yum install hostapd wireless-tools
Fișierul 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
Nici măcar pentru o clipă să nu uităm de , modificăm parametrii necesari și verificăm manual funcționarea acestora:
# hostapd /etc/hostapd/hostapd.conf
hostapd va porni în modul interactiv, transmițând starea sa către consolă. Dacă nu apar erori, clienții care suportă modul AC se pot conecta deja la punctul de acces. Pentru a opri hostapd — Ctrl-C.
Trebuie acum să activăm hostapd pentru a porni automat la încărcarea sistemului. Dacă procedăm în mod standard (systemctl enable hostapd), după o repornire, putem obține un demon „făcându-se de râs” cu diagnosticul „interfață wl0 nu găsită«. Ca urmare a „haosului paralel”, hostapd s-a pornit mai repede decât nucleul a găsit adaptorul wireless.
Pe internet există multe soluții: de la un timeout forțat înainte de startul demonului (de câteva minute), până la un alt demon care monitorizează apariția interfeței și (re)pornește hostapd. Soluțiile sunt funcționale, dar foarte inestetice. Îl chemăm în ajutor pe marele systemd cu „obiectivele” și „scopurile” sale „dependențe”.
Copiem fișierul de service distribuit în /etc/systemd/system/hostapd.service:
# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system
și îl ajustăm astfel încât să arate ca mai jos:
[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 service actualizat constă în legătura dinamică a hostapd la noua țintă — interfața wl0. Când interfața apare — demonul se pornește, când dispare — se oprește. Și toate acestea în online — fără a reporni sistemul. Această tehnică va fi deosebit de utilă când se conectează un adaptor USB Wi-Fi la „Raspberry Pi”.
Acum putem:
# systemctl enable hostapd
# reboot
7. IPTABLES
„Ce???" © Da-da! Niciun systemd. Niciun fel de combinații moderne (precum firewalld), care în final fac același lucru.
Folosim vechiul bun iptables, serviciul său după pornire va încărca regulile de rețea în nucleu și va încheia activitatea, fără a rămâne rezident și fără a consuma resurse. Systemd are un elegant IPMasquerade=, dar vom lăsa traducerea adreselor (NAT) și firewall-ul pe seama iptables.
Instalăm:
# yum install iptables-services
# systemctl enable iptables ip6tables
Prefer să păstrez configurația iptables sub formă de 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 Pi”. Totul este corect, am creat un router Wi-Fi, la care accesul „prin internet” este implicit interzis — acum doar „prin aer”. Conectăm cablul de la provider în Ethernet și începem să navigăm!
8. Bonus: +2,4GHz
Când am asamblat primul meu router Raspberry conform schiței descrise mai sus, am descoperit că aveam în gospodărie câteva gadgeturi care, din cauza constrângerilor de design, nu puteau detecta deloc "zmeura" prin Wi-Fi. A schimba routerul să funcționeze pe 802.11b/g/n nu ar fi fost sportiv, deoarece viteza maximă "prin aer" în acest caz nu depășea 40 Mbps, iar furnizorul meu preferat de internet îmi oferă 100 (pe cablu).
De fapt, soluția la problemă fusese deja găsită: o a doua interfață Wi-Fi care operează pe frecvența de 2,4GHz și un al doilea punct de acces. De la cel mai apropiat magazin, am achiziționat nu primul, ci al doilea USB Wi-Fi "dongle" care mi-a ieșit în cale. Vânzătorul a fost supus unei avalanșe de întrebări despre chipset, compatibilitatea cu nuclee ARM Linux și posibilitatea de a funcționa în modul AP (el a început prima).
Configurăm „dongle”-ul prin analogie cu adaptorul Wi-Fi încorporat.
Mai întâi — î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 noului Wi-Fi unui demon separat hostapd, care se va porni și opri în funcție de existența în sistem a „dongle”-ului strict definit: wl1.
Fișierul 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ă un simplu copy/paste te-ar putea duce în eroare.
Copiem fișierul de service distribuit în /etc/systemd/system/hostapd2.service:
# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system/hostapd2.service
și îl ajustăm astfel încât să arate ca mai jos:
[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
Rămâne să activăm noul instanț al hostapd:
# systemctl enable hostapd2
Asta e tot! Trageti de „dongle” și de „zmeură” și priviți rețelele wireless din jur.
Și, în cele din urmă, vreau să atrag atenția asupra calității adaptorului USB Wi-Fi și a alimentării Raspberry. Conectarea „dongle”-ului în timpul funcționării poate cauza uneori „înghețarea zmeurii” din cauza problemelor electrice temporare.
Sursa: habr.com
