В Інтернеті безліч інформації щодо створення Wi-Fi точок доступу на базі одноплатного ПК Raspberry. Як правило, мається на увазі використання рідної для "малинки" операційної системи - Raspbian.
Як адепт RPM-based систем, я не міг пройти повз це маленьке диво і не спробувати на ньому мою улюблену CentOS.
У статті подано інструкцію з виготовлення 5GHz/AC Wi-Fi роутера з Raspberry Pi 3 Model B+ на базі операційної системи CentOS. Буде кілька стандартних, але маловідомих трюків, а як бонус — креслення підключення до «малинки» додаткового Wi-Fi обладнання, яке дозволяє одночасно працювати в кількох режимах (2,4+5GHz).
(мікс зображень із вільного доступу)
Зазначимо одразу, що якихось космічних швидкостей не вийде. Я вичавлюю зі своєї «малинки» повітрям максимум 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
Перші три непорушні рухи: passwd, yum -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-ом. Тому, у разі проблем з резолюцією, відредагуйте його вміст. Використати вирішено в системі ми не будемо.
Видаляємо «зайве», лагодимо і прискорюємо завантаження ОС:
# 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
Кому потрібен крон і хто не перетравлює вбудовані
# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf
Відключаємо використання IPv6 основними службами (якщо потрібно)/ etc / 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 бездротової мережі
Ця зла конструкція, орієнтуючись у тому числі на часовий пояс, «забороняє» використання (у Росії) 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 на Raspberry 3B і 3B+
Raspberry PI 3B/3B+ firmware файли не можуть бути розповсюджені в CentOS Project. Ви можете використовувати following articles до understand the issue, отримати firmware і встановити 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).
# 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-ОС є якимось «ослячим містком» для затьмарених послідовних 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 ще не вигадали. На мою думку.
Якщо хтось забув, то…
Починаємо з 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. Жодних новомодних комбайнів (у вигляді брандмауер), які у результаті роблять одне й теж.
Використовуємо старий добрий 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