Raspberry Pi + CentOS = Hotspot Wi-Fi (lub router malinowy z czerwoną czapką)

W Internecie można znaleźć ogromną ilość informacji na temat tworzenia punktów dostępowych Wi-Fi w oparciu o jednopłytkowy komputer Raspberry. Z reguły oznacza to korzystanie z systemu operacyjnego Raspbian natywnego dla Raspberry.

Będąc zwolennikiem systemów opartych na RPM, nie mogłem przejść obojętnie obok tego małego cudu i nie wypróbować na nim mojego ukochanego CentOS-u.

W artykule zamieszczono instrukcję wykonania routera Wi-Fi 5GHz/AC z Raspberry Pi 3 Model B+ opartego na systemie operacyjnym CentOS. Będzie kilka standardowych, choć mało znanych trików, a w bonusie - rysunek umożliwiający podłączenie do Raspberry dodatkowego sprzętu Wi-Fi, pozwalającego na jednoczesną pracę w kilku trybach (2,4+5GHz).

Raspberry Pi + CentOS = Hotspot Wi-Fi (lub router malinowy z czerwoną czapką)
(mix swobodnie dostępnych obrazów)

Zauważmy od razu, że niektóre prędkości kosmiczne nie będą działać. Wyciskam maksymalnie 100 Mbps z mojego Raspberry drogą powietrzną, co pokrywa prędkość mojego dostawcy Internetu. Po co ci tak powolny AC, skoro teoretycznie możesz uzyskać pół gigabita nawet na N? Jeśli zadałeś sobie to pytanie, to udaj się do sklepu, aby kupić prawdziwy router z ośmioma antenami zewnętrznymi.

0. Czego będziesz potrzebować

  • Właściwie sam „produkt malinowy” ma kaliber: Pi 3 Model B+ (aby osiągnąć pożądane prędkości i kanały 5 GHz);
  • Dobry microSD >= 4 GB;
  • Stacja robocza z systemem Linux i czytnikiem/zapisem kart microSD;
  • Dostępność wystarczających umiejętności w systemie Linux, artykuł przeznaczony jest dla przeszkolonego Geeka;
  • Łączność poprzez sieć przewodową (eth0) pomiędzy Raspberry a Linuksem, uruchomienie serwera DHCP w sieci lokalnej oraz dostęp do Internetu z obu urządzeń.

Mały komentarz do ostatniego punktu. „Co było pierwsze, jajko czy...” jak zrobić router Wi-Fi w przypadku braku sprzętu umożliwiającego dostęp do Internetu? Zostawmy to zabawne ćwiczenie poza zakresem artykułu i załóżmy po prostu, że Raspberry jest podłączony do sieci lokalnej przewodowo i ma dostęp do Internetu. W tym przypadku do ustawienia „malinki” nie będzie nam potrzebny dodatkowy telewizor i manipulator.

1. Zainstaluj CentOS

Strona główna projektu

W chwili pisania tego artykułu działająca wersja CentOS na urządzeniu jest 32-bitowa. Gdzieś w sieci natknąłem się na opinie, że wydajność takich systemów operacyjnych na 64-bitowej architekturze ARM spada aż o 20%. Pozostawię tę chwilę bez komentarza.

W systemie Linux pobierz minimalny obraz z jądrem „-Malinowy PI-" i zapisz go na karcie microSD:

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

Zanim zaczniemy używać obrazu, usuniemy z niego partycję SWAP, rozwiniemy root na cały dostępny wolumin i pozbędziemy się SELinuksa. Algorytm jest prosty: wykonaj kopię katalogu głównego w systemie Linux, usuń wszystkie partycje z karty microSD oprócz pierwszej (/boot), utwórz nowy katalog główny i zwróć jego zawartość z kopii.

Przykład wymaganych działań (poważne wyjście konsoli)

# 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 rozpakowaniu zawartości partycji root czas wprowadzić w niej pewne zmiany.

Wyłącz SELinux w /mnt/etc/selinux/config:

SELINUX=disabled

Redagowanie /mnt/etc/fstab, pozostawiając w nim tylko dwa wpisy dotyczące partycji: boot (/boot, bez zmian) i root (zmieniamy wartość UUID, co można sprawdzić, badając wynik polecenia blkid w systemie Linux):

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

Na koniec zmieniamy parametry rozruchu jądra: określamy nową lokalizację partycji root, wyłączamy wyświetlanie informacji debugowania i (opcjonalnie) zabraniamy jądru przydzielania adresów IPv6 na interfejsach sieciowych:

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

Oto treść /mnt/cmdline.txt do następującej postaci (jedna linia bez myślników):

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

Gotowe:

# cd
# umount /mnt
# sync

Układamy kartę microSD w „malinę”, uruchamiamy ją i uzyskujemy do niej dostęp sieciowy przez ssh (root/centos).

2. Konfigurowanie CentOS

Pierwsze trzy niezachwiane ruchy: passwd, yum -y aktualizacja, restart.

Rozdajemy zarządzanie siecią w sieci:

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

Utwórz plik (wraz z katalogami) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Restartujemy „Malinę” i ponownie uzyskujemy do niej dostęp sieciowy przez ssh (adres IP może się zmienić). Zwróć uwagę na to, czego się używa / Etc / resolv.conf, utworzony wcześniej przez Network Managera. Dlatego w przypadku problemów z rozwiązaniem edytuj jego zawartość. Używać systemd-rozwiązany Nie będziemy.

Usuwamy „niepotrzebne”, naprawiamy i przyspieszamy ładowanie systemu operacyjnego:

# 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

Kto potrzebuje cron i który nie trawi wbudowanego timery systemowe, może ustalić, czego brakuje. / var / log- i przejrzyj journalctl. Jeśli potrzebujesz historii logów (domyślnie informacje przechowywane są tylko od momentu uruchomienia systemu):

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

Wyłącz korzystanie z protokołu IPv6 przez usługi podstawowe (jeśli jest to wymagane)/ etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Znaczenie czasu na „malinie” jest ważną rzeczą. Ponieważ fabrycznie nie ma możliwości zapisania bieżącego stanu zegara po ponownym uruchomieniu, konieczna jest synchronizacja. Bardzo dobrym i szybkim demonem jest do tego celu chroniczny - już zainstalowany i uruchamia się automatycznie. Możesz zmienić serwery NTP na najbliższe.

/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

Aby ustawić strefę czasową, której będziemy używać sztuczka. Ponieważ naszym celem jest stworzenie routera Wi-Fi działającego na częstotliwościach 5 GHz, na niespodzianki przygotujemy się z wyprzedzeniem regulator:

# mniam, informacja crda
Podsumowanie: Demon zgodności z przepisami dla sieci bezprzewodowych 802.11

Ten zły projekt, również oparty na strefie czasowej, „zabrania” używania (w Rosji) częstotliwości 5 GHz i kanałów o „wysokich” numerach. Sztuka polega na tym, aby ustawić strefę czasową bez używania nazw kontynentów/miast, czyli zamiast:

# timedatectl set-timezone Europe/Moscow

Naciskamy:

# timedatectl set-timezone Etc/GMT-3

I ostatnie poprawki w fryzurze systemu:

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

Wszystko, co powiedziano powyżej, można uznać za kompletną instrukcję instalacji „waniliowego” CentOS na Raspberry Pi. Powinieneś otrzymać komputer, który (ponownie) uruchamia się w mniej niż 10 sekund, zużywa mniej niż 15 megabajtów pamięci RAM i 1.5 gigabajta karty microSD (właściwie mniej niż 1 gigabajt ze względu na niekompletny plik /boot, ale bądźmy szczerzy).

Aby zainstalować oprogramowanie punktu dostępu Wi-Fi w tym systemie, będziesz musiał nieco rozszerzyć możliwości standardowej dystrybucji CentOS. Na początek zaktualizujmy sterownik (firmware) wbudowanej karty Wi-Fi. Strona główna projektu mówi:

Wi-Fi na Raspberry 3B i 3B+

Pliki oprogramowania układowego Raspberry PI 3B/3B+ nie mogą być dystrybuowane przez projekt CentOS. Możesz skorzystać z poniższych artykułów, aby zrozumieć problem, pobrać oprogramowanie sprzętowe i skonfigurować Wi-Fi.

To, co jest zabronione w projekcie CentOS, nie jest dla nas zabronione do użytku osobistego. Zastępujemy dystrybucyjne oprogramowanie Wi-Fi w CentOS odpowiednim oprogramowaniem od programistów Broadcom (te same znienawidzone binarne plamy…). Umożliwi to w szczególności korzystanie z AC w ​​trybie punktu dostępu.

Aktualizacja oprogramowania sprzętowego Wi-FiSprawdź model urządzenia i aktualną wersję oprogramowania:

# 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 

Widzimy, że wersja oprogramowania to 7.45.18 z dnia 01.03.2015 i pamiętamy następujący zestaw liczb: 43455 (brcmfmac43455-sdio.bin).

Pobierz aktualny obraz Raspbian. Leniwi ludzie mogą zapisać obraz na karcie microSD i pobrać stamtąd pliki z oprogramowaniem. Możesz też zamontować partycję główną obrazu w systemie Linux i skopiować stamtąd to, czego potrzebujesz:

# 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

Powstałe pliki oprogramowania sprzętowego adaptera Wi-Fi należy skopiować i zastąpić słowem „raspberry” do katalogu /usr/lib/firmware/brcm/

Ponownie uruchamiamy przyszły router i uśmiechamy się z zadowoleniem:

# 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 

Wersja: 7.45.154 z dnia 27.02.2018.

I oczywiście 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. Konfiguracja sieci i przyszłe wyzwania

Jak ustaliliśmy powyżej, „malina” jest połączona „przewodem” z siecią lokalną. Załóżmy, że dostawca zapewnia dostęp do Internetu dokładnie w ten sam sposób: adres w sieci publicznej jest przydzielany dynamicznie przez serwer DHCP (być może z powiązaniem MAC). W takim przypadku po ostatecznej konfiguracji maliny wystarczy „podłączyć” do niej kabel dostawcy i gotowe. Autoryzacja za pomocą systemd-siećd - temat na osobny artykuł i nie jest tutaj poruszany.

Interfejs(y) Wi-Fi Raspberry to sieć lokalna, a wbudowany adapter Ethernet (eth0) jest zewnętrzny. Numerujmy sieć lokalną statycznie, na przykład: 192.168.0.0/24. Adres maliny: 192.168.0.1. Serwer DHCP będzie działał w sieci zewnętrznej (Internet).

Problem spójności nazewnictwa и słynny programista z Gwatemali - dwa kłopoty, które czekają każdego, kto konfiguruje interfejsy sieciowe i usługi w dystrybucjach systemowych.

Równoległy chaos (dygresja liryczna)Lennart Pottering opracował własny program systemd Bardzo dobry. Ten systemd uruchamia inne programy tak szybko, że nie mając czasu na ochłonięcie po gwizdku sędziego, potykają się i upadają na starcie, nawet nie rozpoczynając biegu z przeszkodami.

Ale poważnie, agresywna równoległość procesów uruchamianych na początku systemowego systemu operacyjnego jest rodzajem „mostu osła” dla doświadczonych specjalistów od sekwencyjnego LSB. Na szczęście uporządkowanie tego „równoległego chaosu” okazuje się proste, choć nie zawsze oczywiste.

Tworzymy dwa wirtualne interfejsy mostów o stałych nazwach: lan и blady. Do pierwszego „podłączymy” adapter(y) Wi-Fi, a do drugiego „malinowy” eth0.

/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=tak eliminuje potrzebę wskazywania jądru poprzez sysctl, aby włączyć routing.
Adres MAC= Odkomentujmy i zmieńmy jeśli zajdzie taka potrzeba.

Najpierw „łączymy” eth0. Pamiętamy o „problemie z jednolitością” i używamy tylko adresu MAC tego interfejsu, który można znaleźć na przykład w ten sposób:

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

Tworzymy /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Usuwamy poprzedni plik konfiguracyjny eth0, restartujemy Raspberry i uzyskujemy do niego dostęp sieciowy (najprawdopodobniej zmieni się adres IP):

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

5.DNSMASQ

Nie ma nic lepszego niż kilka słodkich punktów dostępu do tworzenia punktów dostępu Wi-Fi dnsmasq + hostapd jeszcze tego nie wymyśliłem. Moim zdaniem.

Gdyby ktoś zapomniał, to...hostapd - to jest to, co kontroluje adaptery Wi-Fi (w szczególności zajmie się połączeniem ich z wirtualnym lan „maliny”), autoryzuje i rejestruje klientów bezprzewodowych.

dnsmasq — konfiguruje stos sieciowy klientów: przydziela adresy IP, serwery DNS, bramę domyślną i podobne przyjemności.

Zacznijmy od dnsmasq:

# yum install dnsmasq

Wzór / 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

edytuj go według własnych upodobań.

minimalistyczny /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” tkwi tutaj w parametrze wiązanie dynamiczne, który nakazuje demonowi dnsmasq poczekać, aż pojawi się w systemie interfejs=lani nie zemdleć z powodu napadu dumnej samotności po starcie.

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

6. HOSTAPD

I na koniec magiczne konfiguracje hostapd. Nie mam wątpliwości, że ktoś czyta ten artykuł w poszukiwaniu właśnie tych cennych wersetów.

Przed zainstalowaniem hostapd musisz przezwyciężyć „problem z jednolitością”. Wbudowany adapter Wi-Fi wlan0 może z łatwością zmienić swoją nazwę na wlan1 podczas podłączania dodatkowego sprzętu Wi-Fi USB. Dlatego naprawimy nazwy interfejsów w następujący sposób: wymyślimy unikalne nazwy dla adapterów (bezprzewodowych) i powiążemy je z adresami MAC.

W przypadku wbudowanego adaptera Wi-Fi, który nadal jest wlan0:

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

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

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

[Link]
Name=wl0

Teraz będziemy tego pewni wl0 - To jest wbudowane Wi-Fi. Aby się tego upewnić, ponownie uruchamiamy Raspberry.

Zainstalować:

# yum install hostapd wireless-tools

Plik konfiguracyjny /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

Nie zapominając ani na chwilę GKChP, zmień potrzebne nam parametry i ręcznie sprawdź funkcjonalność:

# hostapd /etc/hostapd/hostapd.conf

hostapd uruchomi się w trybie interaktywnym, rozgłaszając swój stan do konsoli. Jeśli nie będzie żadnych błędów, klienci obsługujący tryb AC będą mogli połączyć się z punktem dostępowym. Aby zatrzymać Hostapd - Ctrl-C.

Pozostaje tylko włączyć hostapd podczas uruchamiania systemu. Jeśli zrobisz standardową rzecz (systemctl włącz hostapd), to po następnym ponownym uruchomieniu możesz dostać demona „toczącego się we krwi” z diagnozą „Nie znaleziono interfejsu wl0„. W wyniku „równoległego chaosu” hostapd uruchamiał się szybciej, niż jądro znalazło kartę bezprzewodową.

W Internecie jest mnóstwo środków zaradczych: od wymuszonego timeoutu przed uruchomieniem demona (kilka minut), po innego demona monitorującego wygląd interfejsu i (ponownie) uruchamiającego hostpada. Rozwiązania są całkiem wykonalne, ale strasznie brzydkie. Wzywamy Wielkiego na pomoc systemd z jego „celami”, „zadaniami” i „zależnościami”.

