Назад | Перейти на главную страницу

IPtables SNAT ест пакеты

Я пытаюсь перевести исходящие пакеты UDP с исходным портом X на исходный порт Y.

Я сделал это, используя следующее правило iptables:

iptables -t nat -A POSTROUTING -s 10.0.0.1 -p udp --sport X -j SNAT --to-source 10.0.0.1:Y

Счетчики этого правила увеличиваются, когда генерируются пакеты с исходным портом X, но после этого полностью исчезают. Я не могу найти их в счетчиках какой-либо другой цепочки или таблицы, и не могу увидеть их ни на каком интерфейсе с помощью tcpdump.

Если я удалю это правило, то пакеты принимаются через исходный порт X. Но как только я верну правило обратно, пакеты исчезают.

Я использую версию v1.2.11 iptables, работающую на Voyage Linux. Я не могу легко выполнить обновление, так как это нужно будет сделать на нескольких сотнях удаленных устройств.

Что я делаю не так?

Изменить: конфигурация iptables добавлена ​​ниже, правила, относящиеся к конкретным приложениям, которые не могут повлиять на это, были удалены.

# Clear any existing rules 
iptables -v -t filter   -F
iptables -v -t nat      -F
iptables -v -t mangle   -F

iptables -v -t filter   -X
iptables -v -t nat      -X
iptables -v -t mangle   -X

# Policies
iptables -t mangle      -P PREROUTING   ACCEPT
iptables -t nat         -P PREROUTING   ACCEPT
iptables -t filter      -P INPUT        DROP
iptables -t filter      -P OUTPUT       ACCEPT
iptables -t filter      -P FORWARD      DROP

# Allow established connections.
iptables -t filter      -A INPUT      -m state --state ESTABLISHED -j ACCEPT
iptables -t filter      -A INPUT      -m state --state ESTABLISHED,RELATED -j ACCEPT  
iptables -t filter      -A FORWARD      -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter      -A FORWARD      -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter      -A OUTPUT       -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter      -A OUTPUT       -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow localhost to talk to itself.
iptables -t filter  -A INPUT      -i lo -j ACCEPT

# Drop stealth scan. 
iptables -t filter      -A INPUT      -p tcp -s 0/0 -d 0/0 --tcp-flags ALL NONE -j DROP                      
iptables -t filter      -A INPUT      -p tcp -s 0/0 -d 0/0 --tcp-flags ALL ALL -j DROP                       
iptables -t filter      -A INPUT      -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -t filter      -A INPUT      -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -t filter      -A INPUT      -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t filter      -A INPUT      -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP 
iptables -t filter      -A INPUT      -p tcp -m tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -t filter      -A INPUT      -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP

# Allow forwarding from LAN to WAN.
iptables -t filter      -A FORWARD      -i lanif -o wanif -j ACCEPT

# The NAT, strict with fixed IP address - might be different with a DHCP assigned WAN_IP
iptables -t nat         -A POSTROUTING  -o wanif -j SNAT --to-source $WAN_IP
iptables -t nat         -A POSTROUTING  -m mark --mark 11 -j ACCEPT

# Change source port X to Y - why does this not work???
iptables -t nat     -A POSTROUTING  -s lanif -p udp --sport X -j SNAT --to-source wanif:Y

Что я делаю не так?

Наверное, ничего. Это способ прохождения пакетов через Netfilter.

Проверьте эту диаграмму в качестве справки:

(Источник: Учебник Iptables 1.2.1 Оскара Андреассона, 2006 г.)

Я не могу найти их в прилавках других цепочек или столов

SNAT является конечной целью Netfilter, впоследствии пакеты не будут отображаться в той же цепочке. В POSTROUTING-цепь в nat-table - это абсолютная финальная таблица, по которой пакет может пройти через Netfilter-framework. Tcpdump прикреплен к более раннему этапу, я считать в mangle/POSTROUTING.

и не может видеть их ни на каком интерфейсе с помощью tcpdump. Это потому, что tcpdump видит пакеты до того, как они получат SNATизд.

Что-то на самом деле идет не так? Звучит как совершенно нормально Netfilter-tcpdump-oddities.

Изменить: ваш оператор SNAT происходит в конце. Может надо его вставить перед в -o wanif -j SNAT --to-source $WAN_IP заявление. Поскольку у меня нет более подробной информации, я не могу сказать, было ли это ошибкой или намеренно.

Возможно, существует служба, которая уже прослушивает этот порт. iptablesSNAT, при выполнении трансляции будет пытаться сохранить тот же порт, что и в исходном пакете. Если этот порт недоступен, он будет использовать другой.

У меня возникла эта проблема при попытке SNAT ответов DNS-сервера. Это привело к тому, что ответы отправлялись с порта 1, поскольку DNS-сервер уже использовал порт 53.

Решение заключалось в том, чтобы DNS-сервер слушал другой порт, ПЕРЕНАПРАВЛЕНИЕ входящего трафика с порта назначения 53 на порт назначения X, а затем SNAT также переписал порт с X на 53.

Я ожидал увидеть что-то вроде этого:

iptables -t nat -A POSTROUTING -s 10.0.0.1 -p udp --dport X -j SNAT --to-port Y