Для роутера підійде будь-який комп'ютер головне, щоб в ньому було мінімум два Lan підключення RJ45. Оскільки цей міні-пк буде працювати постійно, бажано, щоб він був без вентилятора, а корпус як радіатор для охолодження.
Підійдуть будь-які малопотужні процесори які споживають мало енергії такі як: Intel Atom, Celeron, ARM в Raspbery Pi другий LAN можна під'єднати через адаптер USB-LAN.

Операційну систему я вибрав Debian 11 Малий інсталяційний образ
Інструкція по встановленню
Є зручний графічний інсталятор. При інсталяції бажано одразу поставити SSH підключення. Також додати non-free репозиторії для драйверів вашого ПК. Ідемо в термінал і дивимось що там є цікаве командою ls -l /etc/apt/. Там є sources.list, відкриваємо його sudo nano -l /etc/apt/sources.list
Повинно бути так:

 1 # deb cdrom:[Debian GNU/Linux 11.5.0 _Bullseye_ - Official amd64 NETINST 20220910-10:38]/ bullseye main
 2
 3 #deb cdrom:[Debian GNU/Linux 11.5.0 _Bullseye_ - Official amd64 NETINST 20220910-10:38]/ bullseye main
 4
 5 deb http://deb.debian.org/debian/ bullseye main contrib non-free
 6 deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
 7
 8 deb http://security.debian.org/debian-security bullseye-security main contrib non-free
 9 deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free
10
11 # bullseye-updates, to get updates before a point release is made;
12 # see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
13 deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free
14 deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free
15
16 # This system was installed using small removable media
17 # (e.g. netinst, live or single CD). The matching "deb cdrom"
18 # entries were disabled at the end of the installation process.
19 # For information about how to configure apt package sources,
20 # see the sources.list(5) manual.
21

CTR + O Зберігаємо потім CTR + X виходимо з nano, потім sudo apt update і можна встановлювати те що вам потрібно.

Для роутера важливо щоб пакети з інтернету могли бігати між різними інтерфейсами інтернет
підключення будь то кабель чи Wi-Fi. Так зване IP Masquerade. Бо для звичайного ПК то не потрібно.
Ви підключились до інтернету через один інтерфейс чи то кабель, чи то Wi-Fi і все, користуєтесь інтернетом.
В налаштуваннях ядра потрібно розкоментувати або додати строку: net.ipv4.ip_forward=1
в файлі, одразу буду писати з редактором nano. sudo nano -l /etc/sysctl.conf

Командою ip a скорочено від ip address, це ж Лінукс, навіщо тут багато писати :-)
Дивимось які в нас є інтерфейси типу: enp2s0 enp3s0 eth0 eth1 або щось подібне.
Я тут скоротив щоб менше місця займало, але для наглядності думаю зрозуміло.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.10.1/24 brd 192.168.10.255 scope global enp2s0
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.156/24 brd 192.168.1.255 scope global enp3s0
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000

З цих інтерфейсів нам потрібно визначитись який з них буде WAN, а який LAN
WAN це той що підключений до зовнішнього інтернету як напряму до провайдера, або через роутер провайдера. LAN це той до якого підключені комп'ютери або телефони по Wi-Fi в домашній локальній мережі. В моєму випадку enp3s0 - це WAN, а enp2s0 - це LAN.
wg0 - це WireGuard VPN але про нього згодом, наразі залишимо. lo- це localhost або loopback внутрішня мережа ПК.

Налаштовуємо інтерфейси в файлі
sudo nano -l /etc/network/interfaces, можна nano писати без -l тоді не буде показувати номер рядка.
В моєму випадку роутер провайдера роздає ip адреси в локальну мережу в диапазоні
192.168.1.2 - 192.168.1.255 це однозначно що 192.168.1.0\24 але 192.168.1.1 це арес самого роутера провайдера. В моєму випадку для WAN я вибрав 192.168.1.156 але можна вибрати будь який не зайнятий, а так як більше до роутера провайдера нічого не підключено окрім мого міні-пк
то ip адрес можна вибирати будь який.

Повинно бути щось подібне до цього:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
# iface enp3s0 inet dhcp
iface enp3s0 inet static
   address 192.168.1.156
   netmask 255.255.255.0
   gateway 192.168.1.1
# This is an autoconfigured IPv6 interface
iface enp3s0 inet6 auto

allow-hotplug enp2s0
iface enp2s0 inet static
   address 192.168.10.1/24
   netmask 255.255.255.0
iface enp2s0 inet6 auto

Перезавантажуємо нові налаштування sudo systemctl restart networking
Підключення по SSH ssh ваш_логін@192.168.1.156 або через локальний інтерфейс ssh ваш_логін@192.168.10.1

Так як в вашому Лінуксі є ключ id_rsa.pub його можна передати на ваш майбутній модем
ssh-copy-id ваш_логін@192.168.1.156 і вже заходити без пароля.

Далі ставимо nftables це як iptables, але пишуть що воно новіше і більшість переходить на нього, так от nftables робимо IP Masquerade відкриваємо порти блокуємо і т.д.

sudo apt install nftables
Файл налаштування sudo nano -l /etc/nftables.conf
І прописуємо те що нам потрібно, як приклад:

flush ruleset

define DEV_PRIVATE = enp2s0
define DEV_WORLD = enp3s0
define DEV_WG0 = wg0
define NET_PRIVATE = 192.168.10.0/24
define NET_WORLD = 192.168.1.0/24
define NET_WG0 = 10.8.0.0/24

table inet filter {
        chain inbound_world {
                # accepting ping (icmp-echo-request) for diagnostic purposes.
                # However, it also lets probes discover this host is alive.
                # This sample accepts them within a certain rate limit:
                #
                # icmp type echo-request limit rate 5/second accept

                # allow SSH connections from some well-known internet host
                udp dport XXXX accept #тут мій порт на VPN
        }

        chain inbound_private {
                # accepting ping (icmp-echo-request) for diagnostic purposes.
                icmp type echo-request limit rate 5/second accept

                # allow DHCP, DNS and SSH from the private network
                ip protocol . th dport vmap { tcp . 22 : accept, tcp . 80 : accept, udp . 53 : accept, tcp . 53 : accept, udp . 67 : accept, tcp . 1234 : accept }

        }

    chain input {
        type filter hook input priority filter; policy drop;

                # Allow traffic from established and related packets, drop invalid
                ct state vmap { established : accept, related : accept, invalid : drop }

                # allow loopback traffic, anything else jump to chain for further evaluation
                iifname vmap { lo : accept, $DEV_WORLD : jump inbound_world, $DEV_PRIVATE : jump inbound_private, $DEV_WG0 : jump inbound_private }

                # the rest is dropped by the above policy
    }

    chain forward {
        type filter hook forward priority filter; policy drop;

                # Allow traffic from established and related packets, drop invalid
                ct state vmap { established : accept, related : accept, invalid : drop }

                # connections from the internal net to the internet or to other
                # internal nets are allowed
                iifname { $DEV_WG0, $DEV_PRIVATE } oifname $DEV_WORLD accept
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}

table inet nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;

    }

    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;

                # masquerade private IP addresses
                iifname { $DEV_WG0, $DEV_PRIVATE } oifname $DEV_WORLD masquerade
    }
}

Приймаємо зміни sudo systemctl restart nftables.service або sudo systemctl reload nftables.service
Можна глянути що ми змінили командою sudo nft list ruleset
Щось подібне видасть:

table inet filter {
    chain inbound_world {
        udp dport XXXX accept
    }

    chain inbound_private {
        icmp type echo-request limit rate 5/second accept
        ip protocol . th dport vmap { tcp . 22 : accept, tcp . 53 : accept, udp . 53 : accept, udp . 67 : accept, tcp . 80 : accept, tcp . 1234 : accept }
    }

    chain input {
        type filter hook input priority filter; policy drop;
        ct state vmap { invalid : drop, established : accept, related : accept }
        iifname vmap { "lo" : accept, "wg0" : jump inbound_private, "enp2s0" : jump inbound_private, "enp3s0" : jump inbound_world }
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
        ct state vmap { invalid : drop, established : accept, related : accept }
        iifname { "wg0", "enp2s0" } oifname "enp3s0" accept
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}
table inet nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
    }

    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        iifname { "wg0", "enp2s0" } oifname "enp3s0" masquerade
    }
}

Тепер нам потрібно DHCP сервер, це той хто автоматично роздає ip адреси в локальній мережі всім клієнтам які підключаються до мережі.
Для цього я вибрав Pi-hole два в одному DHCP сервер і блокування реклами, всіляких фішингових сайтів і т.д.

Screenshot%20from%202022-12-25%2022-47-21
Встановлювати взагалі легко все в графічному інтерфейсі

curl -sSL https://install.pi-hole.net | bash

А вже в налаштуваннях Pi-hole є пояснення як то зробити.
В репозиторіях є декілька серверів DHCP без графічного інтерфейсу такі як isc-dhcp-server dnsmasq

Додати комментар

Наступний запис Попередній запис