Raspberry Pi + CentOS = Wi-Fi гореща точка (или малинов рутер с червена шапка)

В интернет пространството има огромно количество информация за създаването на Wi-Fi точки за достъп, базирани на едноплатковия компютър Raspberry. Обикновено се предполага използването на родната операционна система на "малинката" — Raspbian.

Като поклонник на системите базирани на RPM, не можех да отмина това малко чудо и да не опитам любимата си CentOS.

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

Raspberry Pi + CentOS = Wi-Fi гореща точка (или малинов рутер с червена шапка)
(микс изображения от свободен достъп)

Нека отбележим веднага, че няма да постигнем космически скорости. Извличам максимум 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 и който не понася вградените таймери systemd, могат да инсталират липсващото. /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).

Изтеглете актуалния образ на 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) с постоянни имена: 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 . Според мен.

Ако някой е забравил, то...hostapd — това е програмата, която управлява Wi-Fi адаптерите (в частност, ще се погрижи за свързването им с виртуалната lan «малинка»), удостоверява и регистрира безжичните клиенти.

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

Магията на обновения 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster