Raspberry Pi + CentOS = Wi-Fi Hotspot (nebo maliny router v červeném klobouku)

Na internetu je obrovské množství informací o vytváření Wi-Fi hotspotů na bázi jednodeskového počítače Raspberry. Obvykle se předpokládá použití natívního operačního systému pro "malinku" — Raspbian.

Jako zastánce systémů založených na RPM jsem nemohl projít kolem tohoto malého zázraku a nevyzkoušet na něm svůj oblíbený CentOS.

V článku je uveden návod na výrobu 5GHz/AC Wi-Fi routeru z Raspberry Pi 3 Model B+ na bázi operačního systému CentOS. Bude tam několik standardních, ale málo známých triků a jako bonus — schéma připojení dodatečného Wi-Fi zařízení k "malince", které jí umožňuje zároveň pracovat v několika režimech (2,4+5GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (nebo maliny router v červeném klobouku)
(mix obrázků z volného přístupu)

Hned je třeba poznamenat, že nějakých kosmických rychlostí se nedočkáte. Z mé "malinky" dostávám vzduchem maximálně 100 Mbit a to pokrývá rychlost mého poskytovatele internetu. Proč potřebovat tak pomalé AC, když i na N teoreticky můžete dosáhnout půl gigabitu? Pokud jste se na tuto otázku ptali, vydejte se do obchodu pro skutečný router s osmi externími anténami.

0. Co budete potřebovat

  • Vlastně samotné "malinové zařízení" kalibru: Pi 3 Model B+ (k dosažení vytoužených 5GHz rychlostí a kanálů);
  • Kvalitní microSD >= 4GB;
  • Pracovní stanice s Linuxem a čtečkou/zapisovačem microSD;
  • Dostatečné dovednosti v Linuxu, článek — pro připraveného Gika;
  • Drátové síťové (eth0) propojení mezi Raspberry a Linuxem, funkční DHCP server v místní síti a přístup k internetu z obou zařízení.

Malý komentář k poslednímu bodu. "Co se objevilo dřív, vejce nebo…" jak udělat Wi-Fi router při absenci jakéhokoli přístupového zařízení k internetu? Necháme to jako zajímavé cvičení za rámec článku a jednoduše předpokládejme, že Raspberry je připojena k místní síti kabelem a má připojení k internetu. V tomto případě nebudeme potřebovat další televizor a ovladač pro nastavení "malinky".

1. Instalace CentOS

Domovská stránka projektu

Ke dni napsání tohoto článku je funkční verze CentOS na zařízení — 32-bitová. Kdesi na nekonečných zářitkách internetu jsem narazil na názory o snížení výkonu takových operačních systémů na 64-bitové architektuře ARM až o 20%. Tento moment ponechám bez komentáře.

Na Linuxu stáhneme minimální obraz s jádrem "-RaspberryPI-» a zapisujeme na microSD:

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

Před začátkem použití obrazu odstraníme z něj oddíl SWAP, rozšíříme kořen na celý dostupný objem a zbavíme se SELinuxu. Algoritmus je jednoduchý: vytvoříme kopii kořene na Linuxu, odstraníme z microSD všechny oddíly kromě prvního (\/boot), vytvoříme nový kořenový a vrátíme jeho obsah z kopie.

Příklad potřebných akcí (syrový konzolový výstup)

# 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

Po rozbalení obsahu kořenového oddílu je nejvyšší čas provést v něm některé úpravy.

Vypínáme SELinux v /mnt/etc/selinux/config:

SELINUX=disabled

Upravujeme /mnt/etc/fstab, přičemž v něm ponecháváme pouze dvě záznamy o oddílech: zaváděcí (\/boot, bez změn) a kořenový (změníme hodnotu UUID, kterou lze zjistit analýzou výstupu příkazu blkid na Linuxu):

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

Nakonec změníme parametry načítání jádra: uvedeme nové umístění kořenového oddílu, zakážeme zobrazení ladicích informací a (volitelně) zabráníme jádru přiřazovat adresy IPv6 síťovým rozhraním:

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

Přivedeme obsah /mnt/cmdline.txt do následující podoby (jedna řádka bez zalomení):

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

Hotovo:

# cd
# umount /mnt
# sync

Přesuneme microSD do "malinky", spustíme a získáme k ní síťový přístup přes ssh (root\/centos).

2. Nastavení CentOS

První tři nezměnitelné pohyby: passwd, yum -y update, reboot.

Správu sítě přenecháme networkd:

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

Vytvoříme soubor (spolu s adresáři) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Restartujeme "malinku" a znovu získáme k ní síťový přístup přes ssh (IP adresa se může změnit). Všimněte si, že použijeme /etc/resolv.conf, který byl vytvořen dříve Network Managerem. Proto, v případě problémů s rozlišením, upravte jeho obsah. Používat systemd-resolved nebudeme.

Odstraníme "přebytečné", opravíme a zrychlíme načítání OS:

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

Kdo potřebuje cron. a kdo nestrávil vestavěné časovače systemd, mohou nainstalovat chybějící. /var/log-a podíváme se přes journalctl. Pokud bude potřeba historie protokolu (podle defaultu se uchovávají informace pouze od spuštění systému):

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

Vypínáme používání IPv6 hlavními službami (pokud je to potřeba)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Aktualita času na "malince" — důležitá věc. Jelikož "z krabice" chybí hardwarová schopnost uchovávat aktuální stav hodin při restartu, je potřeba synchronizace. Velmi dobrý a rychlý démon pro to — chrony — již byla nainstalována a spouští se automaticky. NTP servery lze změnit na nejbližší.

/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

Pro nastavení časového pásma použijeme trik. Protože naším cílem je vytvoření Wi-Fi routeru, který pracuje na frekvencích 5GHz, připravíme se na překvapení regulátora:

# yum info crda
Shrnutí: Daemon pro dodržování předpisů pro bezdrátové sítě 802.11

Tento zlovolný konstrukce, přičemž bereme v úvahu i časové pásmo, "zakazuje" používání (v Rusku) frekvencí 5GHz a kanálů s "vyššími" čísly. Trik spočívá v nastavení časové zóny bez použití názvů kontinentů/měst, tedy místo:

# timedatectl set-timezone Europe/Moscow

Tlačíme:

# timedatectl set-timezone Etc/GMT-3

A finální úpravy ve vzhledu systému:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Uživatelské specifické prostředí a spouštěcí programy

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

3. Doplňky CentOS

Vše, co bylo řečeno výše, lze považovat za dokončený návod k instalaci "vanilkového" CentOS na Raspberry Pi. Měli byste mít PC, které (pře)startuje za méně než 10 sekund, používá méně než 15 megabajtů operační paměti a 1,5 gigabajtu microSD (ve skutečnosti méně než 1 gigabajt kvůli neúplnému /boot, ale budeme upřímní do konce).

Pro instalaci softwaru pro Wi-Fi přístupový bod na tento systém bude třeba mírně rozšířit možnosti standardní distribuce CentOS. Především "vylepšíme" ovladač (firmware) integrovaného Wi-Fi adaptéru. Na domovské stránce projektu se uvádí:

Wifi na Raspberry 3B a 3B+

Souborové firmware pro Raspberry PI 3B/3B+ nelze distribuovat projektem CentOS. Můžete použít následující články, abyste pochopili problém, získali firmware a nastavili wifi.

Co není projektu CentOS zakázáno, není zakázáno nám pro osobní použití. Nahrazujeme distribučně Wi-Fi firmware v CentOS odpovídajícím od vývojářů Broadcom (ty samé nenáviděné binární blob). To v důsledku umožní používat AC v režimu přístupového bodu.

Upgrade Wi-Fi firmwareZjistíme model zařízení a aktuální verzi 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 

Vidíme, že firmware verze 7.45.18 z 01.03.2015, a zapamatujeme si následující sadu číslic: 43455 (brcmfmac43455-sdio.bin).

Stáhněte aktuální obraz Raspbian. Leniví mohou zapsat obraz na microSD a odtud vzít soubory s firmwarem. Nebo lze připojit kořenový oddíl obrazu v Linuxu a zkopírovat potřebné odsud:

# 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

Získané soubory firmware Wi-Fi adaptéru je třeba zkopírovat s přepsáním na "malinu" do katalogu /usr/lib/firmware/brcm/

Restartujeme budoucí router a usmíváme se:

# 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 

Verze: 7.45.154 ze dne 27.02.2018.

A samozřejmě 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. Síťová konfigurace a nadcházející obtíže

Jak jsme se dohodli výše, "malina" je připojena "kabelem" k lokální síti. Předpokládejme, že poskytovatel také poskytuje přístup k Internetu stejným způsobem: adresa v veřejné síti je přidělena dynamicky DHCP serverem (může být vázána na MAC). V tomto případě, po konečné konfiguraci "maliny", stačí "zasunout" do ní kabel od poskytovatele a vše je připraveno. Autentizace pomocí systemd-networkd — je samostatné téma a zde není diskutována.

Wi-Fi rozhraní(u) u Raspberry — to je lokální síť, a vestavěný Ethernet adaptér (eth0) — externí. Lokální síť číslujeme staticky, například: 192.168.0.0/24. Adresa "maliny": 192.168.0.1. V externí síti (Internet) bude fungovat DHCP server.

Problém jednotnosti pojmenování a známý guatemalský programátor — dvě nepříjemnosti, které čekají na každého, kdo se zabývá konfigurací síťových rozhraní a služeb v systemd-distroch.

Paralelní chaos (lyrický odbočení)Lennart Poettering napsal svůj program systemd velmi dobře. Ten systemd spouští jiné programy tak rychle, že ty, aniž by se stihly vzpamatovat od soudcovského hvizdu, zakopávají a padají na startu, aniž by začaly svůj běh s překážkami.

Ale vážně, agresivní paralelizace spouštěných procesů při startu systemd-OS je jakýmsi "oslí mostíkem" pro zkušené sekvenční LSBčkaře. Naštěstí je uvedení tohoto "paralelního chaosu" do pořádku jednoduchá záležitost, byť ne vždy evidentní.

Vytváříme dva virtuální mostní rozhraní (bridge) s trvalými názvy: lan a wan. K prvnímu "připojíme" Wi-Fi adaptér(y), k druhému — eth0 "maliny".

/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 zbavuje potřebě pomocí sysctl naznačovat jádru, aby povolilo směrování.
MACAddress= odkomentujeme a případně změníme.

Nejprve "připojíme" eth0. Pamatujeme na "problém jednotnosti" a používáme pouze MAC adresu tohoto rozhraní, kterou můžeme zjistit například takto:

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

Vytváříme /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Odstraníme předchozí konfigurační soubor eth0, restartujeme 'malinku' a získáme k ní síťový přístup (IP adresa se pravděpodobně změní):

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

5. DNSMASQ

K výrobě přístupových bodů Wi-Fi nic lepšího než sladká dvojice z dnsmasq + hostapd ještě nevymysleli. Podle mého názoru.

Pokud si někdo zapomněl, tak…hostapd — to je věc, která řídí Wi-Fi adaptéry (zejména se postará o jejich připojení k virtuální lan ‘malince’), autorizuje a registruje bezdrátové klienty.

dnsmasq — nastavuje síťový stack klientů: přiděluje IP adresy, DNS servery, výchozí bránu a podobné radosti.

Začínáme s dnsmasq:

# yum install dnsmasq

Šablona /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

upravíme ho podle svých představ.

Minimalistický /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

‘Magie’ zde spočívá v parametru bind-dynamic, který ukazuje démonu dnsmasq, aby čekal na zobrazení v systému interface=lan, a neomdlel z úzkosti osamělosti po spuštění.

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

6. HOSTAPD

A nakonec, kouzelné konfigurace hostapd. Neváhám, že někdo čte tento článek ve snaze nalézt právě tyto tajné řádky.

Před instalací hostapd je třeba se vypořádat s 'problémem uniformity'. Vestavěný Wi-Fi adaptér wlan0 může snadno změnit své jméno na wlan1 při připojení dalšího USB Wi-Fi zařízení. Proto upevníme názvy rozhraní následujícím způsobem: vymyslíme (bezdrátovým) adaptérům jedinečné názvy a přiřadíme je k MAC adresám.

Pro vestavěný Wi-Fi adaptér, který je zatím wlan0:

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

Vytváříme /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Teď budeme mít jistotu, že wl0 — to je vestavěný Wi-Fi. Restartujeme 'malinku', abychom se o tom přesvědčili.

Nainstalujeme:

# yum install hostapd wireless-tools

Konfigurační soubor /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

Ani na chvíli nezapomínáme na GKČP, měníme potřebné parametry a ručně ověřujeme funkčnost:

# hostapd /etc/hostapd/hostapd.conf

hostapd se spustí v interaktivním režimu a zobrazuje svůj stav na konzoli. Pokud nebudou žádné chyby, mohou se ke spolupracujícím klientům v AC režimu připojit. Pro zastavení hostapd stiskněte Ctrl-C.

Je třeba přidat hostapd do automatického spouštění systému. Pokud se postupuje standardně (systemctl enable hostapd), po dalším restartu může dojít k tomu, že démon bude "ležet v krvi" s diagnózou "rozhraní wl0 nenalezeno". V důsledku "paralelního chaosu" se hostapd spustil rychleji, než jádro našlo bezdrátový adaptér.

Na internetu je spousta řešení: od donucujícího timeoutu před spuštěním démona (několik minut), až po dalšího démona, který monitoruje objevování rozhraní a (znovu) spouští hostapd. Řešení jsou funkční, ale strašně nevzhledná. Přivoláváme pomoc velkého systemd se svými "cíli" a "úkoly" a "závislostmi".

Kopírujeme distribuční service soubor do /etc/systemd/system/hostapd.service:

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

a přizpůsobujeme jeho obsah následujícímu tvaru:

[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

Kouzlo vylepšeného service souboru spočívá v dynamickém propojení hostapd s novým cílem — rozhraním wl0. Když se rozhraní objeví, démon se spustí, když zmizí — zastaví se. A to vše online — bez restartu systému. Tato technika bude zvlášť užitečná při připojení USB Wi-Fi adaptéru k „malině“.

Teď už můžeme:

# systemctl enable hostapd
# reboot

7. IPTABLES

„Co???“ © Ano, ano! Žádné systemd. Žádné novátorské kombajny (ve formě firewalld), které nakonec dělají to samé.

Používáme starého dobrého iptables, jehož služby po svém spuštění načtou do jádra síťové pravidla a v klidu dokončí práci, aniž by zůstávaly v paměti a spotřebovávaly zdroje. systemd má elegantní IPMasquerade=, ale překlad adres (NAT) a firewall přenecháme raději iptables.

Nainstalujeme:

# yum install iptables-services
# systemctl enable iptables ip6tables

Konfiguraci iptables preferuji uchovávat ve formě skriptu (příklad):

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

Provedeme výše uvedený skript a ztrácíme možnost vytvářet nová kabelová ssh spojení s „malinou“. Všechno je správně, vytvořili jsme Wi-Fi router, přístup k němu "přes internet" je ve výchozím nastavení zakázán — nyní pouze "vzduchem". Připojíme kabel od poskytovatele do Ethernetu a začínáme surfovat!

8. Bonus: +2,4GHz

Když jsem podle výše uvedeného návodu sestavil první Raspberry router, zjistil jsem, že mám několik zařízení, která kvůli svým konstrukčním omezením nemohou zaznamenat „malinu“ vůbec. Přeconfigurovat router na práci v 802.11b/g/n by bylo nefér, protože maximální rychlost „po vzduchu“ v takovém případě nepřesahovala 40 Mb/s, zatímco můj oblíbený internetový poskytovatel mi nabízí 100 (po kabelu).

Ve skutečnosti už bylo nalezeno řešení problému: druhé Wi-Fi rozhraní pracující na frekvenci 2,4GHz a druhý přístupový bod. V nejbližším obchodu jsem zakoupil ne první, ale druhý USB Wi-Fi „stick“, který mi přišel do ruky. Prodavač byl zaneprázdněn mými otázkami ohledně čipové sady, kompatibility s ARM jádry Linuxu a možnosti práce v režimu AP (on to začal jako první).

Konfigurujeme „stick“ analogicky s vestavěným Wi-Fi adaptérem.

Nejprve jej přejmenujeme na 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

Ovládání nového Wi-Fi rozhraní svěřujeme samostatnému démonu hostapd, který se bude spouštět a zastavovat v závislosti na existenci specifického „sticku“ v systému: wl1.

Konfigurační soubor /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]

Obsah tohoto souboru přímo závisí na modelu USB Wi-Fi adaptéru, takže banální copy/paste vás může zklamat.

Kopírujeme distribuční service soubor do /etc/systemd/system/hostapd2.service:

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

a přizpůsobujeme jeho obsah následujícímu tvaru:

[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

Zbývá zapnout novou instanci hostapd:

# systemctl enable hostapd2

A to je vše! Zatáhněte za „stick“ a samotnou „malinu“, podívejte se na bezdrátové sítě kolem.

Nakonec bych chtěl varovat před kvalitou USB Wi-Fi adaptéru a napájení Raspberry. Připojený „na žhavou“ stick může občas způsobit „zamrznutí maliny“ kvůli krátkodobým elektrickým problémům.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster