Здравствуйте! Имеется Ubuntu 16.04 и VPN-сервер: XL2TPD PPP IPSec Libreswan Samba (папка с общим доступом находится на сервере Ubuntu). Уже один раз меня хакали. Не хочу, чтобы впредь это повторялось. Как грамотно прописать правила для iptables, чтобы не было открытого прямого доступа?
Я сделал так (/etc/iptables/rules.v4):
# eth0 подключен к интернету.
# eth1 подключен к частной подсети.
# Внешний интерфейс сервера
IF_EXT="ens3"
# Внутренние интерфейсы (обслуживающие ВПН-клиентов)
IF_INT="ppp+"
# Сеть, адреса из которой будут получать ВПН-клиенты
NET_INT="112.128.72.0/24"
LOOP="127.0.0.1"
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s ${NET_INT} -o eth0 -j MASQUERADE
-t nat -A POSTROUTING -s ${NET_INT} -j MASQUERADE -o ${IF_EXT}
-t nat -A POSTROUTING -o eth0 -s ${NET_INT} -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol none -j DROP
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m multiport --dports 500,4500 -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -j DROP
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -i eth0 -o ${IF_INT} -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ${IF_INT} -o eth0 -j ACCEPT
-A FORWARD -s ${NET_INT} -d ${NET_INT} -i ${IF_INT} -o ${IF_INT} -j ACCEPT
-A FORWARD -j DROP
# Разрешаем весь трафик на петлевом интерфейсе
-A INPUT -i lo -j ACCEPT
# Запретить внешним пакетам использовать петлевой адрес
-A INPUT -i eth0 -s ${LOOP} -j DROP
-A FORWARD -i eth0 -s ${LOOP} -j DROP
-A INPUT -i eth0 -d ${LOOP} -j DROP
-A FORWARD -i eth0 -d ${LOOP} -j DROP
# Все, что приходит из Интернета, должно иметь настоящий интернет-адрес
-A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
-A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
-A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
-A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
-A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
-A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
# Разрешаем всё для ВПН-клиентов
-A INPUT -i ${IF_INT} -s ${NET_INT} -j ACCEPT
# Разрешаем входящие соединения к L2TP
# Но только с шифрованием!
-A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
# Разрешаем IPSec
-A INPUT -p esp -j ACCEPT
-A INPUT -p ah -j ACCEPT
-A INPUT -p udp --dport 500 -j ACCEPT
-A INPUT -p udp --dport 4500 -j ACCEPT
# Разрешаем доступ к серверу по SSH
-A INPUT -m tcp -p tcp --dport 2002 -j ACCEPT
# Разрешаем входящие ответы на исходящие соединения
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# NAT для локальной сети (ВПН-клиентов)
-A FORWARD -i ${IF_INT} -o ${IF_EXT} -s ${NET_INT} -j ACCEPT
-A FORWARD -i ${IF_EXT} -o ${IF_INT} -d ${NET_INT} -m state --state RELATED,ESTABLISHED -j ACCEPT
# Блокировать исходящие NetBios (если у вас запущены машины с Windows
# в частной подсети). Это не повлияет на NetBios
# трафик, который проходит через VPN-туннель, но он остановится
# локальные машины Windows от вещания себя
# интернет.
-A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
-A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
-A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
-A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP
# Проверка правильности адреса источника на пакетах, выходящих в интернет
-A FORWARD -s ! ${NET_INT} -i eth1 -j DROP
# Разрешить локальную петлю
-A INPUT -s ${LOOP} -j ACCEPT
-A INPUT -d ${LOOP} -j ACCEPT
# Drop входящих эхо-запросов
-A INPUT -p icmp --icmp-type echo-request -j DROP
# Drop пакетов из частных подсетей
-A INPUT -i eth1 -j DROP
-A FORWARD -i eth1 -j DROP
# Сохранять состояние соединений из локальной машины и частных подсетей
-A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state NEW -o eth0 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Самба ВКЛ
-A INPUT -p tcp -m tcp --dport 445 –s ${NET_INT} -j ACCEPT
-A INPUT -p tcp -m tcp --dport 139 –s ${NET_INT} -j ACCEPT
-A INPUT -p udp -m udp --dport 137 –s ${NET_INT} -j ACCEPT
-A INPUT -p udp -m udp --dport 138 –s ${NET_INT} -j ACCEPT
-A INPUT -i eth0 -s ${NET_INT} -p udp --dport 137:138 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -d ${NET_INT} -p udp --sport 137:138 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -s ${NET_INT} -p tcp --dport 139 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -d ${NET_INT} -p tcp --sport 139 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -d ${NET_INT} -p udp --sport 445 -m state --state ESTABLISHED -j ACCEPT
-I INPUT -i eth0 -p tcp --dport 137 -j DROP
-I INPUT -i eth0 -p tcp --dport 138 -j DROP
-I INPUT -i eth0 -p tcp --dport 139 -j DROP
-I INPUT -i eth0 -p tcp --dport 445 -j DROP
-I INPUT -i eth0 -p tcp --dport 1701 -j DROP
COMMIT
Подскажите, пожалуйста, всё ли правильно у меня написано?