Беспроводные роутеры имеют несколько неприятных особенностей. Во-первых, они небезопасны , если только не разобраться с установкой OpenWrt . Во-вторых, со временем они перестают выпускаться, а значит, если ваш роутер сломается, вам придется разбираться с установкой OpenWrt на совершенно другой роутер. В-третьих, как правило, они довольно ограничены в ресурсах, а значит возложить на роутер какие-то дополнительные функции может быть проблематично. Между тем, абсолютно любой компьютер под управлением Linux может быть настроен в качестве полноценного Wi-Fi роутера, что решает проблемы безопасности, повторяемости и производительности. Для примера, рассмотрим создание беспроводного роутера на базе одноплатного компьютера Raspberry Pi .
Подготовительные работы
Я использовал уже не новую Raspberry Pi 2 Model B под управлением Raspbian Linux 9 (Stretch). В последних версиях этого дистрибутива SSH по умолчанию выключен. Чтобы его включить, вам понадобится USB-клавиатура и монитор с HDMI. Логинимся под пользователем pi с паролем raspberry, меняем пароль, включаем SSH:
sudo systemctl enable ssh.service
sudo systemctl start ssh.service
Из сетевых интерфейсов данный одноплатник имеет только один Ethernet-разъем. Чтобы у устройства появился второй разъем, я использовал сетевую карту от компании Olimex на базе чипа AX88772B. Вы можете помнить это устройство по заметке Снифинг Ethernet-трафика с платой Throwing Star . Чтобы малина также умела и Wi-Fi, был использован донгл Panda Wireless PAU07 (a.k.a Panda N600) на базе чипа Ralink RT5572. Вообще, это довольно неплохой и популярный чип. На eBay вы найдете много других устройств на его базе. Примите во внимание, что не всякий донгл работает с Linux, а из тех, что работают, не всякий поддерживает работу в качестве точки доступа. Поэтому перед покупкой устройства будет не лишним загуглить, подходит ли оно для задачи.
Внешний вид роутера у меня получился следующим:
С точки зрения ОС картина такая:
- eth0 — встроенный Ethernet, здесь у нас будет WAN ;
- eth1 — сетевая карта на базе AX88772B будет использована для LAN ;
- wlan0 — донгл Panda Wireless PAU07, здесь будет WLAN ;
Само собой разумеется, все описанные далее шаги будут работать для любого компьютера под управлением Linux с подходящими сетевыми интерфейсами, не только Raspberry Pi. Это вполне может быть какой-то старый стационарный компьютер, нетбук, или другой одноплатник. Интересно, что существуют даже специальные одноплатники с Wi-Fi и двумя или более Ethernet-портами. Одним из таких одноплатников является Orange Pi R1. На AliExpress или eBay устройство можно купить где-то за 20$ с доставкой. Пользователь vova_ivanov из чата Hardware & Radio даже подсказал, что используемый в нем Realtek RTL8189 без проблем работает в роли точки доступа под Linux. А также предупредил, что Orange Pi R1 не умеет PoE и убивается им. В том же чате Xarlan подсказал, что больше подобных одноплатников можно найти на сайте board-db.org . В частности, довольно интересно выглядят Banana Pi BPI-R1, Banana Pi BPI-R2 и Banana Pi BPI-R64. Впрочем, эти устройства относятся уже к другому ценовому диапазону, а BPI-R64 на момент написания этих строк еще нигде не продавался.
Первоначальная настройка NAT
Открываем /etc/network/interfaces и пишем туда следующее:
iface lo inet loopback
auto eth0
# Вариант А, без смены MAC:
# iface eth0 inet dhcp
# Вариант Б, со сменой MAC:
iface eth0 inet dhcp
hwaddress ether 11:22:33:44:55:66
auto eth1
iface eth1 inet static
address 10.128.10.1
network 10.128.10.0
netmask 255.255.255.0
broadcast 10.128.10.255
auto wlan0
iface wlan0 inet static
address 10.128.11.1
network 10.128.11.0
netmask 255.255.255.0
broadcast 10.128.11.255
Вариант со сменой MAC нужен исключительно в случае, если ваш интернет-провайдер ограничивает доступ по MAC-адресам, как это зачем-то делает мой. Если ваш ISP не страдает такой фигней, смело используйте вариант А.
Поскольку мы подправили /etc/network/interfaces, демон dhcpcd теперь будет отказываться стартовать. Для порядку отключим его, чтобы система при загрузке не ругалась ошибками:
sudo systemctl disable dhcpcd
Затем говорим:
Следующим шагом ставим dnsmasq , который будет играть роль DHCP-сервера и кэширующего DNS-сервера. Если нужно, в нем также есть функция TFTP-сервера. Такой сервер, к примеру, бывает нужен для установки OpenWrt на некоторые роутеры .
Правим /etc/dnsmasq.conf:
# Это может быть особенно полезно, если вы
# хотите заворачивать весь трафик в VPN
server=8.8.8.8
server=8.8.4.4
domain-needed
bogus-priv
# Listen only given interfaces
interface=lo
interface=eth1
interface=wlan0
bind-interfaces
# DNS cache size
cache-size=15000
# IP ranges
dhcp-range=eth1,10.128.10.50,10.128.10.250
dhcp-range=wlan0,10.128.11.50,10.128.11.250
# Default gateways
dhcp-option=eth1,3,10.128.10.1
dhcp-option=wlan0,3,10.128.11.1
# DNS servers
dhcp-option=eth1,6,10.128.10.1
dhcp-option=wlan0,6,10.128.11.1
Перезапускаем демона:
sudo systemctl status dnsmasq
Проверяем работу DNS-сервера:
DHCP и DNS настроены, осталось настроить NAT. Делается это при помощи iptables :
sudo sh -c ‘echo 1 > /proc/sys/net/ipv4/ip_forward’
# for LAN
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -m conntrack
—ctstate ESTABLISHED,RELATED -j ACCEPT
# for WLAN
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlan0 -m conntrack
—ctstate ESTABLISHED,RELATED -j ACCEPT
# allow traffic between LAN and WLAN
sudo iptables -A FORWARD -i wlan0 -o eth1 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o wlan0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Подключаем ноутбук ко второму Ethernet-порту малины. Проверяем, что нам выдали IP-адрес, и что имеется доступ в интернет. Если все работает, сохраняем сделанные изменения, чтобы они не потерялись после перезагрузки.
Для этого дописываем в /etc/sysctl.conf:
Выполняем: команду:
Создаем скрипт /etc/network/if-pre-up.d/iptables:
set -e
iptables-restore < / etc / iptables.rules
exit 0
Говорим:
Перезагружаем малину:
Проверяем, что все работает и после перезагрузки.
Настройка точки доступа Wi-Fi
Устанавливаем hostapd:
Правим /etc/default/hostapd
Создаем файл /etc/hostapd/hostapd.conf:
ssid=RaspberryPi
country_code=RU
# Enable IEEE 802.11d
ieee80211d=1
# Enable IEEE 802.11n
ieee80211n=1
hw_mode=g
channel=5
# Use PSK
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=s3cre7_pa55w0rd
SSID, пароль и номер канала, естественно, указываем какие нужно.
Запускаем hostapd:
sudo systemctl start hostapd
Должна появиться точка доступа с SSID RaspberryPi
. Пробуем к ней подключиться и проверяем, что все работает. Если вдруг что-то не работает, отладочный вывод можно получить командой:
Делаем ребут:
Проверяем, что все работает и после ребута.
Заключение
Как видите, вся настройка занимает считанные минуты. Так как теперь у нас есть постоянно работающая машина под управлением Linux с выходом в интернет, почему бы заодно не воспользоваться и имеющимися на ней GPIO ? К примеру, можно выводить прогноз погоды на HD44780-совместимые ЖК-индикаторы .
Если заплатить интернет-провайдуру за внешний IP (у моего провайдера эта услуга стоит 1.5$ в месяц), помимо роутера получим еще и домашний VDS. При желании на нем можно поднять веб-сервер , почтовый сервер , или даже VNC . Можно запустить какие-то дополнительные скрипты, например feed2email.py . Только следует учитывать, что по умолчанию SSH торчит наружу. Вам может захотеться сменить используемый им порт, ограничить доступ по IP при помощи фаервола, или же слушать только eth1 и wlan0.
Также теперь можно с легкость завернуть весь трафик в OpenVPN. Для этого на малине нужно 1) указать гугловые DNS в dnsmasq.conf, 2) запустить клиент OpenVPN обычным образом в каком-нибудь screen и 3) добавить правила фаервола для интерфейса tun0 аналогично тому, как это делалось для eth0. Понятно, что последнее можно обернуть в скрипт, чтобы постоянно не вспоминать эти пять команд.