Найти в Дзене

Роутер из ПК? (Зачем)Linux здесь не лучший вариант.

Оглавление

Отступление от темы. В контексте приводятся марки и модели оборудования, которые имеются в наличии у Автора. Это не является рекламой данных изделий. Всё описанное ниже оборудование использовано для написания этой статьи в качестве примера.

Сделать роутер на базе Debian?

Да что может быть проще, "гуглим рецепт", втыкиваем команды и готово.

Так ли всё просто? Думаю, что есть смысл разобраться в этом вопросе.

Интернет кишит рабочими, но одинаковыми методами настройки шлюза, DHCP и прочих игрушек. Однако, программные продукты сильно изменились и то что описано для Debian 10 или Ubuntu, или других Linux, может не сработать для Debian 12

С другой стороны, Сделал Самов Рукоплечий задумал и сделал.

При наличии готового сервера/пк и линукса на опытной машине развёртывание не займет больше часа.

При наличии компьютера с установленной Windows XP, 7, 8.1, 10 настройка займёт минуты 2-3...

Но мы не ищем лёгких путей, потому что за 3 минуты в Windows настроишь сеть, а здесь максимум за 10 ты настроишь сеть и всю обслуживающую инфраструктуру.

Поехали.

Системные требования

1. Любой ПК с двумя сетевыми интерфейсами, желательно чтобы оба были LAN. В современном мире не обязательно покупать сетевую карту PCI, достаточно иметь USB вариант.
2. Linux, желательно Debian 11 или 12 в серверном варианте.
3. Неуправляемый коммутатор для организации LAN. Типа такого как на картинке ниже:

Картинка взята отсюда https://www.aknet.kg/files/pictures/mercusys.jpg
Картинка взята отсюда https://www.aknet.kg/files/pictures/mercusys.jpg

Как вариант, при наличии роутера (мы же учимся делать, а значит скорее всего роутер у нас есть), например TP-Link archer C80, можно уйти от настройки DHCP и DNS сервера.
4. При необходимости доступа извне у вас должен быть внешний IP, неважно статически или динамический, он должен быть не просто внешним, а доступным для того, чтобы получить доступ извне к своей домашней сети.

Примечание. Автор получает интернет посредством привязки к MAC адресу сетевой карты.
Варианты с PPPoE Автор рассмотрит, когда у него будет такая возможность.

Подготовка на работе

Для начала необходимо записать MAC-адрес сетевой карты, которая подключена к интернету. Если используется роутер TP-link, то это выглядит так

Данный MAC является сгенерированным эмулятором интерфейса роутера, у вас должен быть свой
Данный MAC является сгенерированным эмулятором интерфейса роутера, у вас должен быть свой

Если используется компьютер, подключенный к интернету напрямую, то вам нужно будет либо установить на него Linux, либо использовать другой компьютер где нужно будет сделать подмену MAC адреса.
Чтобы его узнать, нужно вызвать
демона cmd и записать MAC сетевой карты, подключенной к интернету.

-3

На фото выше приведен пример физического адреса, присвоенного сетевой карте, подключенной к интернету: 86:97:e6:2e:d9:92.

Если Вы установили Debian 12 серверный вариант и не выполняли установку графических оболочек, то работать будет проще. В противном случае вам нужно будет удалить графический менеджер управления сетью, который будет "резать" DNS запросы с внутренней сетевой карты на внешнюю.

Считаем, что ваш Debian на момент подготовки управляется напрямую (у меня заранее была установлена одноранговая сеть и весь сервер управлялся по SSH) клавиатурой.

В будущем постараюсь написать простой интерфейс настройки, а пока что придётся использовать консоль.

Нам придётся много работать в режиме администратора, поэтому если установлено sudo, то:

admin-server$ sudo su

root-server#

Любым доступным способом открываем файл /etc/network/interfaces
Например root-server# nano /etc/network/interfaces
Я рекомендую установить симлинки на все редактируемые конфиги и разместить их в одном каталоге.
Также я буду использовать ssh для коннекта к серверу (это пока что).

ВАЖНО! В Debian практически никогда не использовалась утилита ifconfig! Поэтому инструкции, так щедро раздаваемые поиском часто не имеют смысла. Устанавливать её нет смысла, Debian имеет мощный инструмент "ip", см. man ip.

Вызываем информацию о сетевых интерфейсах
$ip a
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 noprefixroute
valid_lft forever preferred_lft forever
2:
enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether
60:eb:69:fd:e2:3a brd ff:ff:ff:ff:ff:ff
inet *.*.*.*/* brd *.*.*.255 scope global dynamic
enp1s0f0
valid_lft 62939sec preferred_lft 62939sec
inet6 fe80::16da:e9ff:fed3:d927/64 scope link
valid_lft forever preferred_lft forever
3:
enp1s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether
60:eb:69:fd:e2:3b brd ff:ff:ff:ff:ff:ff
inet *.*.*.*/* brd *.*.*.255 scope global
enp1s0f1
valid_lft forever preferred_lft forever
inet6 fe80::62eb:69ff:fefd:e23b/64 scope link
valid_lft forever preferred_lft forever

Я привёл настроенные интерфейсы, у вас может быть другой вывод программы ip. Но требуемые параметры это имена интерфейсов и MAC адреса (link/ether), то-есть то, что мы выделили жирным текстом.
В современных дистрибутивах Debian и Ubuntu вы не увидите eth0 или eth1, но вы можете самостоятельно сделать символические ссылки, чтобы вам было удобнее обращаться к устройствам.
Если мы работаем по ssh, то копируем вывод ip a в текстовый файл, так будет удобнее работать:

-4

Открываем файл /etc/interfaces, чистим от всего, кроме описания "l0"

-5

Например нам нужно, чтобы интерфейс enp1s0f0 "смотрел" в интернет, значит его нужно настроить так, как это показано на картинке выше.
Если расположить директивы в ином порядке, то скорее всего перезапуск сети произойдет с ошибкой.
Директива pre-up ip link set enp1s0f0 address 88:CD:04:81:92:55 поможет выполнить подмену MAC адреса вашей сетевой карты, которая будет подключена к провайдеру, вместо 88:CD:04:81:92:55 вы должны ввести MAC, который подключен к интернету.
Интерфейс enp1s0f1 подключается в локальную сеть и теоретически, подмена MAC ему не нужна. Поскольку у нас отсутствует DHCP сервер, то мы обязаны назначить локальные адреса вручную.
Допустим, что:

#перед поднятием сети присваиваем карте MAC 60:EB:69:FD:E2:3B
pre-up ip link set enp1s0f1 address 60:EB:69:FD:E2:3B
#разрешаем автозапуск
auto enp1s0f1
#назначаем условие, что настройки статические:
iface enp1s0f1 inet static
#ip адрес (локальный)
address 192.168.1.250
#маска подсети
netmask 255.255.255.0
Обычно больше ничего не требуется. Однако после этих манипуляций Вам необходимо подключить интернет-кабель в тот разъем, который у вас будет в интернете.
Ко второму разъему подключить второй кабель, который через коммутатор будет подключен к компьютеру, который будет получать интернет от новоиспеченного шлюза.

Дочитали? Слишком много и скучно?

Просто на винде сделайте как я сделал ниже. И всё!

-6

Вот вам и эргономика Linux и Windows.

Ну ладно, продолжаю.

Шлюз включается достаточно просто:

# echo 1 >/proc/sys/net/ipv4/ip_forward

А дальше нужно настроить iptables для того чтобы шлюз знал как работать с информацией на своих "дырках". Здесь я ничего не придумывал, а просто взял один из возможных файлов сценариев для установки правил iptables.

Например отсюда.

Или вот это содержимое моего файла (с некоторыми изменениями, откуда взял не помню, но автору спасибо!):

#!/bin/bash

export IPT="iptables"

# Внешний интерфейс
export WAN=enp1s0f0
export WAN_IP=YOUR WAN IP

# Локальная сеть
export LAN1=YOUR INTERFACE
export LAN1_IP_RANGE=192.168.1.0/24

# Очищаем правила
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Запрещаем все, что не разрешено
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# Разрешаем localhost и локалку
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i $LAN1 -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -o $LAN1 -j ACCEPT

# Рзрешаем пинги
$IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Разрешаем все исходящие подключения сервера
$IPT -A OUTPUT -o $WAN -j ACCEPT
# Разрешаем все входящие подключения сервера
$IPT -A INPUT -i $LAN1 -j ACCEPT
# разрешаем установленные подключения
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Отбрасываем неопознанные пакеты
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP
# Отбрасываем нулевые пакеты
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Закрываемся от syn-flood атак
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
# Блокируем доступ с указанных адресов (сюда можно вносить список адресов #для блокировки подключений с них
#$IPT -A INPUT -s 84.122.21.197 -j REJECT

#ЭТА СЕКЦИЯ ДЛЯ ПРОБРОСА ПОРТОВ!#
# Пробрасываем внешний порт 23543 на локальный адрес и порт 3389
#(открываем RDP)
#$IPT -t nat -A PREROUTING -p tcp --dport 23543 -i ${WAN} -j DNAT --to #10.1.3.50:3389
#$IPT -A FORWARD -i $WAN -d 10.1.3.50 -p tcp --dport 3389 -j ACCEPT

#Пробрасываем внешний порт XXXXX на локальный адрес и порт YYYYY
$IPT -t nat -A PREROUTING -p tcp --dport XXXXX-i ${WAN} -j DNAT --to 192.168.X.X:YYYYY
$IPT -A FORWARD -i $WAN -d 192.168.X.X -p tcp --dport YYYYY -j ACCEPT
$IPT -t nat -A PREROUTING -p tcp --dport 66 -i ${WAN} -j DNAT --to 192.168.1.250:66
$IPT -A FORWARD -i $WAN -d 192.168.1.250 -p tcp --dport 66 -j ACCEPT
# Разрешаем доступ из локалки наружу
$IPT -A FORWARD -i $LAN1 -o $WAN -j ACCEPT
# Закрываем доступ снаружи в локалку
$IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT
# Включаем NAT
$IPT -t nat -A POSTROUTING -o $WAN -s $LAN1_IP_RANGE -j MASQUERADE
# открываем доступ к SSH
$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT
# открываем доступ на служебный порт 892 для ssh другой машины
$IPT -A INPUT -i $WAN -p tcp --dport 892 -j ACCEPT
# Открываем доступ к почтовому серверу
#$IPT -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT

#Открываем доступ к web серверу
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
#открываем доступ к webmin
$IPT -A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
#открываем доступ к другим службам, висящим на своих портах

$IPT -A INPUT -p tcp -m tcp --dport 53320 -j ACCEPT
#Открываем доступ к DNS серверу
$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT

# Включаем логирование
#$IPT -N block_in
#$IPT -N block_out
#$IPT -N block_fw

#$IPT -A INPUT -j block_in
#$IPT -A OUTPUT -j block_out
#$IPT -A FORWARD -j block_fw

#$IPT -A block_in -j LOG --log-level info --log-prefix "--IN--BLOCK"
#$IPT -A block_in -j DROP
#$IPT -A block_out -j LOG --log-level info --log-prefix "--OUT--BLOCK"
#$IPT -A block_out -j DROP
#$IPT -A block_fw -j LOG --log-level info --log-prefix "--FW--BLOCK"
#$IPT -A block_fw -j DROP

# Сохраняем правила
/sbin/iptables-save > /etc/iptables.rules

После отработки скрипта правила, обычно, устанавливаются моментально.
Останется перенастроить ваш роутер, чтобы его DHCP сервер выдавал в качестве шлюза ваш сервер и назначал его же в качестве DNS сервера.
На самом деле, настройки шлюза займут около 10 минут. Но работать оно будет нормально. С заранее настроенным firewall. Мне очень жаль, что графические менеджеры сети Linux не умеют расшаривать интернет также изящно, как и windows. С другой стороны, задача не тривиальная. Для таких целей конечно же должен использоваться нормальный роутер. Но если купленный роутер стал ненормальным и отказался работать нормально, то стоит попробовать обычный ПК для раздачи интернета.