Raspberry Pi + CentOS = Wi-Fi Hotspot (или Raspberry Red Hat Router)

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

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

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

Raspberry Pi + CentOS = Wi-Fi Hotspot (или Raspberry Red Hat Router)
(микс от свободно достъпни изображения)

Нека веднага да отбележим, че някои космически скорости няма да работят. Изстисквам максимум 100 Mbps от моя Raspberry по въздуха и това покрива скоростта на моя интернет доставчик. Защо се нуждаете от толкова муден 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. Алгоритъмът е прост: направете копие на root на Linux, изтрийте всички дялове от microSD с изключение на първия (/boot), създайте нов root и върнете съдържанието му от копието.

Пример за необходими действия (сериозен изход от конзолата)

# 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 (/boot, без промени) и root (ние променяме стойността на 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

Първите три непоклатими движения: ако съществува, yum -y актуализация, рестартирате.

Подаряваме мрежово управление networkd:

# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off

Създайте файл (заедно с директории) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Рестартираме „малината“ и отново получаваме мрежов достъп до нея чрез ssh (IP адресът може да се промени). Обърнете внимание какво се използва / И т.н. / resolv.conf, създаден по-рано от Network Manager. Ето защо, в случай на проблеми с разрешаването, редактирайте съдържанието му. Използвайте разрешено от systemd ние няма.

Премахваме „ненужното“, поправяме и ускоряваме зареждането на ОС:

# 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 / дневник- и погледнете journalctl. Ако имате нужда от история на регистрационните файлове (по подразбиране информацията се съхранява само от момента, в който системата стартира):

# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf

Деактивирайте използването на IPv6 от основните услуги (ако е необходимо)/ И т.н. / SSH / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Релевантността на времето за „малина“ е важно нещо. Тъй като извън кутията няма хардуерна възможност за запазване на текущото състояние на часовника при рестартиране, е необходима синхронизация. Много добър и бърз демон за това е хроника - вече е инсталиран и стартира автоматично. Можете да смените NTP сървърите с най-близките.

/etc/chrony.conf:

server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

За да зададем часовата зона, която ще използваме трик. Тъй като нашата цел е да създадем Wi-Fi рутер, работещ на честоти от 5GHz, ще се подготвим за изненади предварително регулатор:

# yum информация crda
Резюме: Демон за съответствие с нормативните изисквания за безжична мрежа 802.11

Този зъл дизайн, също базиран на часовата зона, „забранява“ използването (в Русия) на 5GHz честоти и канали с „високи“ числа. Номерът е да зададете часова зона, без да използвате имената на континенти/градове, тоест вместо:

# timedatectl set-timezone Europe/Moscow

Натискаме:

# timedatectl set-timezone Etc/GMT-3

И финалните щрихи към прическата на системата:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# User specific environment and startup programs

export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin

3. CentOS добавки

Всичко, което беше казано по-горе, може да се счита за пълни инструкции за инсталиране на „ванилия“ CentOS на Raspberry Pi. Трябва да се окажете с компютър, който (ре)стартира за по-малко от 10 секунди, използва по-малко от 15 мегабайта RAM и 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. Raspberry адрес: 192.168.0.1. Във външната мрежа (Интернет) ще работи DHCP сървър.

Проблем с последователността на имената и известен гватемалски програмист - две проблеми, които очакват всеки, който конфигурира мрежови интерфейси и услуги в дистрибуции на systemd.

Паралелен хаос (лирическо отклонение)Lennart Pottering е съставил своя собствена програма systemd Много добре. Това systemd стартира други програми толкова бързо, че те, без да имат време да се възстановят от свирката на съдията, се спъват и падат в началото, без дори да започнат своята писта с препятствия.

Но сериозно, агресивното паралелизиране на стартираните процеси в началото на операционната система systemd е нещо като „магарешки мост“ за опитни специалисти по последователни LSB. За щастие въвеждането на ред в този „паралелен хаос“ се оказва лесно, макар и не винаги очевидно.

Създаваме два виртуални мостови интерфейса с постоянни имена: LAN и изнурен. Ще „свържем“ 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=да елиминира необходимостта от подсказване на ядрото чрез 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, рестартираме Raspberry и получаваме мрежов достъп до него (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

шаблон / И т.н. / 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

„Магията“ тук се крие в параметъра динамично свързване, което казва на демона dnsmasq да изчака, докато се появи в системата интерфейс=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. Рестартираме Raspberry, за да се уверим в това.

Инсталирай:

# 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 стартира по-бързо, отколкото ядрото намери безжичния адаптер.

Интернет е пълен с лекарства: от принудително изчакване преди стартиране на демона (няколко минути), до друг демон, който следи външния вид на интерфейса и (ре)стартира хостпада. Решенията са доста работещи, но ужасно грозни. Викаме великия на помощ systemd със своите „цели” и „задачи” и „зависимости”.

Копирайте файла на услугата за разпространение в /etc/systemd/system/hostapd.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system

и редуцирайте съдържанието му до следния вид:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl0.device
BindsTo=sys-subsystem-net-devices-wl0.device

[Service]
Type=forking
PIDFile=/run/hostapd.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl0.device

Магията на актуализирания сервизен файл се крие в динамичното свързване на hostapd към новата цел - интерфейса wl0. Когато интерфейсът се появи, демонът стартира; когато изчезне, той спира. И всичко това е онлайн - без рестартиране на системата. Тази техника ще бъде особено полезна при свързване на USB Wi-Fi адаптер към Raspberry.

Сега ти можеш:

# 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 връзки с Raspberry. Точно така, направихме Wi-Fi рутер, достъпът до който „през интернет“ е забранен по подразбиране - сега само „по въздуха“. Свързваме Ethernet кабела на доставчика и започваме да сърфираме!

8. Бонус: +2,4GHz

Когато сглобих първия рутер Raspberry, използвайки чертежа, описан по-горе, открих редица джаджи в моето домакинство, които поради ограниченията на дизайна на Wi-Fi изобщо не можеха да видят „малината“. Преконфигурирането на рутера за работа в 802.11b/g/n беше неспортсменско, тъй като максималната скорост „по въздуха” в този случай не надвишаваше 40 Mbit, а любимият ми интернет доставчик ми предлага 100 (по кабел).

Всъщност вече е измислено решение на проблема: втори Wi-Fi интерфейс, работещ на честота 2,4 GHz, и втора точка за достъп. От близкия щанд си купих не първата, а втората 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 адаптера, така че баналното копиране/поставяне може да ви провали.

Копирайте файла на услугата за разпространение в /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. Свързаната „гореща свирка“ понякога може да причини „замръзване на малини“ поради краткотрайни електрически проблеми.

Източник: www.habr.com

Добавяне на нов коментар