Предположим, что TCP-пакеты отправляются на IP-адрес назначения (dest_ip) и могут быть отброшены с помощью следующей команды:
iptables -A INPUT -d dest_ip -p tcp -j DROP
Но когда я пытаюсь перенаправить пакет с помощью iptables NAT на другой ip (diff_ip), пакет все равно приходит в старое место назначения (dest_ip):
iptables -t nat -A PREROUTING -d dest_ip -p tcp -j DNAT --to-destination diff_ip
В iptables есть кое-что, чего я здесь не совсем понимаю, так как ожидаю, что пакет больше не достигнет dest_ip. Может кто-нибудь объяснить, почему это так? Спасибо.
Дополнительная информация, которая может быть актуальной:
/ proc / sys / net / ipv4 / ip_forward уже установлен в 1
ifconfig показывает два интерфейса: eth0 и lo; dest_ip находится на eth0, а diff_ip - удаленный ip
ОБНОВЛЕНИЕ 1: дальнейшие тесты с использованием telnet
Слушатель, использующий socat, установлен на 12800 для получения сообщения telnet:
socat -u TCP-LISTEN:12800,reuseaddr,keepalive,reuseaddr OPEN:/tmp/output.txt,creat,append
Telnet-соединение осуществляется со случайными сообщениями:
telnet 127.0.0.1 12800
1) тест с использованием:
iptables -A INPUT -p tcp --dport 12800 -j DROP
результат: все сообщения от telnet отбрасываются, что подтверждается счетчиком:
iptables -L INPUT -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2 120 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:12800
2) тест с использованием:
iptables -t nat -A PREROUTING -p tcp --dport 12800 -j DNAT --to-destination remote_ip
Результат: все сообщение приходит на порт 12800 без перенаправления, что подтверждается счетчиком:
iptables -L PREROUTING -t nat -v -n
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:12800 to:remote_ip
ОБНОВЛЕНИЕ 2: дальнейший тест с использованием telnet (см. Выше), но с правилами iptables в цепочке OUTPUT:
iptables -t nat -A OUTPUT -p tcp --dport 12800 -j DNAT --to-destination remote_ip
результат: все сообщения успешно перенаправлены, что подтверждается счетчиком:
iptables -L OUTPUT -t nat -v -n
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
3 180 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:12800 to:remote_ip
Это начинает иметь смысл, поскольку telnet - это локальный процесс, и его выходные данные должны напрямую попадать в цепочку OUTPUT. Однако возникает другой вопрос: согласно обновлению 1 сообщения telnet также могут быть отброшены в цепочке INPUT, так как же точно перемещаются пакеты? ВЫХОД -> ВХОД?
Все ваши тесты указали на то, что вам следовало выяснить. Имея дело с Netfilter / iptables, вы не можете успешно создавать свои правила, не имея поток пакетов в уме.
Как видите, локальный процесс никогда не проходит через PREROUTING
цепочка, но только OUTPUT
и POSTROUTING
. Вот почему ваш telnet
процесс перенаправляется, когда вы помещаете свое правило в OUTPUT
но не когда вы его вставляете PREROTUING
. Однако это правило подходит для внешнего пакета, проходящего через вашу машину.