В интернет пространството има огромно количество информация за създаването на Wi-Fi точки за достъп, базирани на едноплатковия компютър Raspberry. Обикновено се предполага използването на родната операционна система на "малинката" — Raspbian.
Като поклонник на системите базирани на RPM, не можех да отмина това малко чудо и да не опитам любимата си CentOS.
В статията е представена инструкция за изграждане на 5GHz/AC Wi-Fi рутер от Raspberry Pi 3 Model B+ на базата на операционната система CentOS. Ще бъдат включени няколко стандартни, но малко познати трика, а като бонус — схема за свързване на допълнително Wi-Fi оборудване към "малинката", позволяваща ѝ да работи едновременно в няколко режима (2,4+5GHz).

(микс изображения от свободен достъп)
Нека отбележим веднага, че няма да постигнем космически скорости. Извличам максимум 100 Mbps от моята "малинка" по въздуха, което покрива скоростта на моя интернет доставчик. Защо е нужен такъв бавен 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 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-a. Следователно, в случай на проблеми с разрешаването, редактирайте съдържанието му. Да използваме 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 се стартира по-бързо, отколкото ядрото намира безжичния адаптер.
В Интернет има много решения: от принудително забавяне преди старта на демона (определени минути), до друг демон, който следи появата на интерфейса и (презапуска) 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
Магията на обновения service файл се състои в динамичната свързаност на 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 Mbps, а любимият ми интернет доставчик ми предлага 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
