Raspberry Pi + CentOS = Wi-Fi Hotspot (ili malina router u crvenoj kapi)

Na internetu postoji ogroman broj informacija o postavljanju Wi-Fi pristupnih točaka na bazi jednoplatnog računala Raspberry. Obično se koristi izvorni operativni sustav za 'malinku' — Raspbian.

Kao obožavatelj RPM-baziranih sustava, nisam mogao proći pored ovog malog čuda i ne isprobati moju omiljenu CentOS na njemu.

U članku je predstavljena uputa za izradu 5GHz/AC Wi-Fi usmjerivača iz Raspberry Pi 3 Model B+ na bazi operativnog sustava CentOS. Bit će nekoliko standardnih, ali malo poznatih trikova, a kao bonus — dijagram spajanja dodatne Wi-Fi opreme na 'malinku' koja joj omogućuje rad u nekoliko režima istovremeno (2,4+5GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (ili malina router u crvenoj kapi)
(miks slika iz slobodnog pristupa)

Odmah napominjem da neće biti nekih svemirskih brzina. Iscijedim iz svoje 'malinke' maksimalno 100 Mbps bežično, što pokriva brzinu mog internet provajdera. Kakva je svrha takvog slabog AC-a, kada se teorijski na N može dobiti pola gigabita? Ako ste se zapitali ovo, idite do trgovine po pravi usmjerivač s osam vanjskih antena.

0. Što će vam trebati

  • Samo 'malinovo' izdanje: Pi 3 Model B+ (za postizanje poželjnih 5GHz brzina i kanala);
  • Kvalitetna microSD >= 4GB;
  • Radna stanica s Linuxom i čitačem/pisačem microSD;
  • Potrebne su određene vještine u Linuxu, članak je namijenjen pripremljenim geekovima;
  • Žičana mreža (eth0) između Raspberry i Linuxa, radni DHCP-poslužitelj u lokalnoj mreži i pristup internetu s oba uređaja.

Mali komentar na posljednju točku. 'Što je bilo prvo, jaje ili...' kako napraviti Wi-Fi usmjerivač bez bilo kakve opreme za pristup internetu? Ostavimo ovo zanimljivo vježbanje izvan okvira članka i jednostavno pretpostavimo da je Raspberry spojena na lokalnu mrežu žicom i ima internet izlaz. U tom slučaju ne trebamo dodatni televizor i uređaj za upravljanje za postavljanje 'malinke'.

1. Instalacija CentOS

Početna stranica projekta

U trenutku pisanja ovog članka, radna verzija CentOS na uređaju je 32-bitna. Negdje na prostranstvima svjetske mreže naišao sam na mišljenja o smanjenju performansi tih OS-a na 64-bitnoj ARM arhitekturi za čak 20%. Ostavit ću ovaj trenutak bez komentara.

Na Linuxu preuzimamo minimalnu sliku s kernelom '-RaspberryPI-» i zapisujemo ga na microSD:

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

Prije nego što počnemo koristiti sliku, uklonit ćemo particiju SWAP, proširiti root na cijeli dostupni prostor i riješiti se SELinuxa. Algoritam je jednostavan: pravimo kopiju root-a na Linux-u, brišemo sve particije osim prve (\/boot) s microSD-a, kreiramo novi root i vraćamo njegov sadržaj iz kopije.

Primjer potrebnih radnji (grubi konzolni ispis)

# 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

Nakon raspakiranja sadržaja root particije, pravo je vrijeme da unesemo neke promjene.

Isključujemo SELinux u /mnt/etc/selinux/config:

SELINUX=disabled

Uređujemo /mnt/etc/fstab, ostavljajući u njemu samo dva unosa o particijama: podizna (\/boot, bez promjena) i root (mijenjamo vrijednost UUID, koju možemo dobiti proučavajući ispis komande blkid na Linux-u):

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

Na kraju, mijenjamo postavke učitavanja jezgre: navodimo novu lokaciju root particije, isključujemo ispis za debagiranje i (opciono) zabranjujemo jezgri da dodjeljuje IPv6 adrese na mrežnim sučeljima:

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

Dovodimo sadržaj /mnt/cmdline.txt u sljedeći oblik (jedna linija bez prelama):

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

Gotovo:

# cd
# umount /mnt
# sync

Premještamo microSD u "malinku", pokrećemo i dobivamo mrežni pristup preko ssh (root\/centos).

2. Podešavanje CentOS-a

Prve tri nepromjenjive radnje: passwd, yum -y update, restart.

Upravljanje mrežom prepuštamo networkd:

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

Kreiramo datoteku (zajedno s direktorijima) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Ponovno pokrećemo "malinku" i ponovno dobivamo mrežni pristup preko ssh (IP adresa se može promijeniti). Imajte na umu da se koristi /etc/resolv.conf, koji je ranije kreirao Network Manager. Stoga, u slučaju problema s razrješavanjem, uredite njen sadržaj. Nećemo koristiti systemd-resolved mi nećemo.

Brišemo "suvišno", popravljamo i ubrzavamo učitavanje OS-a:

# 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

Kome treba cron i tko ne podnosi ugrađene timer-e systemd, može instalirati ono što nedostaje. /var/log- i gledamo preko journalctl. Ako je potrebna povijest dnevnika (po defaultu se čuvaju informacije samo od trenutka pokretanja sustava):

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

Isključujemo korištenje IPv6 od glavnih usluga (ako je potrebno)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Točnost vremena na "malinki" - važna je stvar. Budući da "iz kutije" nema hardverskih mogućnosti za očuvanje trenutnog stanja sata prilikom ponovnog pokretanja, potrebna je sinkronizacija. Jako dobar i brz demon za to - chrony — već je instaliran i automatski se pokreće. Možete promijeniti NTP servere na najbliže.

/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

Za postavljanje vremenske zone koristit ćemo trik. Budući da je naš cilj izraditi Wi-Fi usmjerivač koji radi na 5GHz frekvencijama, unaprijed se pripremamo za iznenađenja regulatora:

# yum info crda
Sažetak: Upravitelj usklađenosti s propisima za 802.11 bežičnu mrežu

Ova zla konstrukcija, oslanjajući se između ostalog na vremenske zone, "zabranjuje" korištenje (u Rusiji) 5GHz frekvencija i kanala s "velikim" brojevima. Trik consiste u postavljanju vremenske zone bez korištenja naziva kontinenata/gradova, to jest umjesto:

# timedatectl set-timezone Europe/Moscow

Utisnuvši:

# timedatectl set-timezone Etc/GMT-3

I završni dodiri u frizuri sustava:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Korisničko specifično okruženje i programi pri pokretanju

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

3. Dodaci CentOS-u

Sve što je rečeno gore može se smatrati konačnom uputom za instalaciju "vanilnog" CentOS-a na Raspberry Pi. Trebali biste dobiti računalo koje se (re)pokreće za manje od 10 sekundi, koristi manje od 15 megabajta RAM-a i 1,5 gigabajta microSD (zapravo manje od 1 gigabajta zbog nepotpunog /boot, ali budimo iskreni do kraja).

Za instalaciju softvera Wi-Fi pristupne točke na ovaj sustav bit će potrebno malo proširiti mogućnosti standardnog CentOS distribucijskog sustava. Prvo ćemo "napumpati" upravljački program (firmware) ugrađenog Wi-Fi adaptera. Na početnoj stranici projekta piše:

Wifi na Raspberry 3B i 3B+

Datoteke firmware-a za Raspberry PI 3B/3B+ ne smiju se distribuirati od strane CentOS projekta. Možete koristiti sljedeće članke kako biste razumjeli problem, dobili firmware i postavili wifi.

Što nije dopušteno projektu CentOS, to nije zabranjeno nama za osobnu upotrebu. Zamjenjujemo distribucijski Wi-Fi firmware u CentOS-u s odgovarajućim od Broadcom developera (oni isti omraženi binarni blobovi…). To će, između ostalog, omogućiti korištenje AC u načinu rada pristupne točke.

Nadogradnja Wi-Fi firmware-aUtvrđujemo model uređaja i trenutnu verziju firmware-a:

# 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 

Vidimo da je firmware verzije 7.45.18 od 01.03.2015, i zapamtimo sljedeći skup brojeva: 43455 (brcmfmac43455-sdio.bin).

Preuzimamo aktualni obraz Raspbian. Lijenčići mogu zapisati sliku na microSD i odatle uzeti datoteke s firmware-om. A moguće je montirati korijenski razdjelnik slike u Linux-u i kopirati potrebno odatle:

# 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

Dobivene datoteke firmware-a za Wi-Fi adapter treba kopirati s zamjenom na "malinku" u katalog /usr/lib/firmware/brcm/

Ponovno pokrećemo budući usmjerivač i zadovoljno se smiješimo:

# 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 

Verzija: 7.45.154 od 27.02.2018.

Naravno, 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. Mrežna konfiguracija i predstojeće poteškoće

Kao što smo se dogovorili ranije, „malinka“ je povezana „žicom“ s lokalnom mrežom. Pretpostavimo da i davatelj usluga pruža pristup internetu na isti način: adresa u javnoj mreži dodjeljuje se dinamički DHCP poslužiteljem (možda s vezom na MAC). U tom slučaju, nakon konačne konfiguracije „malinke“, dovoljno je „uključiti“ kabel od davatelja usluga i to je to. Autentifikacija putem systemd-networkd – tema je to za poseban članak i ovdje se ne razmatra.

Wi-Fi sučelje(i) na Raspberryju predstavljaju lokalnu mrežu, dok ugrađeni Ethernet adapter (eth0) predstavlja vanjsku. Lokalnu mrežu numeriramo statički, na primjer: 192.168.0.0/24. Adresa „malinke“: 192.168.0.1. U vanjskog mreži (Internet) će raditi DHCP poslužitelj.

Problem dosljednosti imenovanja i poznati gvajtefitski programer – dvije neugodnosti koje vrebaju svakoga tko se bavi konfiguracijom mrežnih sučelja i usluga u systemd distribucijama.

Paralelni kaos (lirska digresija)Lennart Pottering sastavio je svoj program systemd vrlo dobro. Ova systemd pokreće druge programe tako brzo da oni, ne uspijevajući se oporaviti od sudijskog zvižduka, posrću i padaju na startu, čak ni ne započinjući svoj bježasti s preprekama.

No, ozbiljno, agresivno paralelno pokretanje procesa prilikom pokretanja systemd OS-a predstavlja neki „magarčev most“ za iskusne sequential LSB-ovce. Srećom, dovođenje ovog „paralelnog kaosa“ u red ispostavlja se jednostavnim, iako ne uvijek očitim poslom.

Stvaramo dva virtualna mostna sučelja (bridge) s trajnim imenima: lan i wan. Prvom ćemo „priključiti“ Wi-Fi adapter(e), drugom – eth0 „malinke“.

/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 oslobađa nas od potrebe da putem sysctl sugeriramo jezgru o uključivanju rutiranja.
MACAddress= dekomentiramo i promijenimo ako je potrebno.

Prvo „priključujemo“ eth0. Pamtimo o „problematičnoj dosljednosti“ i koristimo samo MAC adresu ovog sučelja, koju možemo saznati, na primjer, ovako:

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

Kreiramo /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Brišemo prethodni konfiguracijski fajl eth0, restartamo „malinku“ i dobivamo mrežni pristup (IP adresa će se vjerojatno promijeniti):

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

5. DNSMASQ

Nema boljih rješenja za izradu Wi-Fi pristupnih točaka nego slatki par od dnsmasq + hostapd još nisu izmislili. Po mom mišljenju.

Ako se netko zaboravio, to…hostapd — je alat koji upravlja Wi-Fi adapterima (konkretno, preuzima odgovornost za njihovo povezivanje s virtualnim lan „malinkom“), autorizira i registrira bežične klijente.

dnsmasq — postavlja mrežni sloj klijenata: dodjeljuje IP adrese, DNS poslužitelje, zadani pristupnik i slične blagodati.

Počinjemo s dnsmasq:

# yum install dnsmasq

Predložak /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

uređujemo ga po svom ukusu.

Minimalistički /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

„Magija“ ovdje leži u parametru bind-dynamic, koji nudi demonu dnsmasq da čekate na pojavu u sustavu interface=lan, a ne da pada u nesvijest od ponosa usamljenosti nakon pokretanja.

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

6. HOSTAPD

I konačno, čarobne konfiguracije hostapd. Ne sumnjam da netko čita ovaj članak tražeći upravo ove dragocjene retke.

Prije instalacije hostapd moramo se boriti s „problemom dosljednosti“. Ugrađeni Wi-Fi adapter wlan0 lako može promijeniti ime u wlan1 prilikom povezivanja dodatnog USB Wi-Fi uređaja. Stoga ćemo fiksirati imena sučelja na sljedeći način: smislit ćemo (bežične) adattatore jedinstvene nazive i povezati ih s MAC adresama.

Za ugrađeni Wi-Fi adapter, koji još uvijek je wlan0:

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

Kreiramo /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Sada ćemo biti sigurni da je wl0 — to ugrađeni Wi-Fi. Restartamo „malinku“, kako bismo se uvjerili.

Instaliramo:

# yum install hostapd wireless-tools

Konfiguracijski fajl /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

Ne zaboravljajući ni na trenutak GKČP, mijenjamo potrebne parametre i ručno provjeravamo njihovu funkcionalnost:

# hostapd /etc/hostapd/hostapd.conf

hostapd će se pokrenuti u interaktivnom režimu, prikazujući svoje stanje na konzoli. Ako ne bude grešaka, klijenti koji podržavaju AC mod će se moći povezati na pristupnu tačku. Za zaustavljanje hostapd-a — Ctrl-C.

Preostaje da se hostapd uključi u automatsko pokretanje sistema. Ako se postupi standardno (systemctl enable hostapd), nakon sledećeg ponovnog pokretanja možemo dobiti „demon koji leži u krvi“ s dijagnozom „interfejs wl0 nije pronađen“. Kao rezultat „paralelnog haosa“ hostapd se pokrenuo brže nego što je kernel pronašao bežični adapter.

Na internetu ima mnogo rešenja: od prisilnog tajmauta pre pokretanja demona (nekoliko minuta), do još jednog demona koji prati pojavu interfejsa i (ponovo) pokreće hostapd. Rešenja su sasvim funkcionalna, ali užasno ružna. Pomoć pozivamo velikog systemd sa svojim „ciljevima“ i „zadacima“ „zavisnostima“.

Kopiramo distribucijski service-fajl u /etc/systemd/system/hostapd.service:

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

i prilagođavamo njegov sadržaj do sledeće forme:

[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

Magija ažuriranog servisnog fajla leži u dinamičkom vezivanju hostapd-a za novu metu — interfejs wl0. Kada se interfejs pojavi — demon se pokreće, a kada nestane — zaustavlja se. I to sve u onlajn režimu — bez ponovnog pokretanja sistema. Ova tehnika će biti posebno korisna prilikom povezivanja USB Wi-Fi adaptera na „malinku“.

Sada možemo:

# systemctl enable hostapd
# reboot

7. IPTABLES

„Šta???“ © Da-da! Ništa systemd. Nema novih modernih kombinacija (u vidu firewalld), koje na kraju rade isto.

Koristimo stari dobri iptables, čija će služba nakon pokretanja učitati mrežna pravila u kernel i mirno završiti svoj rad, ne ostajući rezidencijalno i ne trošeći resurse. U systemd postoji elegantan IPMasquerade=, ali ćemo ipak prevođenje adresa (NAT) i vatrozid poveriti iptables-u.

Instaliramo:

# yum install iptables-services
# systemctl enable iptables ip6tables

Konfiguraciju iptables-a volim da čuvam u obliku skripte (primer):

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

Izvršavamo gorenavedenu skriptu i gubimo mogućnost postavljanja novih žičanih ssh veza sa „malinkom“. Sve je u redu, napravili smo Wi-Fi ruter, pristup kojem je „preko interneta“ po defaultu zabranjen — sada samo „preko vazduha“. Povezujemo kabl provajdera u Ethernet i počinjemo surfovanje!

8. Bonus: +2,4GHz

Kada sam prema opisanoj shemi sastavio prvi Raspberry router, otkrio sam da imam određeni broj uređaja koji zbog svojih konstruktivnih ograničenja nisu mogli vidjeti 'malinu' putem Wi-Fi-ja. Ponovno postavljanje routera da radi na 802.11b/g/n bilo bi nepošteno, jer maksimalna brzina 'u zraku' u tom slučaju ne bi prelazila 40 Mbit, a moj omiljeni davatelj internetskih usluga nudi mi 100 (putem kabla).

Zapravo, rješenje problema već je osmišljeno: drugi Wi-Fi sučelje koje radi na frekvenciji od 2,4 GHz, i druga pristupna točka. U najbližoj trgovini kupio sam ne prvi, već drugi USB Wi-Fi 'dongle' koji mi je došao na pamet. Prodavač je bio preplavljen pitanjima o čipsetu, kompatibilnosti s ARM jezgrama Linuxa i mogućnosti rada u AP režimu (on je prvi započeo).

Konfiguriramo 'dongle' prema ugledu na ugrađeni Wi-Fi adapter.

Najprije - preimenujmo ga u 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

Upravljat ćemo novim Wi-Fi sučeljem putem posebnog demona hostapd, koji će se pokretati i zaustavljati ovisno o prisutnosti u sustavu strogo određenog 'dongla': wl1.

Konfiguracijski fajl /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]

Sadržaj ove datoteke izravno ovisi o modelu USB Wi-Fi adaptera, pa vam banalan copy/paste može zavarati.

Kopiramo distribucijski service-fajl u /etc/systemd/system/hostapd2.service:

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

i prilagođavamo njegov sadržaj do sledeće forme:

[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

Ostalo je uključiti novu instancu hostapd:

# systemctl enable hostapd2

To je to! Povući 'dongle' i samu 'malinu', pogledajte bežične mreže oko vas.

Na kraju, želim upozoriti na kvalitetu USB Wi-Fi adaptera i napajanja Raspberryja. Spojeni 'dongle' povremeno može izazvati 'zamrzavanje maline' zbog kratkoročnih električnih problema.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster