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

В интернет има много решения: от принудителен таймаут преди стартиране на демона (няколко минути), до още един демон, който следи появата на интерфейса и (пре)стартира 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

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