Для роутера підійде будь-який комп'ютер головне, щоб в ньому було мінімум два 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 сервер і блокування реклами, всіляких фішингових сайтів і т.д.
Встановлювати взагалі легко все в графічному інтерфейсі
curl -sSL https://install.pi-hole.net | bash
А вже в налаштуваннях Pi-hole є пояснення як то зробити.
В репозиторіях є декілька серверів DHCP без графічного інтерфейсу такі як isc-dhcp-server dnsmasq