Краткое руководство по настройке роутера в связке 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
Проброс других портов осуществляется аналогичным образом.
У меня enp2s0 = wan , enp3s1 = Lan очен неясно iptables.sh куда поставит Лан куда ван интерфейс. у тебе всегда enp0s+
enp0s+ означает любой интерфейс, который начинается с enp0s, то есть, если по статье, то это enp0s3 и enp0s8.
В вашем случае наверное будет лучше прописать enp+, или перечислить их через запятую, чтобы не писать одно и то же правило два раза.
Раборает. Единствено не работает 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»»
вы писали, что у вас интерфейс enp2s0 смотрит в Интернет, а прописываете enp0s3… исправьте, и всё должно получиться.
Как сделать чтоб роутер работал в обе стороны?