В Интернет има изобилие от информация относно създаването на Wi-Fi точки за достъп на базата на едноплатния компютър Raspberry. Обикновено се предполага използването на родната операционна система на 'малинката' — Raspbian.
Като почитател на системи на базата на RPM, не можех да пренебрегна това малко чудо и да не изпробвам любимия си 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 по подразбиране,noatime 0 0
UUID=6938-F4F2 \/boot vfat по подразбиране,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 update, reboot.
Управлението на мрежата оставяме на 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-а. Затова, в случай на проблеми с разрешаването, редактирайте съдържанието му. Да използваме systemd-resolved няма да правим.
Изтриваме "излишното", поправяме и ускоряваме зареждането на ОС:
# 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
На кого му е необходим cron и кой не понася вградените , може да инсталира липсващото. /var/log- и гледаме през journalctl. Ако е необходимо, история на журнала (по подразбиране се пазят данни само от момента на стартиране на системата):
# 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"
Актуалността на времето на "малинката" е важна. Тъй като "извън кутията" няма хардуерна възможност за запазване на текущото състояние на часовника при рестартиране, необходима е синхронизация. Много добър и бърз демон за това е chrony — вече е инсталиран и стартира автоматично. Можете да промените 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
Резюме: Деймон за регулиране на спазването за безжичен достъп 802.11
Тази зловеща конструкция, която се ориентира в частност в часовата зона, "забранява" използването (в Русия) на честоти от 5GHz и канали с "големи" номера. Трикът е в настройката на времевата зона без използването на наименования на континенти/градове, т.е. вместо:
# timedatectl set-timezone Europe/Moscow
Натискаме:
# timedatectl set-timezone Etc/GMT-3
И финалните щрихи в прическата на системата:
# hostnamectl set-hostname router
/root/.bash_profile:
. . .
# Потребителска специфична среда и програми за стартиране
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+ не могат да бъдат разпространявани от проекта CentOS. Можете да използвате следните статии, за да разберете проблема, да получите фърмуера и да настроите wifi.
Каквото е забранено за проекта CentOS, не е забранено за лична употреба. Заменяме дистрибуционната Wi-Fi прошивка в CentOS с подходящата от разработчиците на Broadcom (тези мразени бинарни блобове…). Това, в частност, ще позволи използването на AC в режим на точка за достъп.
Актуализация на Wi-Fi фърмуерИзясняваме модела на устройството и текущата версия на фърмуера:
# 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).
. Ленивите могат да запишат образа на 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) с постоянни имена: lan и wan. К първия «подключваме» 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 все още не е измислено. Според мен.
Ако някой е забравил, то… — това е нещо, което управлява Wi-Fi адаптерите (по-специално, ще се заеме с тяхното свързване към виртуалната lan «малинка»), удостоверява и регистрира безжичните клиенти.
— конфигурира мрежовия стек на клиентите: предоставя 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 се е стартирало по-бързо, отколкото ядрото е открило безжичния адаптер.
В интернет има много решения: от принудителен таймаут преди стартиране на демона (няколко минути), до още един демон, който следи появата на интерфейса и (пре)стартира hostapd. Решенията са работещи, но ужасно грозни. Призоваваме на помощ велик 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 Ѕертификатор
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 рутер, открих, че разполагам с няколко устройства, които поради конструктивните си ограничения не могат да видят "малинката" изобщо. Пренастройването на рутера да работи в режим 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
