Raspberry Pi + CentOS = Wi-Fi Hotspot (або малиновий роутер у червоному капелюсі)

В Інтернеті безліч інформації щодо створення Wi-Fi точок доступу на базі одноплатного ПК Raspberry. Як правило, мається на увазі використання рідної для "малинки" операційної системи - Raspbian.

Як адепт RPM-based систем, я не міг пройти повз це маленьке диво і не спробувати на ньому мою улюблену CentOS.

У статті подано інструкцію з виготовлення 5GHz/AC Wi-Fi роутера з Raspberry Pi 3 Model B+ на базі операційної системи CentOS. Буде кілька стандартних, але маловідомих трюків, а як бонус — креслення підключення до «малинки» додаткового Wi-Fi обладнання, яке дозволяє одночасно працювати в кількох режимах (2,4+5GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (або малиновий роутер у червоному капелюсі)
(мікс зображень із вільного доступу)

Зазначимо одразу, що якихось космічних швидкостей не вийде. Я вичавлюю зі своєї «малинки» повітрям максимум 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    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 оновлення, перезавантажувати.

Управління мережею віддаємо 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-ом. Тому, у разі проблем з резолюцією, відредагуйте його вміст. Використати вирішено в системі ми не будемо.

Видаляємо «зайве», лагодимо і прискорюємо завантаження ОС:

# 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

Кому потрібен крон і хто не перетравлює вбудовані таймери 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"

Актуальність часу на "малинці" - важлива штука. Оскільки «з коробки» відсутня апаратна можливість зберігати поточний стан годинника при перезавантаженні, то потрібна синхронізація. Дуже хороший і швидкий демон для цього хронічність — вже встановлено та запускається автоматично. Можна змінити сервери 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
Summary: Regulatory compliance daemon для 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 мегабайт оперативної пам'яті та 1.5 гігабайта microSD (насправді менше 1 гігабайта через неповний /boot, але будемо чесними до кінця).

Для встановлення програмного забезпечення Wi-Fi точки доступу на цю систему потрібно трохи розширити можливості стандартного дистрибутива CentOS. Насамперед «прокачаємо» драйвер(прошивку) вбудованого Wi-Fi адаптера. На домашній сторінці проекту сказано:

Wifi на Raspberry 3B і 3B+

Raspberry PI 3B/3B+ firmware файли не можуть бути розповсюджені в CentOS Project. Ви можете використовувати following articles до understand the issue, отримати firmware і встановити wifi.

Що не можна проекту CentOS, то нам не заборонено для особистого використання. Замінюємо дистрибутивну Wi-Fi прошивку в CentOS на відповідну від розробників Broadcom (ті самі ненависні бінарні блоби…). Це, зокрема, дозволить використовувати AC у режимі точки доступу.

Wi-Fi firmware upgradeЗ'ясовуємо модель пристрою та поточну версію прошивки:

# 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) з постійними іменами: ЛВС и виснажений. До першого "підключимо" 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 адаптерами (зокрема, візьме на себе працю щодо їх підключення до віртуального). ЛВС «малинки»), авторизує та реєструє бездротових клієнтів.

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

Магія оновленого сервісного файлу полягає в динамічній прив'язці hostapd до нової мети - інтерфейс wl0. З появою інтерфейсу - демон запускається, при зникненні - зупиняється. І це все в онлайні без перезавантаження системи. Особливо ця техніка буде корисною при підключенні до "малинки" USB Wi-Fi адаптера.

Ось тепер можна:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Шта???" © Так-так! Ніякого systemd. Жодних новомодних комбайнів (у вигляді брандмауер), які у результаті роблять одне й теж.

Використовуємо старий добрий 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 Мбіт, а мій улюблений Інтернет-провайдер пропонує мені 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

Додати коментар або відгук