Приветствую всех читателей Хабра. В этой статье я расскажу как сделать маршрутизатор из компьютера на Linux. На самом деле, сделать такой роутер несложно. Для реализации этого проекта подойдет любое устройство на Debian/Ubuntu Server, имеющее парочку сетевых карт и возможность раздавать Wi‑Fi. Важно учесть, использует ли ваш провайдер PPPoE, так как статья не описывает настройку девайса для работы с этим протоколом. Для чего нужен x86 роутер? У него есть плюс: он может стать полноценным домашним сервером, ведь вы можете запускать другие сервисы на нем, а маршрутизация становится еще одной задачей для относительно мощного x86 железа.

Немного о сервере

За основу роутера я взял древний ПК. Он очень слаб для повседневных задач, так как в нем нет даже дискретной видеокарты, а два ядра 45 нм 2009 года плохо справляются даже с современными браузерами. Представляю вашему вниманию характеристики этого «монстра»:

  • AMD Athlon II X2 250

  • 8 гб DDR3 2 канала

  • ASRock 760GM‑GS3

  • SSD SATA 128 гб

  • HDD 500 гб

Хоть он и слаб для повседневных задач, но он мощнее любого домашнего роутера. Однако в таком виде он не заменит домашний маршрутизатор. Ему не хватает как минимум второй сетевой карты и точки доступа Wi‑Fi, поэтому я докупил на маркетплейсах:

  • Сетевую карту на чипе Intel I210

  • Роутер Huawei AX1 Lite

Для WAN я взял сетевую карту на чипе Intel I210, ee можно найти по цене менее 1200 рублей. Для Linux она подходит отлично, драйвер в ядре стабильный, заводится из коробки в любом дистрибутиве. Роутер Huawei AX1 Lite за 800 рублей будет переведен в режим моста, то есть станет точкой доступа WI‑Fi и коммутатором. Конечно, раздавать Wi‑Fi и подключаться по проводу к серверу можно и другими способами, но данный вариант простой и бюджетный, две железки обошлись мне менее чем в 2000 ₽ Теперь, сервер может становиться полноценным роутером, осталось только настроить.

Точка доступа

Здесь нет ничего сложного. Нужно лишь подключиться к локальной сети, зайти в настройки роутера, задать имя сети и пароль (для новых роутеров), выставить свои настройки Wi‑Fi и выбрать «Режим моста» или «Точка доступа» (зависит от производителя, название может отличаться). Также, необходимо отключить DHCP, ведь IP адресами займется x86 роутер.

Подготовка ОС

Запускаем сервер. Заходим под пользователем root (чтобы не писать sudo каждый раз). Обновляем пакеты:

apt update && apt upgrade

Теперь, установим нужные пакеты. Это утилита для управления файрволом nftables (сама подсистема вшита в ядро) и DHCP сервер dnsmasq:

apt install nftables dnsmasq

Необходимо включить форвардинг в ядре Linux. Этим, мы разрешаем системе заниматься маршрутизацией. Для этого, записываем в файл:

echo "net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.d/99-routing.conf
sysctl --system

Нужно узнать имена наших интерфейсов. Для WAN я буду использовать Intel I210, для LAN встроенный в плату Realtek. Самый простой способ узнать названия сетевых карт, ввести:

watch -n 1 "ip -br a"

Теперь можно подключить что‑нибудь к одной из сетевых карт (WAN/LAN или другой ПК) и смотреть, какой сетевой карте присвоен интерфейс. У меня enp2s0 это I210 (для WAN), а enp3s0 — Realtek материнской платы (для LAN).

Настройка /etc/network/interfaces

В /etc/network/interfaces необходимо добавить:

# enp3s0 замените на ваш LAN интерфейс
auto enp3s0
# Задаем статический IP для LAN
iface enp3s0 inet static
	address 192.168.1.1
	netmask 255.255.255.0
# enp2s0 замените на ваш WAN
auto enp2s0
# Позволяем провайдеру выдать IP WAN интерфейсу 
iface enp2s0 inet dhcp

Применяем изменения на лету:

systemctl restart networking.service

NFTables

