Маршрутизатор на стероидах из старого ноутбука

Благодаря открытой ОС Linux что угодно можно превратить в маршрутизатор: старый ноутбук, мини-ПК, ненужный десктоп, который собрались выкинуть. Вносим небольшие изменения в конфигурацию сети — и старый девайс получит новую функциональность:
Полгода назад мы публиковали перевод на эту тему. Американский разработчик оказался настолько шокирован запретом правительства на импорт роутеров потребительского сегмента, что решил самостоятельно собрать аналогичное устройство. Как он выразился, собрать роутер можно из чего угодно, что хоть отдалённо называется компьютером.
Маршрутизатор из любого устройства
Некоторым людям кажется, что маршрутизатор и компьютер — это разные вещи. Наверное, потому что опыт работы с командной строкой на сетевом оборудовании отличается от опыта работы на ПК. Но на самом деле разницы практически нет, просто на ПК мы обычно работаем с файлами и папками, а в маршрутизаторе — с процессами. Команды и цели взаимодействия сильно отличаются.
Но в принципе это стандартный Linux-компьютер и там, и там. Можно сделать роутер из старого мини-ПК...

...или ноутбука:

Нужное железо (тоже старое) можно докупить на барахолке за копейки, при этом функциональность самодельного Linux-маршрутизатора с программной точки зрения будет как у самого навороченного роутера. Его можно программировать как угодно и устанавливать любой софт: торрент-клиент, медиасервер для раздачи фильмов по сети и др.
Это маршрутизатор «на стероидах» с функциональностью домашнего мини-сервера. При этом он ещё блокирует рекламные домены, телеметрию и прочий мусор.
Маршрутизатор из ноутбука
Предположим, у нас в наличии старый ноутбук под Debian 13. Как сделать из него умный маршрутизатор с блокировкой рекламы и другими интеллектуальными функциями?

Конечно, Debian 13 позволяет запустить точку доступа без всяких ручных настроек, как и почти любой смартфон. Но нас интересует не эта ограниченная функциональность, а полнофункциональный маршрутизатор, к которому можно подключиться по Ethernet и который может обрабатывать пакеты. Для этого нужно настраивать Linux вручную.
С программной точки зрения любое Linux-устройство можно сделать частью сетевой инфраструктуры, если настроить ядро для пропуска сетевого трафика. Требуется всего семь изменений в конфигурации.
Некоторые из изменений также описаны в вышеупомянутой статье «Как превратить в маршрутизатор что угодно» и в других статьях на Хабре (раз, два, три).
1. Включить IP-форвардинг (ip_forward=1)
Чтобы активировать обработку и пересылку пакетов в ядре Linux, начинаем с сетевых функций в ядре. В каждом Android-устройстве с функцией точки доступа сделаны те же изменения.
Путешествие пакета начинается с внешнего интерфейса. Сетевая карта (NIC) сигнализирует о прерывании, драйвер извлекает фрейм в кольцевой буфер памяти через DMA, где аппаратное обеспечение записывает данные в RAM без участия CPU. Сетевой стек ядра забирает оттуда пакет, удаляет заголовок Ethernet и проверяет IP-адрес назначения.
В этот момент ядро обращается к своей таблице маршрутизации. Если адрес назначения совпадает с одним из интерфейсов машины, пакет поднимается по сетевому стеку к процессу, ожидающему его обработки. Если адрес назначения не соответствует ни одному локальному интерфейсу и IP-маршрутизация отключена, ядро сбрасывает пакет и увеличивает счётчик в /proc/net/snmp.
Если мы хотим включить маршрутизацию, то нужно внести изменения в систему, чтобы ядро могло передать пакет на другой хост.
Настройки IP-форвардинга находятся в файле /etc/sysctl.d/10-forward.conf. Вносим туда одно изменение:
# /etc/sysctl.d/10-forward.conf
net.ipv4.ip_forward=1
Чтобы применить настройку без перезагрузки, выполняем команду sudo sysctl --system.
/etc/sysctl.d/ — конфигурация параметров ядра в рантайме. Во время загрузки системы systemd-sysctl.service читает все conf-файлы отсюда (плюс /etc/sysctl.conf) и записывает все параметры в соответствующие пути /proc/sys/.
Точечная нотация в коде выше — это просто перевод пути, то есть net.ipv4.ip_forward соответствует /proc/sys/net/ipv4/ip_forward. Запись 1 сообщает стеку IPv4 не отбрасывать пакеты с нелокальными адресами, а отправлять их через хук FORWARD.
Запись 1 в sysctl.d/10-forward.conf делает это изменение постоянным при каждой перезагрузке. Значение можно проверить в любой момент:
cat /proc/sys/net/ipv4/ip_forward
2. Прописать мост. Объединяем два интерфейса в один сегмент
Домашняя сеть обслуживает проводных и беспроводных клиентов в одной подсети. Конфигурация создаёт сетевой мост br0 и подключает к нему eth1 (второй порт с переходника USB-Ethernet) и wlan0 в качестве портов-участников. В нашей конструкции будет WAN (встроенный Ethernet, eth0), LAN (мост br0 из USB-Ethernet, eth1) и Wi-Fi (wlan0). Для более подробной информации см. документацию по мостам в ядре Linux.
Это важно для маршрутизации, потому что ядро назначает IP-адреса интерфейсам, а не физическим портам. Если интерфейсу br0 назначили адрес 192.168.0.1, то у маршрутизатора единственный адрес LAN, независимо от того, подключён клиент проводным или беспроводным способом. Оба интерфейса передают трафик в одной подсети и общаются на уровне 2 без необходимости маршрутизации между ними.
В десктопном Debian лучше использовать консольную утилиту nmcli (NetworkManager), см. неофициальную инструкцию.

Например, следующая команда создаёт мост br0:
sudo nmcli con add ifname br0 type bridge con-name br0
Потом можно назначить мосту IP-адрес:
sudo nmcli con modify br0 ipv4.method manual ipv4.addresses 192.168.0.1/24После создания моста нужно добавить в него интерфейсы (например, второй проводной порт eth1). Примерно таким образом:
# Добавляем проводной порт локальной сети в мост
sudo nmcli con add type bridge-slave ifname eth1 master br0 con-name br0-eth1
# Поднимаем мост
sudo nmcli con up br0Для более удобной настройки есть смысл использовать утилиту NetworkManager (nmtui) с визуальным текстовым интерфейсом:
sudo apt-get install network-manager
sudo nmtui
В дальнейшем мы будем управлять wlan0 через hostapd, так что Wi-Fi попадёт в мост потом через параметр bridge=br0 в hostapd.conf.
Чтобы NetworkManager не перехватывал Wi-Fi-интерфейс у hostapd, отключаем его управление:
sudo nmcli device set wlan0 managed no3. Активация политик nftables: установка хуков
Теперь нужно определить правила обработки пакетов nftables в Netfilter.
Netfilter — это общая система фильтрации пакетов на уровне ядра, которая предоставляет точки подключения к сетевому стеку, а nftables (через nf_tables) — современный движок классификации пакетов, работающий поверх этих точек подключения. Он заменил iptables в качестве предпочтительного интерфейса.
Установка nftables:
sudo apt install nftables
sudo systemctl enable --now nftablesПравила файрвола и NAT прописываются в /etc/nftables.conf. Вот фрагмент цепочки forward внутри table:
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
}В этой настройке точки доступа br0 — мост для локальной сети, который агрегирует трафик от проводных клиентов и беспроводных клиентов, управляемых hostapd. Два правила в цепочке FORWARD напрямую соответствуют двум направлениям потока трафика через маршрутизатор. Правило 1: от WAN к LAN (обратный и связанный трафик) и правило 2: от LAN к WAN (исходящий трафик). Это позволяет клиентам LAN свободно устанавливать соединения с интернетом, но из интернета невозможно инициировать соединения внутрь сети — классическая схема.
В конце стоит счётчик для остальных пакетов, которые не соответствуют ни одному из вышеуказанных правил (и, следовательно, будут отброшены). Полезно для мониторинга.
Более подробно о настройках Netfilter читайте здесь.
4. Подсистема conntrack
Правила ct state { established, related } и ct state { new, established, related } выше ссылаются на conntrack, подсистему отслеживания соединений ядра.
Устанавливаем программу conntrack для диагностики:
sudo apt-get install conntrack
Conntrack отслеживает трафик, проходящий через Netfilter, и ведёт таблицу активных потоков.
5. Политики NAT и Masquerade
Теперь нужно определить правила, изменяющие адреса отправителя в пакетах на хосте.
В домашних сетях используется частное адресное пространство в диапазонах 10.0.0.0/8, 172.16.0.0/12 и 192.168.0.0/16. В публичном интернете нет маршрутов ни к одному из этих диапазонов. В каждом пакете из локальной сети нужно заменить исходный адрес на публичный IP-адрес маршрутизатора, иначе хост никогда не получит ответы из интернета.
Эту функцию выполняет цепочка postrouting на хуке POSTROUTING:
chain postrouting { type nat hook postrouting priority 100; policy accept; oifname "eth0" counter masquerade
}Все кортежи (tuple), то есть сочетания «частный IP, частный порт, публичный IP, публичный порт, протокол» хранятся в таблице conntrack на протяжении всего времени соединения, их можно просмотреть напрямую:
sudo conntrack -L
Старые потоки устаревают, и conntrack удаляет их записи, что является ключевым механизмом для предотвращения неограниченного роста таблицы NAT. Соединения TCP истекают после закрытия сессии или после настраиваемого периода бездействия. Для UDP действуют более короткие таймеры.
6. DHCP и DNS
Каждое устройство в локальной сети должно знать свой IP-адрес, маску подсети, шлюз в интернет и адрес DNS-сервера. Инструмент Dnsmasq создан для домашних сетей и небольших клиентов — как раз наш случай. Он широко используется на смартфонах и точках доступа, а также для поддержки виртуальных сетей. Dnsmasq включён в большинство дистрибутивов Linux, а также встроен в NetworkManager, который мы использовали ранее.
NetworkManager выполняет функции DHCP-сервера и DNS. Он запускает собственный экземпляр dnsmasq и динамически управляет конфигурацией по мере подключения и отключения интерфейсов.

7. Демон hostapd для раздачи Wi-Fi
Демон hostapd нужен для работы точек доступа и аутентификации. В Debian 13 он бывает замаскирован (masked), то есть systemd регистрирует службу, но блокирует её запуск, чтобы предотвратить запуск неконфигурированной открытой сети.
Ограничение снимается командой systemctl unmask hostapd. Если пакета нет в системе, его нужно установить, а потом разблокировать:
sudo apt install hostapd
sudo systemctl unmask hostapd
Перед запуском нужно проверить, что в файле /etc/hostapd/hostapd.conf заданы корректные настройки (интерфейс, SSID, пароль и параметр bridge=br0).
Затем команда sudo systemctl enable --now hostapd запускает демон и регистрирует его для будущих загрузок:

Блокировка рекламы через Pi-hole
Для блокировки рекламы, трекеров и телеметрии на самодельном Linux-маршрутизаторе применяется DNS-фильтрация (DNS Sinkhole). Вместо Dnsmasq можно развернуть полноценный Pi-hole (или AdGuard Home) в Docker-контейнере или настроить блокировку напрямую через уже запущенный Dnsmasq.
Pi-hole предоставляет удобный веб-интерфейс, графики, гибкие белые/чёрные списки и автоматически обновляемые базы рекламных доменов. Инструкция по установке здесь.
Запуск скрипта для установки:
curl -sSL https://install.pi-hole.net | bashСкрипт запускает автоматический инсталлятор:

По окончании работы инсталлятора генерируется пароль для админки:

Панель администратора сразу доступна на http://192.168.0.112:80/admin:

По окончании установки нужно будет настроить dnsmasq как клиент Pi-hole или отключить его и использовать Pi-hole как единственный DNS.
Итого
Итогом всех этих изменений является работающий x86-маршрутизатор на базе ноутбука с блокировкой рекламы. Как мы уже упоминали, ноутбук ещё удобно использовать как домашний мини-сервер для скачивания торрентов, раздачи контента по сети, веб-хостинга и др. Маршрутизатор ведь работает 24/7 и всегда в онлайне. Только нужно продумать вопросы безопасности и изоляции сервисов, а ещё как защитить батарею ноутбука (через настройки энергопитания), чтобы она не вздулась от постоянной работы.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.