Я не особо люблю освещать «текущие события», но правительство США на днях заявило о введении реально шокирующего запрета на импорт роутеров потребительского сегмента. Это идиотский запрет по целому ряду причин, но если он действительно начнёт работать, то навык сборки «самопального» роутера может оказаться весьма кстати.

К счастью, вы можете собрать его из практически всего, что можно хоть в какой-то степени назвать компьютером.

Лично я долгие годы использовал в качестве роутера мини-ПК под управлением Linux и даже писал о том, как собирать такие и настраивать файервол. Он был крайне стабилен, и единственной проблемой, с которой я за все эти годы столкнулся, был износ накопителя mSATA ценой в $20. И хотя обычно я пользуюсь DebianAlpine наверняка сработает не хуже, а может и лучше, если вы с этим дистрибутивом знакомы. Самое главное, чтобы устройство работало под Linux и имело пару USB-портов. Подойдёт всё, что угодно, будь то мини-ПК, настольный, одноплатник, рэковый сервер, старый ноутбук или какое-то самодельное устройство.

Честно говоря, такое решение нельзя назвать эффективной мерой против нового закона США. Это лишь способ показать интересный «хак», который вы можете применить, чтобы выжать из своего железа больше возможностей. Плюс это доказывает, что в роутерах нет ничего особенного — в конце концов это просто компьютеры.

Выбор железа

Я лично предпочитаю специализированные мини-ПК с пассивным охлаждением.

proper router
Подобающий роутер

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

 

crappy router
Отстойный роутер

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

Но вернёмся ещё дальше в прошлое. Вот мой сетап, собранный в начале осеннего учебного семестра 2016 года:

trash router
Трэшовый роутер

По фото сложно понять, что тут к чему, поэтому поясню:

  • 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

Дополнительные возможности

На этом этапе устройство должно прекрасно работать. Если хотите, есть ещё несколько фишек, которые можно настроить, либо добавить в виде пакетов:

Красота такого решения в его простоте и надёжности. И хотя может возникнуть соблазн установить всяческое ПО прямо на роутер, я так делать не советую. Лучше перенаправлять трафик на устройство в DMZ или VLAN.

Так что в маршрутизатор можно превратить практически всё, что угодно. Попробуйте и вы. Покопайтесь в залежах старого железа — там наверняка найдётся что-то рабочее, из чего вы сможете собрать собственный роутер на свободном ПО.