В NFTables необходимо добавить NAT (подмену IP адресов, необходимо для выхода в Интернет). Здесь все просто: тип inet для всего трафика, тип цепочки nat, хук postrouting (после маршрутизации, непосредственно перед отправкой пакета), приоритет 0 (priority filter), имя интерфейса и маскарадинг. Вот так выглядит рабочий конфиг:

table inet Router {
	chain NAT {
		type nat hook postrouting priority filter; policy accept;
		oifname "enp2s0" masquerade # Замените enp2s0 на ваш WAN интерфейс
	}
}

Конфиг нужно вставить в /etc/nftables.conf. Также, NFTables нужно добавить в автозагрузку:

systemctl enable --now nftables.service

Dnsmasq

Чтобы маршрутизатор мог раздавать IP адреса в локальной сети, необходимо поднять DHCP сервер. Вот мой конфигурационный файл:

interface=enp3s0 # Замените на ваш LAN интерфейс
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,12h # Диапозон IP от 50 до 150, маска /24, аренда
dhcp-option=3,192.168.1.1 # Шлюз
dhcp-option=6,192.168.1.1 # DNS сервер локальной сети 
# DNS серверы для самого роутера
server=1.1.1.1
server=8.8.8.8
# Кэш
cache-size=1000

Добавляем DHCP‑DNS сервер в автозагрузку:

systemctl enable --now dnsmasq

Заключение

Роутер полностью настроен. Можно подключаться к сети, заданной в настройках точки доступа (в моем случае Huawei AX1 Lite). Вы можете поднять SSH, настроить Zapret или B4 для обхода блокировок, файловое хранилище, блокировщик рекламы и многое другое. Всем удачи!

