Роутер на Ubuntu Server 21.04

Краткое руководство по настройке роутера в связке iptables + dnsmasq на ОС Ubuntu Server 21.04, а также проброс портов по IP-адресам машин в локальной сети.

Исходные данные

Имеем на машине 2 сетевых интерфейса:

enp0s3 — для внешней сети 192.168.1.0/24

enp0s8 — для внутренней сети 192.168.53.0/24

Также у нас есть шлюз во внешней сети. Это маршрутизатор с IP-адресом 192.168.1.1

Наша задача — настроить доступ в Интернет для внутренней сети.

В первую очередь нам необходимо настроить сетевые интерфейсы. Для этих целей Ubuntu Server 21.04 использует netplan.

Открываем файл /etc/netplan/00-installer-config.yaml

# sudo nano /etc/netplan/00-installer-config.yaml

и приводим его к такому виду:

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      addresses:
      - 192.168.1.53/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
        - 192.168.1.1
        search: []
    enp0s8:
      addresses:
      - 192.168.53.1/24
      nameservers:
        addresses: []
        search: []
  version: 2

Перезапускаем netplan

# sudo netplan generate
# sudo netplan apply

Переходим к настройке файрволла (правил iptables).

Создадим каталог /etc/firewall, в нём скрипт iptables.sh и открываем его

# sudo mkdir /etc/firewall
# sudo touch /etc/firewall/iptables.sh
# sudo nano /etc/firewall/iptables.sh

в нём пропишем такой код:

#!/bin/sh

sysctl -w net.ipv4.ip_forward=1

iptables -F
iptables -t nat -A POSTROUTING -o enp0s+ -j MASQUERADE
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -i enp0s+ -j ACCEPT
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -p icmp -j ACCEPT
iptables -t filter -A FORWARD -i lo -j ACCEPT
iptables -t filter -A FORWARD -i enp0s+ -j ACCEPT
iptables -t filter -A FORWARD -o enp0s+ -j ACCEPT
iptables -t filter -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -t filter -A FORWARD -j REJECT --reject-with icmp-host-prohibited

и сделаем скрипт исполняемым

# sudo chmod +x /etc/firewall/iptables.sh

Теперь создадим службу rc-local. Для этого создадим файл /etc/systemd/system/rc-local.service

# sudo touch /etc/systemd/system/rc-local.service

откроем его

# sudo nano /etc/systemd/system/rc-local.service

в внесём такой него код:

[Unit]
Description=/etc/rc.local
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

Затем создадим файл /etc/rc.local и откроем его

# sudo touch /etc/rc.local
# sudo nano /etc/rc.local

пропишем в него такой код:

#!/bin/sh -e

/etc/firewall/iptables.sh
exit 0

и сделаем его исполняемым

# sudo chmod +x /etc/rc.local

Далее перезагрузим машину

# sudo shutdown -r now

Проверим, работают ли созданные правила. Для этого выполним команду

# sudo iptables -L

и, если iptables работает корректно, получим примерно такой ответ

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

После этого переходим к настройке dnsmasq.

Устанавливаем его

# sudo apt install dnsmasq

открываем конфиг

# sudo nano /etc/dnsmasq.conf

и в самом конце файла добавляем:

bind-interfaces
domain-needed
bogus-priv
interface=enp0s8
resolv-file=/etc/resolv.conf
dhcp-range=192.168.53.31,192.168.53.130,24h
cache-size=150

Запускаем службу dnsmasq

# sudo systemctl start dnsmasq

или лучше вообще перезагрузим машину

# sudo shutdown -r now

После этого на других машинах в сети проверяем сетевые настройки и выход в Интернет.

При необходимости в пробросе портов по IP-адресам для доступа из внешней сети, например, необходимо пробросить порт RDP 3389/TCP на IP-адрес машины 192.168.53.25, выполним такие команды:

# sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 3389 -j DNAT --to-destination 192.168.53.25:3389
# sudo iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 3389 -j ACCEPT

Для того, чтобы эти правила срабатывали после каждой загрузки системы, их необходимо прописать в файл /etc/firewall/iptables.sh

Проброс других портов осуществляется аналогичным образом.

Роутер на Ubuntu Server 21.04: 5 комментариев

  1. У меня enp2s0 = wan , enp3s1 = Lan очен неясно iptables.sh куда поставит Лан куда ван интерфейс. у тебе всегда enp0s+

  2. enp0s+ означает любой интерфейс, который начинается с enp0s, то есть, если по статье, то это enp0s3 и enp0s8.

    В вашем случае наверное будет лучше прописать enp+, или перечислить их через запятую, чтобы не писать одно и то же правило два раза.

  3. Раборает. Единствено не работает iptables -t nat -A PREROUTING -i enp0s3 -p tcp —dport 3389 -j DNAT —to-destination 192.168.53.25:3389 «iptables v1.8.7 (nf_tables): unknown option «—port»»

  4. вы писали, что у вас интерфейс enp2s0 смотрит в Интернет, а прописываете enp0s3… исправьте, и всё должно получиться.

  5. Как сделать чтоб роутер работал в обе стороны?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *