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

iptables может отбрасывать трафик, но не может перенаправить

Предположим, что 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. Однако это правило подходит для внешнего пакета, проходящего через вашу машину.