Raspberry Pi + CentOS = Wi-Fi Hotspot (або малінавы роўтэр у чырвоным капелюшы)

У Інтэрнэце велізарная колькасць інфармацыі па стварэнні Wi-Fi кропак доступу на базе аднаплатнага ПК Raspberry. Як правіла, маецца на ўвазе выкарыстанне роднай для «малінкі» аперацыйнай сістэмы – Raspbian.

З'яўляючыся адэптам RPM-based сістэм, я не мог мінуць гэтага маленькага цуду і не паспрабаваць на ім маю каханую CentOS.

У артыкуле прадстаўлена інструкцыя па вырабе 5GHz/AC Wi-Fi роўтара з Raspberry Pi 3 Model B+ на базе аперацыйнай сістэмы CentOS. Будзе некалькі стандартных, але малавядомых трукаў, а ў якасці бонуса – чарцёж падлучэння да «малінкі» дадатковага Wi-Fi абсталявання, які дазваляе ёй адначасова працаваць у некалькіх рэжымах (2,4+5GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (або малінавы роўтэр у чырвоным капелюшы)
(мікс малюнкаў са свабоднага доступу)

Адзначым адразу, што нейкіх касмічных скарасцей не атрымаецца. Я выціскаю са сваёй "малінкі" па паветры максімум 100 Мбіт, і гэта пакрывае хуткасць майго Інтэрнэт правайдэра. Навошта патрэбен такі млявы AC, калі нават на N у тэорыі можна атрымаць полгигабита? Калі вы задаліся такім пытаннем, то ідзіце ў краму за сапраўдным роўтэрам з васьмю вонкавымі антэнамі.

0. Што спатрэбіцца

  • Уласна, сам «малінавы выраб» калібра: Pi 3 Model B+ (для дасягнення запаветных 5GHz хуткасцяў і каналаў);
  • Дыхтоўная microSD> = 4GB;
  • Працоўная станцыя з Linux і чытачом/пісьменнікам microSD;
  • Наяўнасць дастатковых скілаў у Linux, артыкул - для падрыхтаванага Гіка;
  • Правадная сеткавая (eth0) звязанасць паміж Raspberry і Linux, які працуе DHCP-сервер у лакальнай сетцы і доступ у Інтэрнэт з абодвух прылад.

Невялікі каментар па апошнім пункце. «Што з'явілася першым, яйка ці…» як зрабіць Wi-Fi роўтар пры адсутнасці якога б там ні было абсталявання доступу ў Інтэрнэт? Пакінем за рамкамі артыкула гэта займальнае практыкаванне і проста дапусцім, што Raspberry падлучаная да лакальнай сеткі провадам і мае выйсце ў Інтэрнэт. У гэтым выпадку нам не спатрэбяцца дадатковыя тэлевізар і маніпулятар для наладкі "малінкі".

1. Устаноўка CentOS

Хатняя старонка праекта

На момант напісання гэтага артыкула, якая працуе версія CentOS на прыладзе – 32-бітная. Дзесьці на абшарах сусветнай Сеткі мне трапляліся меркаванні аб зніжэнні прадукцыйнасці такіх АС на 64-бітнай архітэктуры ARM аж на 20%. Пакіну гэты момант без каментара.

На Linux-е пампуем мінімальную выяву з ядром-RaspberryPI-» і запісваем яго на microSD:

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

Перад пачаткам выкарыстання выявы выдалім з яго частка SWAP, пашырым корань на ўвесь даступны аб'ём і пазбавімся ад SELinux. Алгарытм - просты: які робіцца копію кораня на Linux, выдаляны з microSD усе часткі акрамя першага (/boot), ствараем новы каранёвы і вяртаем яго змесціва з копіі.

Прыклад неабходных дзеянняў (суровая кансольная выснова)

# 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

Пасля распакавання змесціва каранёвай часткі самы час унесці ў яго некаторыя змены.

Адключаем SELinux у /mnt/etc/selinux/config:

SELINUX=disabled

Рэдагуем /mnt/etc/fstab, пакідаючы ў ім толькі два запісы пра часткі: загрузны (/boot, без змен) і каранёвы (змяняем значэнне UUID, якое можна пазнаць, вывучыўшы выснову каманды blkid на Linux-е):

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

Нарэшце, змяняем параметры загрузкі ядра: паказваем новае размяшчэнне каранёвай часткі, адключаем выснову адладкавай інфармацыі і (апцыянальна) забараняем ядру прызначаць IPv6 адрасы на сеткавых інтэрфейсах:

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

Прыводзім змесціва /mnt/cmdline.txt да наступнага ўвазе (адзін радок без пераносаў):

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

гатова:

# cd
# umount /mnt
# sync

Перастаўляем microSD у "малінку", запускаем і атрымліваем да яе сеткавы доступ па ssh (root/centos).

2. Настройка CentOS

Першыя тры непарушныя рухі: ПАРОЛЬ, ні -y абнаўленне, перазагружаць.

Кіраванне сеткай аддаём networkd:

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

Ствараем файл (разам з каталогамі) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Перазагружаем "малінку" і зноў атрымліваем да яе сеткавы доступ па ssh (IP-адрас можа змяніцца). Звярніце ўвагу на тое, што выкарыстоўваецца /etc/resolv.conf, створаны раней Network Manager-ам. Таму, у выпадку праблем з resolve, адрэдагуйце яго змесціва. Выкарыстоўваць вырашана ў сістэме мы не будзем.

Выдаляем "лішняе", робім і паскараем загрузку АС:

# 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

Каму патрэбен крон і хто не пераварвае убудаваныя таймеры systemd, могуць усталяваць недастатковае. / Вар / часопіс-і глядзім праз journalctl. Калі спатрэбіцца гісторыя часопіса (па змаўчанні захоўваюцца звесткі толькі з моманту старту сістэмы):

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

Адключаем выкарыстанне IPv6 асноўнымі службамі (калі патрабуецца)/ І г.д. / SSH / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Актуальнасць часу на «малінцы» - важная штука. Бо "са скрынкі" адсутнічае апаратная магчымасць захоўваць бягучы стан гадзін пры перазагрузцы, то патрэбна сінхранізацыя. Вельмі добры і хуткі дэман для гэтага - хронія - ужо ўсталяваны і запускаецца аўтаматычна. Можна змяніць NTP-серверы на бліжэйшыя.

/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

Для ўстаноўкі часавага пояса будзем выкарыстоўваць трук. Так як наша мэта - стварэнне Wi-Fi роўтара, які працуе на 5GHz частотах, то загадзя падрыхтуемся да сюрпрызаў рэгулятара:

# yum info crda
Summary: Regulatory compliance daemon для 802.11 Wireless Networking

Гэтая зласлівая канструкцыя, арыентуючыся ў тым ліку на гадзінны пояс, "забараняе" выкарыстанне (у Расіі) 5GHz частот і каналаў з "вялікімі" нумарамі. Трук заключаецца ва ўстаноўцы тайм зоны без выкарыстання назваў мацерыкоў/гарадоў, гэта значыць замест:

# timedatectl set-timezone Europe/Moscow

Уціскаем:

# timedatectl set-timezone Etc/GMT-3

І фінальныя рыскі ў прычосцы сістэмы:

# 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. Дадаткі CentOS

Усё, аб чым было сказанае вышэй, можна лічыць скончанай інструкцыяй па ўсталёўцы ванільнага CentOS на Raspberry Pi. У вас павінен атрымацца ПК, які (пера)загружаецца менш за за 10 секунд, выкарыстоўвае меней 15 Мегабайт аператыўнай памяці і 1.5 Гігабайта microSD (насамрэч меней 1 Гігабайта з-за няпоўнага /boot, але будзем сумленнымі да канца).

Для ўстаноўкі ПА Wi-Fi кропкі доступу на гэтую сістэму спатрэбіцца крыху пашырыць магчымасці стандартнага дыстрыбутыва CentOS. Першым чынам "прапампуем" драйвер(прашыўку) убудаванага Wi-Fi адаптара. На хатняй старонцы праекту сказана:

Wifi on the Raspberry 3B і 3B+

Raspberry PI 3B/3B+ firmware files не можа быць укладзены ў CentOS Project. Вы можаце выкарыстоўваць наступныя матэрыялы для падрыхтаванай праграмы, атрымаць firmware and set up the wifi.

Што нельга праекту CentOS, тое не забаронена нам для асабістага выкарыстання. Замяняем дыстрыбутыўную Wi-Fi прашыўку ў CentOS на адпаведную ад распрацоўшчыкаў Broadcom (тыя самыя ненавісныя бінарныя блобы…). Гэта, у прыватнасці, дазволіць выкарыстоўваць AC у рэжыме кропкі доступу.

Wi-Fi firmware upgradeВысвятляем мадэль прылады і бягучую версію прашыўкі:

# 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 

Бачым, што прашыўка версіі 7.45.18 ад 01.03.2015, і запамінаем наступны набор лічбаў: 43455 (brcmfmac43455-sdio.bin).

Качаем актуальную выяву Raspbian. Гультаяватыя могуць запісаць выяву на microSD і адтуль забраць файлы з прашыўкай. А можна змантаваць каранёвую частку выявы ў Linux і скапіяваць патрэбнае адтуль:

# 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

Атрыманыя файлы прашыўкі Wi-Fi адаптара трэба скапіяваць з заменай на "малінку" у каталог /usr/lib/firmware/brcm/

Перазагружаем будучы роўтэр і даволі ўсміхаемся:

# 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 

Версія: 7.45.154 ад 27.02.2018.

Ну і вядома ж 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. Сеткавая канфігурацыя і далейшыя праблемы

Як мы дамовіліся вышэй, "малінка" падлучаная "провадам" да лакальнай сеткі. Выкажам здагадку, што і правайдэр падае доступ у Інтэрнэт сапраўды такім жа спосабам: адрас у публічнай сетцы выдаецца дынамічна DHCP серверам (можа быць з прывязкай да MAC). У гэтым выпадку, пасля канчатковай налады "малінкі", дастаткова "ўваткнуць" у яе кабель правайдэра і ўсё гатова. Аўтарызацыя з дапамогай systemd-networkd - тэма асобнага артыкула і тут не разглядаецца.

Wi-Fi інтэрфейс(ы) у Raspberry – гэта лакальная сетка, а ўбудаваны Ethernet адаптар (eth0) – знешняя. Лакальную сетку пранумаруем статычна, напрыклад: 192.168.0.0/24. Адрас "малінкі": 192.168.0.1. У знешняй сетцы (Інтэрнэт) будзе працаваць DHCP сервер.

Праблема аднастайнасці наймення и вядомы гватэмальскі праграміст - дзве непрыемнасці, якія чакаюць кожнага, хто займаецца наладай сеткавых інтэрфейсаў і службаў у systemd-дыстрыбутывах.

Паралельны хаос (лірычны адступ)Ленарт Потэрынг склаў сваю праграму Systemd вельмі добра. Гэтая Systemd запускае іншыя праграмы так хутка, што тыя, не паспеўшы апамятацца ад судзейскага выспятка свістка, спатыкаюцца і падаюць на старце нават не пачаўшы свой бег з перашкодамі.

Ну а калі сур'ёзна, то агрэсіўнае распаралельванне запускаемых працэсаў пры старце systemd-АС з'яўляецца нейкім «асліным мастком» для мацёрых паслядоўных LSB-шнікаў. На шчасце, давесці да ладу гэты «раўналежны хаос» апыняецца простай, праўда не заўсёды відавочнай справай.

Ствараем два віртуальных інтэрфейсу-моста (bridge) з пастаяннымі імёнамі: ЛВС и Ван. Да першага "падключым" Wi-Fi адаптар (ы), да другога – 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=yes пазбаўляе ад неабходнасці праз sysctl намякаць ядру аб уключэнні маршрутызацыі.
MACAddress= раскаментуем і зменім пры неабходнасці.

Спачатку "падключаем" eth0. Памятаем пра «праблему аднастайнасці» і выкарыстоўваем толькі MAC адрас гэтага інтэрфейсу, даведацца які можна, напрыклад, так:

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

Ствараем /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

Выдаляем папярэдні файл канфігурацыі eth0, перазагружаем "малінку" і атрымліваем да яе сеткавы доступ (IP адрас хутчэй за ўсё зменіцца):

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

5. DNSMASQ

Для вырабу кропак доступу Wi-Fi нічога лепш салодкай парачкі з dnsmasq + hostapd яшчэ не прыдумалі. На маю думку.

Калі хто забыўся, то…hostapd – гэта штука, якая кіруе Wi-Fi адаптарамі (у прыватнасці, возьме на сябе працу па іх падлучэнні да віртуальнага) ЛВС "малінкі"), аўтарызуе і рэгіструе бесправадных кліентаў.

dnsmasq - наладжвае сеткавы стэк кліентаў: выдае IP-адрасы, DNS-серверы, шлюз па змаўчанні і таму падобныя любаты.

Пачынаем з dnsmasq:

# yum install dnsmasq

шаблон /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

рэдагуем яго на свой густ.

Мінімалістычны /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

"Магія" тут заключаецца ў параметры bind-dynamic, які паказвае дэману dnsmasq чакаць з'яўлення ў сістэме interface=lan, а не страціць прытомнасць ад прыступу ганарлівай адзіноты пасля старту.

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

6. HOSTAPD

І нарэшце, чарадзейныя канфігурацыі hostapd. Не сумняваюся, што нехта чытае гэты артыкул у пошуку менавіта гэтых запаветных радкоў.

Перад усталёўкай hostapd трэба пазмагацца з «праблемай аднастайнасці». Убудаваны Wi-Fi адаптар wlan0 можа лёгка змяніць сваё імя на wlan1 пры падключэнні дадатковага USB Wi-Fi абсталявання. Таму зафіксуем імёны інтэрфейсаў наступным спосабам: прыдумаем (бесправадным) адаптарам унікальныя назвы і прывяжам іх да MAC адрасам.

Для убудаванага Wi-Fi адаптара, які пакуль яшчэ wlan0:

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

Ствараем /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

Цяпер мы будзем упэўнены, што wl0 - гэта убудаваны Wi-Fi. Перазагружаем "малінку", каб у гэтым пераканацца.

Усталёўваны:

# yum install hostapd wireless-tools

Канфігурацыйны файл /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

Ні на хвіліну не забываючы аб ГКЧП, змяняем неабходныя нам параметры і ўручную правяраем на працаздольнасць:

# hostapd /etc/hostapd/hostapd.conf

hostapd запусціцца ў інтэрактыўным рэжыме, транслюючы на ​​кансоль свой стан. Калі памылак не будзе, то да кропкі доступу ўжо можна будзе падлучацца кліентам, якія падтрымліваюць AC-рэжым. Для прыпынку hostapd - Ctrl-C.

Засталося ўключыць hostapd у аўтазагрузку сістэмы. Калі паступіць стандартна (systemctl enable hostapd), то пасля чарговай перазагрузкі можна атрымаць «які валяецца ў крыві» дэмана з дыягназам «інтэрфейс wl0 не знойдзены“. У выніку "раўналежнага хаосу" hostapd завёўся хутчэй, чым ядро ​​знайшло бесправадны адаптар.

У Інтэрнэце поўна лекаў: ад прымусовага таймаўту перад стартам дэмана (некалькі хвілін), да яшчэ аднаго дэмана, які маніторыць з'яўленне інтэрфейсу і (пера) запускае hostpad. Рашэнні цалкам сабе працоўныя, але жудасна непрыгожыя. Заклікаем на дапамогу вялікага Systemd з яго "мэтамі" і "задачамі" "залежнасцямі".

Капіяваны дыстрыбутыўны service-файл у /etc/systemd/system/hostapd.service:

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

і прыводзім яго змесціва да наступнага ўвазе:

[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

Магія абноўленага сэрвіснага файла складаецца ў дынамічнай прывязцы hostapd да новай мэты – інтэрфейсу wl0. Пры з'яўленні інтэрфейсу - дэман запускаецца, пры знікненні - спыняецца. І гэта ўсё ў анлайне - без перазагрузкі сістэмы. Асабліва гэтая тэхніка будзе карыснай пры падлучэнні да "малінцы" USB Wi-Fi адаптара.

Вось зараз можна:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Шта???" © Так-так! Ніякага Systemd. Ніякіх навамодных камбайнаў (у выглядзе firewalld), якія ў выніку робяць адно і тое ж.

Выкарыстоўваны стары добры Iptables, Службы якога пасля свайго старту загрузяць у ядро ​​сеткавыя правілы і спакойна завершаць працу, не застаючыся рэзідэнтна і не спажываючы рэсурсаў. У systemd ёсць элегантны IPMasquerade=, Але трансляцыю адрасоў (NAT) і фаервол даручым усё ж iptables.

Усталёўваны:

# yum install iptables-services
# systemctl enable iptables ip6tables

Канфігурацыю iptables я аддаю перавагу захоўваць у выглядзе скрыпту (прыклад):

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

Выконваем вышэйпрыведзены скрыпт і губляем магчымасць усталёўваць новыя правадныя ssh-злучэнні з "малінкай". Усё правільна, мы вырабілі Wi-Fi роўтар, доступ да якога "праз Інтэрнэт" па змаўчанні забаронены - зараз толькі "па паветры". Падключаем кабель правайдэра ў Ethernet і пачынаем сёрфінг!

8. Бонус: +2,4GHz

Калі па вышэйапісаным чарцяжы я сабраў першы Raspberry роўтэр, то выявіў у сябе ў гаспадарцы некаторую колькасць гаджэтаў, якія ў сілу сваіх канструктыўных абмежаванняў Wi-Fi не маглі ўбачыць "малінку" наогул. Пераналаджваць роўтэр на працу ў 802.11b/g/n было неспартыўна, бо максімальная хуткасць «па паветры» у такім выпадку не перавышала 40 Мбіт, а мой каханы Інтэрнэт правайдэр прапануе мне 100 (па кабелі).

Насамрэч, рашэнне праблемы было ўжо прыдумана: другі Wi-Fi інтэрфейс, які працуе на частаце 2,4GHz, і другая кропка доступу. У найблізкім ларку я набыў не першы, а другі які трапіў мне USB Wi-Fi "свісток". Прадавец быў змучаны пытаннямі аб чыпсэце, сумяшчальнасці з ARM-ядрамі Linux і аб магчымасці працы ў рэжыме AP (ён першы пачаў).

Канфігуруем "свісток" па аналогіі з убудаваным Wi-Fi адаптарам.

Спачатку - перайменуем яго ў 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

Кіраваць новым Wi-Fi інтэрфейсам даручым асобнаму дэману hostapd, які будзе запускацца і спыняцца ў залежнасці ад наяўнасці ў сістэме строга вызначанага "свістку": wl1.

Канфігурацыйны файл /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]

Змест гэтага файла напрамую залежыць ад мадэлі USB Wi-Fi адаптара, таму банальны copy/paste можа вас падвесці.

Капіяваны дыстрыбутыўны service-файл у /etc/systemd/system/hostapd2.service:

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

і прыводзім яго змесціва да наступнага ўвазе:

[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

Засталося ўключыць новы асобнік hostapd:

# systemctl enable hostapd2

Вось і ўсё! Паторгаць «свісток» і саму «малінку», паглядзіце на бесправадныя сеткі вакол.

І напрыканцы жадаю папярэдзіць аб якасці USB Wi-Fi адаптара і электрасілкавання Raspberry. Падлучаны "на гарачую свісток", часам можа выклікаць "завісанне малінкі" з-за кароткачасовых электрычных непрыемнасцяў.

Крыніца: habr.com

Дадаць каментар