Подробная инструкция по настройке роутера в связке iptables + dnsmasq на Debian GNU/Linux, а также проброс портов по IP-адресам машин в локальной сети.
Исходные данные
Имеем на машине 2 сетевых интерфейса:
enp0s3 — для внешней сети 192.168.1.0/24
enp0s8 — для внутренней сети 192.168.52.0/24
Также у нас есть шлюз во внешней сети. Это маршрутизатор с IP-адресом 192.168.1.1
Наша задача — настроить доступ в Интернет для внутренней сети.
Открываем файл /etc/sysctl.conf
# nano /etc/sysctl.conf
и в самом конце пропишем строчку:
net.ipv4.ip_forward = 1
Проверяем
# sysctl -p
Должен быть такой ответ:
net.ipv4.ip_forward = 1
Теперь создадим правила iptables. Для этого создадим каталог /etc/firewall/ и файл /etc/firewall/iptables.sh
# mkdir /etc/firewall/ # touch /etc/firewall/iptables.sh
открываем его
# nano /etc/firewall/iptables.sh
и в нём пропишем такой скрипт:
#!/bin/sh 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 iptables-save > /etc/network/iptables
Делаем его исполняемым
# chmod u+x /etc/firewall/iptables.sh
Теперь откроем файл /etc/network/interfaces
# nano /etc/network/interfaces
и в самом конце пропишем строчку:
pre-up iptables-restore < /etc/network/iptables
Также создадим файл /etc/network/iptables
# touch /etc/network/iptables
Теперь вернёмся к файлу /etc/firewall/iptables.sh — запускаем скрипт
# sh /etc/firewall/iptables.sh
Правила файрволла активируются и пропишутся в /etc/network/iptables. В дальнейшем, при перезагрузке системы, система будет тянуть правила из него.
Далее установим dnsmasq
# apt install dnsmasq
После установки система сама запустит службу dnsmasq и добавит её в автозагрузку. Это можно проверить командой:
# systemctl status dnsmasq
Консоль покажет:
Loaded: loaded Active: active (running)
После этого открываем файл /etc/dnsmasq.conf
# nano /etc/dnsmasq.conf
и в нём пропишем такой конфиг:
domain-needed bogus-priv interface=enp0s8 resolv-file=/etc/resolv.conf dhcp-range=192.168.52.131,192.168.52.180,24h cache-size=150
Перезапускаем службу dnsmasq
# systemctl restart dnsmasq
или лучше вообще перезагрузить машину
# shutdown -r now
Теперь роутер должен работать и машины в сети получать ip-адреса и dns.
При необходимости в пробросе портов по IP-адресам для доступа из внешней сети нужно снова открыть скрипт /etc/firewall/iptables.sh
# nano /etc/firewall/iptables.sh
в нём после строчки
iptables -t nat -A POSTROUTING -o enp0s+ -j MASQUERADE
добавить такие:
iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 1234 -j DNAT --to-destination 192.168.52.111:1234 iptables -t nat -A PREROUTING -i enp0s3 -p udp --dport 5678 -j DNAT --to-destination 192.168.52.112:5678
а после строчки
iptables -t filter -A INPUT -i enp0s+ -j ACCEPT
добавить такие:
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 1234 -j ACCEPT iptables -t filter -A INPUT -p tcp -m state --state NEW -m udp --dport 5678 -j ACCEPT
- 1234 и 5678 — номера портов
- tcp и udp — протоколы
- 192.168.52.111 и 192.168.52.112 — ip-адреса машин в локальной (внутренней) сети
Затем снова запускаем скрипт /etc/firewall/iptables.sh
# sh /etc/firewall/iptables.sh
чтобы изменения вступили в силу.
Новые правила заново перечитаются и запишутся в файл /etc/network/iptables, а уже из этого файла при перезагрузке сервера будут автоматически запускаться эти правила.