Я пытаюсь перевести исходящие пакеты 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
заявление. Поскольку у меня нет более подробной информации, я не могу сказать, было ли это ошибкой или намеренно.
Возможно, существует служба, которая уже прослушивает этот порт. iptables
SNAT, при выполнении трансляции будет пытаться сохранить тот же порт, что и в исходном пакете. Если этот порт недоступен, он будет использовать другой.
У меня возникла эта проблема при попытке 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