Skopiuj plik usługi dystrybucyjnej do /etc/systemd/system/hostapd.service:

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

i zredukuj jego zawartość do następującej postaci:

[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 zaktualizowanego pliku usługi polega na dynamicznym powiązaniu hostapd z nowym celem - interfejsem wl0. Kiedy interfejs się pojawi, demon zostanie uruchomiony, a kiedy zniknie, zatrzyma się. A to wszystko online – bez konieczności ponownego uruchamiania systemu. Technika ta będzie szczególnie przydatna podczas podłączania adaptera USB Wi-Fi do Raspberry.

Teraz możesz:

# systemctl enable hostapd
# reboot

7. IPTABLES

„Co?” © Tak, tak! Nic systemd. Żadnych nowomodnych kombajnów (w formie firewalld), które kończą się tym samym.

Użyjmy starego, dobrego iptables, którego usługi po uruchomieniu załadują reguły sieciowe do jądra i cicho zamkną się, nie pozostając rezydentami i nie zużywając zasobów. systemd ma elegancki IPMasquerade=, ale nadal będziemy powierzać translację adresów (NAT) i zaporę sieciową iptables.

Zainstalować:

# yum install iptables-services
# systemctl enable iptables ip6tables

Wolę przechowywać konfigurację iptables jako skrypt (przykład):

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

Wykonujemy powyższy skrypt i tracimy możliwość nawiązania nowych przewodowych połączeń SSH z Raspberry. Zgadza się, stworzyliśmy router Wi-Fi, do którego dostęp „przez Internet” jest domyślnie zabroniony - teraz tylko „bezprzewodowo”. Podłączamy kabel Ethernet dostawcy i zaczynamy surfować!

8. Premia: +2,4 GHz

Kiedy składałem pierwszy router Raspberry, korzystając z powyższego rysunku, odkryłem w moim domu szereg gadżetów, które ze względu na ograniczenia konstrukcyjne Wi-Fi w ogóle nie widziały „Maliny”. Ponowna konfiguracja routera do pracy w standardzie 802.11b/g/n była niesportowa, gdyż maksymalna prędkość „over the air” w tym przypadku nie przekraczała 40 Mbit, a mój ulubiony dostawca Internetu oferuje mi 100 (po kablu).

Tak naprawdę wymyślono już rozwiązanie tego problemu: drugi interfejs Wi-Fi działający na częstotliwości 2,4 GHz i drugi punkt dostępowy. Na pobliskim stoisku kupiłem nie pierwszy, ale drugi „gwizdek” USB Wi-Fi, na jaki się natknąłem. Sprzedawcę dręczyły pytania o chipset, kompatybilność z jądrami ARM Linux i możliwość pracy w trybie AP (był pierwszy).

„Gwizdek” konfigurujemy analogicznie do wbudowanego adaptera Wi-Fi.

Najpierw zmieńmy jego nazwę 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

Zarządzanie nowym interfejsem Wi-Fi powierzymy osobnemu demonowi hostapd, który będzie uruchamiał się i zatrzymywał w zależności od obecności w systemie ściśle określonego „gwizdka”: wl1.

Plik konfiguracyjny /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]

Zawartość tego pliku zależy bezpośrednio od modelu adaptera USB Wi-Fi, więc banalne kopiowanie/wklejanie może się nie powieść.

Skopiuj plik usługi dystrybucyjnej do /etc/systemd/system/hostapd2.service:

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

i zredukuj jego zawartość do następującej postaci:

[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

Pozostaje tylko włączyć nową instancję hostapd:

# systemctl enable hostapd2

To wszystko! Pociągnij za „gwizdek” i samą „malinę”, spójrz na otaczające Cię sieci bezprzewodowe.

Na koniec chcę Was przestrzec co do jakości adaptera USB Wi-Fi i zasilania Raspberry. Podłączony „gorący gwizdek” może czasami powodować „zamrożenie malin” z powodu krótkotrwałych problemów z elektryką.

Źródło: www.habr.com

Dodaj komentarz