Комментарии (48)


  1. Lev3250
    26.07.2026 10:10

    Нет, я сам немного ненормальный и у меня роутером служит opnsense в виртуалке, но всё таки - зачем? Что такого по итогу решил этот ноут в виде роутера, чего не мог сделать тот хуавей, что стал точкой доступа?


    1. MPfromLINUX Автор
      26.07.2026 10:10

      Если настроить, может обходить блокировки, блокать рекламу. Пока что только Filebrwoser в докер контейнере поднял. Вообщем, нужно еще многое настраивать, делать комбайн из него, тогда будет смысл. Это просто основа.


      1. Esmertec
        26.07.2026 10:10

        проще было установить на него openwrt + zapret + samba имхо


        1. kriostar
          26.07.2026 10:10

          Микротик на минипс х86, отлично работает.


  1. gionet
    26.07.2026 10:10

    Мало .. мало! Надо еще прикрутить всякие штуки для обхода DPI , блокировки рекламы и пр. Раз уж вы накатили линуксы, так уж используйте по полной преимущества


  1. cheshircat
    26.07.2026 10:10

    Статья какая-то поверхностная.

    Основная проблема старого железа - энергопотребление. Сколько этот роутер съест киловатт-часов в простое?

    Второй момент скорость маршрутизации. Не увидел тестов. Для 100Mbps нормально, но сможет ли он вытянуть 500Mbps, 1Gbps?


    1. JBFW
      26.07.2026 10:10

      А интернет канал у автора вытянет 500, 1G?

      Это просто к тому, что далеко не везде есть необходимость в гигабитных сетевых портах. Толку-то от гигабита, если там какой-нибудь gsm-модем или оптика на 50/100 Мбит...


      1. DennisP
        26.07.2026 10:10

        Локальный nas никто не отменял. Который в общем-то и напрашивается реализовать силами самого "роутера"


    1. MPfromLINUX Автор
      26.07.2026 10:10

      Сколько ест в ватт-часах замерить достаточно тяжело, в простое 40 вт-ч навскидку. Гигабит вытягивает, Realtek на плате гигабитный, I210 тоже, cat 5e 8 жил. Процессорной мощности для маршрутизации полностью хватает.


    1. Domestomag
      26.07.2026 10:10

      Нат для гигабита он потянет не напрягаясь, скорее всего даже через опенвпн сможет гигабит прокачивать.


      1. korn3r
        26.07.2026 10:10

        у проца aes-ni нету, откуда там гигабит на OpenVPN?


        1. Domestomag
          26.07.2026 10:10

          Брутфорс Ж) Core2Duo E7500 с ddr2 шифрует aes256 со скоростью 150мбайт/с а chacha20-poly1305 все 500.


          1. korn3r
            26.07.2026 10:10

            ну да.... на мегагерцах. и это скорее всего замеры самим openssl чисто по шифрованию. в реальности (на фактическом openvpn соединении) это будет мегабит 100 + забитый под 100% проц.


            1. VenbergV
              26.07.2026 10:10

              Попробуйте версии 2.7+. И ядро Linux 6.16. Там DCO вошло в ядро.


              1. korn3r
                26.07.2026 10:10

                а толку? гигабита на openvpn у вас все равно не будет. скорее всего даже если там i7 с aes-ni

                и как бы он там усердно не оффлоадил, основной пожиратель проца это шифрование. кто бы его ни делал - юзерспейс или ядро - на таком проце это делается программно.


                1. VenbergV
                  26.07.2026 10:10

                  1) Вот в железном варианте. Там и гигабит и 2.5 гигабита, на выбор.
                  2) Все же попробуйте DCO. Скорость должна подрасти.


                  1. korn3r
                    26.07.2026 10:10

                    вы похоже вообще не поняли о чем был разговор.


    1. Vladekk
      26.07.2026 10:10

      А почему не вытянет?

      У меня в качестве сервера помощнее ноут, правда, но вполне тянет 700-800 мегабит. Это вроде бы близко к теоретической пропускной. Процессор при этом занят на несколько процентов только. Да и то, подозреваю, из-за сетевых дисков.

      Раздумваю, стоит ли объединить роутер с сервером, чтоб сервак был ближе к интернету, но для этого придется купить usb3 сетевуху.

      А вообще, автор поднял воспоминания, как у меня в общаге был инет 30 килобайт в секунду и роутер на основе пентиума 120 мегагерц. Стоял там мандрейк с shorewall, работал отлично.


  1. alexs963
    26.07.2026 10:10

    Для dhcp можно использовать встроенный в systemd:

    # cat 21-home-lan.network
    [Match]
    Name=enp5s0
    
    [Network]
    Address=192.168.0.1/24
    Gateway=192.168.0.1
    DHCPServer=true
    
    [DHCPServer]
    DefaultLeaseTimeSec=259200
    MaxLeaseTimeSec=604800
    PoolOffset=0
    PoolSize=0
    EmitDNS=yes
    DNS=192.168.0.1
    #DNS=8.8.8.8
    EmitNTP=yes
    NTP=192.168.0.1
    EmitRouter=yes
    
    [DHCPv4]
    ClientIdentifier=mac
    
    [DHCPServerStaticLease]
    MACAddress=xx:xx:xx:xx:xx:xx
    Address=192.168.0.200
    


    1. MPfromLINUX Автор
      26.07.2026 10:10

      Спасибо за конфиг, попробую использовать его в своей системе


    1. 4chemist
      26.07.2026 10:10

      Универсальность systemd одновременно радует и пугает. Параллельный запуск, конфигурация сети, синхронизация времени, ресолвинг имён, логирование, управление контейнерами, планировщик задач...

      Жду когда в systemd реализуют wpa_supplicant чтобы секрет для авторизации в WiFi сетях тоже в конфигурации systemd прописывались. Корневой раздел с линуксом у моего отчуждаемого хранилища с жесткими дисками лежит на флешке самсунг фит. Эта флешка переехала уже три раза на другое железо. При переезде поднимается все, кроме автоматического подключения к WiFi. Хочется убрать костыль через переименование сетевого контроллера WiFi правилами udev.


  1. alexs89
    26.07.2026 10:10

    Круто, но почему не OpenWRT в качестве ОС? Минималистичная система, супер удобная веб морда, гигантский репозиторий софта специально под роутеры, поддержка докера и другие радости Linux.


    1. MPfromLINUX Автор
      26.07.2026 10:10

      Просто, x86 роутер это полноценный домашний сервер. OpenWRT лучше для роутеров, но Debian позволяет без проблем делать сервер на x86 железе. Репозиторий у OpenWRT хороший, но узконаправленный, заточенный для обычных роутреров. А из этого можно сделать домашний комбайн.


      1. DennisP
        26.07.2026 10:10

        Какие функции вы планируете (хотели бы) реализовать в этом комбайне? На первый взгляд многие интересные функции (типа сервера видеонаблюдения с хоть какой-то детекций или immich) просто не потянут на этом железе


        1. MPfromLINUX Автор
          26.07.2026 10:10

          Думаю торрент качалку сделать, а декодирование видео свалю на тв бокс Vontar X3. AdGuard и что-нибудь для обхода блокировок поставлю, Filebrowser уже стоит.


          1. korn3r
            26.07.2026 10:10

            интересно какая загрузка проца будет с торрентами и запретом на таком старичке.


            1. Domestomag
              26.07.2026 10:10

              Околонулевая. Должна быть. Торренты во времена компов 2ядра-2гига процессор не напрягали.


              1. korn3r
                26.07.2026 10:10

                это клиента они не напрягали. роутер положить несколькими десятками тысяч соединений вполне себе можно было.


                1. DennisP
                  26.07.2026 10:10

                  это да, помню приходилось ограничивать количество соединений торрент клиента на уровне в несколько сотен, иначе инет начинал безбожно тормозить


            1. Vladekk
              26.07.2026 10:10

              Я в общаге качал торренты под линуксом на хдд 5200 и 120 МГц пентиуме. Тормозило порядочно, особенно при запуске, но в целом работало все хорошо.


              1. MPfromLINUX Автор
                26.07.2026 10:10

                Athlon хоть и древний, но 2 ядра 3 ГГц уже хорошо, для качалки торрентов сгодится. HDD Toshiba, помню что 2017 года, вроде 7200 оборотов. Думаю, справится без проблем.


          1. winorun
            26.07.2026 10:10

            Так под эти задачи openwrt и встанет как родной


      1. alexs89
        26.07.2026 10:10

        OpenWRT вполне подходит для домашнего сервера, основной функцией которого является маршрутизация пакетов. Благодаря докеру из любого вычислительного устройства, поддерживающего докер, можно сделать что угодно. Разумеется, на Debian тоже можно реализовать все, что угодно, но у OpenWRT роутерная часть настраивается значительно проще и без дополнительных пакетов.


    1. eri
      26.07.2026 10:10

      Опенврт это ОС написанная на Баше. Пакеты урезанны для работы в минимум оперативки и флешки. Да вкорячить что-то стороннее туда без пересборки с СДК Опенврт довольно сложно хотябы потому, что это не Libc.


  1. little-brother
    26.07.2026 10:10

    Альтернативой этому системнику может быть прошитая TV-коробка под Armbian. Проц и памяти там за глаза, электричество почти не ест. Из существенных минусов: первый - есть только один порт Ethernet и тот зачастую сотка, а второй - диски можно подключить только через USB-переходник. Теоретически есть аппаратное декодирование для медиа-сервера, но на практике, думаю, будет работать так себе.

    Для совмещенного устройства роутера/NAS самый простым вариантом видится плата на N100.


    1. MPfromLINUX Автор
      26.07.2026 10:10

      Согласен, всякие N100 ноутбучные для подобных задач лучше всего подходят. Тв бокс на Amlogic S905X тоже хочу прошить на Armbian, но из него хочу почтовый сервер поднять на своем домене.


  1. VenbergV
    26.07.2026 10:10

    1) Какой дистрибутив все же используете?
    2) По привычной практике nftables.conf должен начинаться с:

    #!/usr/sbin/nft -f

    flush ruleset

    table inet filter {
    chain input {
    type filter hook input priority filter; policy drop;
    }
    chain forward {
    type filter hook forward priority filter; policy drop;
    }
    chain output {
    type filter hook output priority filter; policy drop;
    }
    }

    Иначе он ничего не фильтрует и все пропускает.
    3) Еще вы не указали ничего для ipv6.


    1. korn3r
      26.07.2026 10:10

      output то за что? :)


      1. VenbergV
        26.07.2026 10:10

        Так это голый шаблон. Все запрещено. Теперь его наполняем разрешающими правилами.
        Запрещено все, что не разрешено.


        1. korn3r
          26.07.2026 10:10

          голый шаблон обычно output accept имеет. зачем запрещать по-умолчанию исходящие соединения, если это не какой-то сверхузкоспециализированный сервер с настолько повышенными требованиями к безопасности?


    1. korn3r
      26.07.2026 10:10

      #!/usr/sbin/nft -f
      
      flush ruleset
      
      define WAN = eno1
      define LAN = eth0
      
      table inet main {
      
              set DROP_IP4 {
                      typeof ip saddr
                      flags interval
                      auto-merge
                      elements = {
                              127.0.0.0/8,
                              10.0.0.0/8,
                              172.16.0.0/12,
                              192.168.0.0/16,
                              100.64.0.0/10,
                              169.254.0.0/16,
                              192.0.0.0/24,
                              224.0.0.0/4,
                              240.0.0.0/4,
                              255.255.255.255/32
                      }
              }
      
              set DROP_IP6 {
                      typeof ip6 saddr
                      flags interval
                      auto-merge
                      elements = {
                              ::/128,
                              ::1/128,
                              ::ffff:0:0/96,
                              ::/96,
                              100::/64,
                              2001:10::/28,
                              3fff::/20,
                              fc00::/7,
                              fe80::/10,
                              ff00::/8
                      }
              }
      
              chain input_v4 {
                      iif $WAN ip saddr @DROP_IP4 drop
              }
      
              chain input_v6 {
                      icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
              }
      
              chain output_v4 {
                      iif $WAN ip daddr @DROP_IP4 drop
              }
      
              chain output_v6 {
                      iif $WAN ip6 daddr @DROP_IP6 drop
              }
      
              chain input {
                      type filter hook input priority 0; policy drop;
      
                              ct state vmap { established : accept, related : accept, invalid : drop }
                              iif lo accept
                              meta protocol vmap { ip : jump input_v4, ip6 : jump input_v6 }
                              iif $LAN accept
              }
      
              chain output {
                      type filter hook output priority 0; policy accept;
      
                              iif lo accept
                              meta protocol vmap { ip : jump output_v4, ip6 : jump output_v6 }
                              iif $LAN accept
              }
      }

      (Если WAN в приватном диапазоне, его лучше бы убрать из DROP_IP4)


    1. MPfromLINUX Автор
      26.07.2026 10:10

      1. Debian.

      2. NFTables через systemd enable сам запускается, шебанг в таком случае не обязателен.

      3. Это роутер, как ему заниматься маршрутизацией с input и output в policy drop? Все что делает конфиг в статье: маскарадинг ip v4 и v6.


      1. alexs963
        26.07.2026 10:10

            chain input {                                                                                                                                                                                        
                type filter hook input priority 0; policy drop;
                iifname lo accept
                ct state established,related accept
                ct state invalid drop
                tcp dport  443  accept
                iifname != $income_interface ct state new accept
            }
        


  1. Bagatur
    26.07.2026 10:10

    Вот примерно похожее реализовывал на Core2duo с 4 гб оперативы, ssd на 60 ГБ, и на какой-то wifi карте (чтобы на нём же AP поднять) несколько лет назад. Детей с их компом и мобилами посадил на отдельный SSID, с фильтрацией по халявным спискам для SquidFuard (на тот момент было достаточно). Ну и с резервированием по провайдерам (тогда подвели до дома 100МБит по меди и ещё не отключил ADSL, он был в качестве резерва). И всё это было поднято на PFSence - легко и непринуждённо.


  1. bbasil
    26.07.2026 10:10

    Посмотрел на конфиги nftables - ужаснулся в очередной раз ))


  1. theult
    26.07.2026 10:10

    Автор молодчик, нашел старой железке хорошее место)

    Тоже совсем недавно накопал j1900 и сетевуху 4х портовую гигабитную.


  1. Granulex
    26.07.2026 10:10

    Автор верно подмечает, что по сырой мощности такой ПК обгоняет бытовой роутер. Возможно, дело всё же не в суммарной мощности, а в одном ядре: и маршрутизация на гигабите, и особенно обработка PPPoE упираются в производительность единственного потока, а не в сумму ядер. Поэтому старый двухъядерник иногда проигрывает копеечной коробочке с аппаратным ускорением – у той маршрутизация вынесена в отдельный чип и от частоты процессора почти не зависит.


    1. MPfromLINUX Автор
      26.07.2026 10:10

      Обработкой PPPoE может заниматься сама Intel I210, вот с маршрутизацией сложнее. Поэтому копеечные коробчки хороши в маршрутизации, но часто плохи в Zapret/AdGuard и здесь полноценный x86 берет свое.