1

У меня есть интерфейсы eth0 (доступ в Интернет) и tap_vpn0 (интерфейс vpn tap, сеть 192.168.110.0/24). Что я хочу, так это DNAT всех входящих соединений через eth0 до 192.168.110.2, но ТОЛЬКО если НЕТ службы прослушивания на самом сервере (в основном, на самом VPN-сервере, но в основном на любой другой службе, отображаемой в netstat -plunt , в том числе на самом деле SSH).

На данный момент то, что я делаю, это iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

записывать длинный список статических исключений. Но есть ли способ сказать IPTables не DNAT в случае, если порт не закрыт на фактическом хосте, если пакет будет успешно обработан локально? Так, если для примера у меня есть случайный порт 9988, открытый позже на сервере, мне не нужно добавлять другое исключение, такое как iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPT но это просто не будет DNAT-ред?

1 ответ1

0

Похоже, iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT . -m socket дескриптором делает именно это - соответствует, если есть какой-либо принимающий сокет для этого пакета. Хитрость заключалась в том, чтобы использовать параметр --nowildcard , который я ранее пропустил - даже на его man-странице сказано: « Сопоставление сокетов не будет принимать слушателей с нулевым ограничением по умолчанию, поскольку тогда локальные службы могут перехватывать трафик, который в противном случае был бы перенаправлен». - что на самом деле именно то, что мне было нужно - что местные службы перехватывают, если таковые имеются!

В результате получаются следующие правила: iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

Я оставил порт 22 (ssh) на всякий случай, если он не работает должным образом - но из тестирования, кажется, работает отлично!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .