iptables (Интересное поведение)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

kvarg
Сообщения: 9
ОС: Archlinux

iptables

Сообщение kvarg »

Доброго времени суток, товарищи!

Встала задача перебросить входящие соединения по порту X на порт Y компьютера в DMZ.
Итак, многие бы предложили очевидное решение:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport X -j DNAT --to-destination ip_DMZ:Y
Я не оспариваю его правильность.
Просто изначально я пошёл другим путём и наткнулся на интересную особенность.
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport X -j REDIRECT --to-ports Y
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport Y -j DNAT --to-destination ip_DMZ
С виду, вроде бы логичные правила, но не работают.

Стал копать дальше и вставил пару логирующих правил, дабы отследить траффик
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport X -j REDIRECT --to-ports Y
iptables -t nat -A PREROUTING -p tcp -i eth0 -m multiport --port X,Y -j LOG --log-level debug --log-prefix "NAT "
iptables -t mangle -A PREROUTING -p tcp -i eth0 -m multiport --port X,Y -j LOG --log-level debug --log-prefix "MANGLE "

По логу видно, что в таблицу mangle цепочки PREROUTE пакет приходит, но в таблицу nat одноимённой цепочки уже нет.
Если убрать правило переброски портов - всё приходит в норму, и пакеты идут как в mangle, так и в nat.
Отсюда вопрос - почему так? Неуж-то после действия REDIRECT принимает решение о локальной доставке пакета? Или я чего-то не понимаю?

Спасибо за ответы.
Спасибо сказали:
Аватара пользователя
Mage-Warrior
Сообщения: 869
Статус: Семь раз понюхай, один раз откуси!
ОС: SlackWare 12.1

Re: iptables

Сообщение Mage-Warrior »

The REDIRECT target is used to redirect packets and streams to the machine itself. This means that we could for example REDIRECT all packets destined for the HTTP ports to an HTTP proxy like squid, on our own host. Locally generated packets are mapped to the 127.0.0.1 address. In other words, this rewrites the destination address to our own host for packets that are forwarded, or something alike. The REDIRECT target is extremely good to use when we want, for example, transparent proxying, where the LAN hosts do not know about the proxy at all.

Не в этом ли дело? :) Не зря же в DNAT предусмотрено указание порта назначения.
*- Большинство проблем, дружок, завсегда покажет лог! -*
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: iptables

Сообщение pelmen »

Проще говоря, после redirect пакет уже не попадает ЕЩЕ РАЗ в prerouting, а, наверное, сразу в input :)
Спасибо сказали:
Аватара пользователя
danger08
Сообщения: 715
ОС: Linux (CentOS, Ubuntu)

Re: iptables

Сообщение danger08 »

kvarg писал(а):
18.08.2009 05:48
Отсюда вопрос - почему так? Неуж-то после действия REDIRECT принимает решение о локальной доставке пакета?

Нет, однозначных решений не принимается. Пакет проходит по всем цепочкам лишь один раз, чтобы избежать зацикливания. Один тот же пакет, пройдя NAT PREROUTING и модифицированный REDIRECT-ом, вне зависимости от внесенных изменений не пойдет повторно по цепочкам - NAT PREROUTING для него уже пройден.

Действие REDIRECT - это, по сути, MASQUERADE наоборот (если для SNAT существует подпорка в виде MASQUERADE, логично преположить ее зеркальный аналог для DNAT - это и есть REDIRECT. Т.е., MASQERADE позволяет прозрачно подменять источник пакетов, а REDIRECT - назначение). Пара DNAT/REDIRECT будет работать некорректно по той же причине, что аналогичная пара SNAT/MASQUERADE (из-за повтора и неоднозначности действий, т.к. логика обработки пакета "нечеткая").
Блогосайт - http://www.fateyev.com
Спасибо сказали:
kvarg
Сообщения: 9
ОС: Archlinux

Re: iptables

Сообщение kvarg »

Всё становится на свои места. Благодарю за пояснения. Век живи - век учись :rolleyes:
Спасибо сказали: