
Я не особо люблю освещать «текущие события», но правительство США на днях заявило о введении реально шокирующего запрета на импорт роутеров потребительского сегмента. Это идиотский запрет по целому ряду причин, но если он действительно начнёт работать, то навык сборки «самопального» роутера может оказаться весьма кстати.
К счастью, вы можете собрать его из практически всего, что можно хоть в какой-то степени назвать компьютером.
Лично я долгие годы использовал в качестве роутера мини-ПК под управлением Linux и даже писал о том, как собирать такие и настраивать файервол. Он был крайне стабилен, и единственной проблемой, с которой я за все эти годы столкнулся, был износ накопителя mSATA ценой в $20. И хотя обычно я пользуюсь Debian, Alpine наверняка сработает не хуже, а может и лучше, если вы с этим дистрибутивом знакомы. Самое главное, чтобы устройство работало под Linux и имело пару USB-портов. Подойдёт всё, что угодно, будь то мини-ПК, настольный, одноплатник, рэковый сервер, старый ноутбук или какое-то самодельное устройство.
Честно говоря, такое решение нельзя назвать эффективной мерой против нового закона США. Это лишь способ показать интересный «хак», который вы можете применить, чтобы выжать из своего железа больше возможностей. Плюс это доказывает, что в роутерах нет ничего особенного — в конце концов это просто компьютеры.
Выбор железа
Я лично предпочитаю специализированные мини-ПК с пассивным охлаждением.

Но, как я уже сказал, подойдёт практически всё. Устройство должно иметь два Ethernet-порта, но вполне можно обойтись и стандартным адаптером USB-Ethernet. Надёжность будет ниже, чем у штатного интерфейса, но её должно хватить. К примеру, моя кустарная поделка из подручных железок может легко обеспечивать скорость 820–850 Мбит/с по проводу и ~300 Мбит/с — по WiFi.

Конкретно в этом девайсе стоит двухъядерный Celeron 3205U с молниеносной! частотой 1,5 ГГц. И даже этот дряблый чип способен лихо маршрутизировать трафик по целому дому или небольшой компании.
Но вернёмся ещё дальше в прошлое. Вот мой сетап, собранный в начале осеннего учебного семестра 2016 года:

По фото сложно понять, что тут к чему, поэтому поясню:
ThinkPad T60 — забрал из списанных со своей прежней работы.
Мост между ExpressCard в отсеке расширения ноутбука и внешним интерфейсом PCIe.
Небрэндовая сетевая карта в слоте PCIe (тоже из хлама), без монтажной пластины.
Древний коммутатор Cisco 2960 на 100 Мбит — купил за $10 у коллеги.
Роутер D-Link, выступающий в качестве точки доступа (куплен «как есть» с проблемным WAN-портом в магазине б/у товаров).
Вот это роутер так роутер! С виду похож на кучу хлама. Собственно, оно так и есть. Но этот хлам прекрасно справлялся с возложенной на него задачей!
Конфигурация
После настройки система будет выглядеть как-то так:
Interface | Network |
eth0 | WAN |
eth1 | LAN (Wired) |
wlan0 | LAN (Wireless) |
Оба LAN-интерфейса будут соединены мостом, то есть устройства в проводной и беспроводной сетях смогут нормально взаимодействовать. Если одного LAN-порта недостаточно, можете подключить сколько угодно USB-адаптеров и связать их. Скорость будет меньше, чем у «реального» коммутатора, но если вас интересует быстродействие, то здесь вы не по адресу.
Как я уже писал, в качестве ОС будет использоваться Debian с минимумом дополнительного ПО:
Все проприетарные прошивки, не включённые в базовый дистрибутив.
hostapd— для создания WiFi-сети.dnsmasq — для настройки DNS и DHCP.bridge-utils— для совмещения портов в общую сеть.
Также должен сказать, что настрою только IPv4. IPv6 прекрасно работает на чём-нибудь вроде мобильных устройств, но внутри LAN мне этим протоколом пользоваться не нравится. Возможно, мой мозг уже слишком закостенел, но пока меня вполне устраивает и IPv4.
Установка и настройка
В целом это довольно стандартный процесс установки Debian. Отмечу несколько деталей:
Отключите PXE-загрузку в BIOS/UEFI.
Если можете, установите минимальную частоту процессора, но для USB- и PCI-устройств энергосбережение отключите.
Найдите и включите опцию «Восстановление после сбоя питания».
Некоторые устройства не будут должным образом стартовать без подключённого дисплея. Если это ваш случай, воткните в HDMI-порт обманку.
Многие устройства будут корректно работать только при включении репозитория
non-free-firmware.
В зависимости от вашего беспроводного оборудования, может потребоваться установить дополнительный пакет прошивки.
Для устройств Intel:
sudo apt install firmware-iwlwifi
Для устройств Realtek:
sudo apt install firmware-ath9k-htc
Если же у вас что-то совсем древнее, как у меня:
sudo apt install firmware-atheros
Установка необходимых пакетов
После всего этого нужно установить ряд дополнительных утилит:
sudo apt install bridge-utils hostapd dnsmasq
В плане ПО этого будет достаточно. Всего в системе должно получиться около 250 пакетов.
Правильное именование интерфейсов
В современных системах Linux сетевые интерфейсы именуются на основе физического подключения и типа драйвера, например, enp0s31f6. Но я предпочитаю использовать старый формат ethX, чтобы каждый интерфейс получал постоянное имя.
Создайте для каждого интерфейса файл /etc/systemd/network/10-persistent-ethX.link:
[Match] MACAddress=AA:BB:CC:DD:00:11 [Link] Name=ethX
Создание беспроводной сети
Для этого используется USB WiFi-адаптер, который выступает в роли точки доступа, создавая сеть для подключения других устройств. По качеству работы он, конечно, будет уступать специализированному устройству, но всё же лучше, чем ничего. Мне с его помощью удалось получить достаточно неплохие результаты, но я живу в небольшом доме и редко нахожусь дальше 10 метров от роутера. Если для вас очень важна стабильность и мощность беспроводной связи, постарайтесь найти на роль точки доступа соответствующее устройство. Вполне должен сгодиться и старый роутер, даже десятилетней давности. Нужно будет просто подключиться к его LAN-порту (не WAN!).
Для настройки WiFi-сети через встроенное устройство создайте файл конфигурации по адресу /etc/hostapd/hostapd.conf:
interface=wlan0 bridge=br0 hw_mode=g channel=11 ieee80211d=1 country_code=US ieee80211n=1 wmm_enabled=1 ssid=My Cool and Creative Wi-Fi Name auth_algs=1 wpa=2 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP wpa_passphrase=mysecurepassword
По умолчанию служба hostapd маскирована, так что для включения её нужно размаскировать.
sudo systemctl unmask hostapd sudo systemctl enable --now hostapd
Настройка интерфейсов
Интерфейсом «внешнего» подключения будет WAN, а «внутреннего» — LAN. Имейте в виду, что для LAN-интерфейса шлюз по умолчанию не назначается.
/etc/network/interfaces
allow-hotplug eth0 allow-hotplug eth1 auto wlan0 auto br0 iface eth0 inet dhcp iface br0 inet static bridge_ports eth1 wlan0 address 192.168.1.1/24
После этого этапа устройство должно выполнить быструю перезагрузку и корректно вернуться к работе. Если что-то не заработает, проверьте наличие ошибок командой journalctl -e -u networking.service.
Если всё сработало как положено, $ sudo brctl show br0 выдаст следующее:
bridge name bridge id STP enabled interfaces br0 8000.xxxxx no eth1 wlan0
IP Forwarding
Для включения этой функции создайте /etc/sysctl.d/10-forward.conf и добавьте туда следующую строку:
net.ipv4.ip_forward=1
Примените изменения:
sudo systemctl restart systemd-sysctl.service
Правила файервола
В Linux правила файервола и конфигурация NAT обрабатываются новой системой netfilter. Мы делаем это с помощью nftables.
/etc/nftables.conf
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; policy drop; ct state { established,related } counter accept ip protocol icmp counter accept iifname "br0" tcp dport { 22, 53 } counter accept iifname "br0" udp dport { 53, 67, 68 } counter accept counter } chain forward { type filter hook forward priority 0; policy drop; iifname "eth0" oifname "br0" ct state { established,related } counter accept iifname "br0" oifname "eth0" ct state { new,established,related } counter accept counter } chain output { type filter hook output priority 0; policy accept; counter } } table ip nat { chain postrouting { type nat hook postrouting priority 100; policy accept; oifname "eth0" counter masquerade } }
Этот конфигурационный файл реализует NAT, запрещает весь входящий трафик извне сети и позволяет роутеру выступать в роли DNS-, DHCP- и SSH-сервера (для управления). Довольно стандартный конфиг файервола.
Для следующей загрузки включите автоматический запуск nftables:
sudo systemctl enable nftables.service
DHCP и DNS
В отличие от прошлых устройств, здесь вместо isc-dhcp-server и bind9 используется dnsmasq. Он меньше, проще в настройке и для небольших девайсов работает не хуже. Файл его конфигурации до смешного прост.
/etc/dnsmasq.conf
interface=br0 listen-address=0.0.0.0 dhcp-range=192.168.1.50,192.168.1.250,255.255.255.0,6h dhcp-option=option:router,192.168.1.1 dhcp-option=option:dns-server,192.168.1.1 cache-size=10000
Включите эту службу для следующей загрузки.
sudo systemctl enable dnsmasq
Бонус: последовательный порт
Если ваш девайс имеет на борту последовательный или консольный порт, будет очень удобно управлять роутером без необходимости подцеплять отдельный монитор и клавиатуру. Это повсеместно практикуется в корпоративной среде, но и домашние устройства вполне заслуживают такую возможность.
Измените /etc/default/grub:
GRUB_CMDLINE_LINUX='console=tty0 console=ttyS0,115200n8' GRUB_TERMINAL=serial GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
Теперь включите запуск службы Getty на этом порту:
sudo systemctl enable serial-getty@ttyS0.service
Теперь обновим конфигурацию загрузчика grub и перезапустим девайс.
sudo update-grub
Проверка
Закончив всю эту настройку, пару раз перезапустите устройство и убедитесь в работоспособности всех служб. Проверить работу файервола можно командой $ sudo nft list ruleset:
table inet filter { chain input { type filter hook input priority filter; policy drop; ct state { established, related } counter packets 1546 bytes 138508 accept ip protocol icmp counter packets 1 bytes 84 accept iifname "br0" tcp dport { 22, 53 } counter packets 4 bytes 240 accept iifname "br0" udp dport { 53, 67, 68 } counter packets 92 bytes 6658 accept counter packets 2110 bytes 128536 } chain forward { type filter hook forward priority filter; policy drop; iifname "eth0" oifname "br0" ct state { established, related } counter packets 52964 bytes 479878687 accept iifname "br0" oifname "eth0" ct state { established, related, new } counter packets 78017 bytes 54802223 accept counter packets 0 bytes 0 } chain output { type filter hook output priority filter; policy accept; counter packets 1650 bytes 155966 } } table ip nat { chain postrouting { type nat hook postrouting priority srcnat; policy accept; oifname "eth0" counter packets 101 bytes 15882 masquerade } }
Прежде чем менять что-либо в настройках файервола, проверьте его файл конфигурации:
sudo nft -c -f /etc/nftables.conf
Преимуществом nftables перед iptables является возможность перезагружать службу при обновлении набора правил, не разрывая соединения.
sudo systemctl reload nftables.service
Для проверки DHCP-сервера загляните в его журнал и lease-файл:
sudo less /var/lib/misc/dnsmasq.leases sudo journalctl -eu dnsmasq.service
Дополнительные возможности
На этом этапе устройство должно прекрасно работать. Если хотите, есть ещё несколько фишек, которые можно настроить, либо добавить в виде пакетов:
Логирование срабатываний конкретных правил или создание журнала потоков.
VLAN и сегментация.
IPv6.
Переадресация входящего трафика на устройство в DMZ сети.
Удалённый доступ и межсетевое туннелирование через VPN.
Протоколы динамической маршрутизации, IGP, BGP и так далее.
Красота такого решения в его простоте и надёжности. И хотя может возникнуть соблазн установить всяческое ПО прямо на роутер, я так делать не советую. Лучше перенаправлять трафик на устройство в DMZ или VLAN.
Так что в маршрутизатор можно превратить практически всё, что угодно. Попробуйте и вы. Покопайтесь в залежах старого железа — там наверняка найдётся что-то рабочее, из чего вы сможете собрать собственный роутер на свободном ПО.

