LINUX.ORG.RU
ФорумAdmin

Iptables не применяются правила


0

1

Выполняю следующие команды:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -d 192.168.2.41 -p udp --dport 8793 -j DNAT --to-destination 192.168.2.201:8793
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Суть: перенаправлять все пакеты которые приходят на текущий компьютер по указанному адресу(--to-destination).

Проблема : после выполнения этих команд, пакеты не перенаправляются(проверяю при помощи tcpdump). Пакеты приходят, но не уходят.

Содержимое таблицы после некоторого времени работы

iptables -t nat -L -v 
Chain PREROUTING (policy ACCEPT 512 packets, 45754 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       udp  --  any    any     anywhere             host             udp dpt:8793 to:192.168.2.201:8793 

Chain OUTPUT (policy ACCEPT 1314 packets, 82818 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 429 packets, 26992 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   19  1237 MASQUERADE  all  --  any    eth0    anywhere             anywhere            

Что самое странное - иногда правила применяются и пакеты начинают ходить, но иногда этого не происходит. Закономерности не выяснил



Последнее исправление: recon88 (всего исправлений: 1)

Что-то не очень понятно, какой интерфейс у вас смотрит «наружу», а какой в локальную сеть. И смотрите лучше на построутинге через -j LOG

delete83 ★★
()

Или это не роутер и вы просто хотите отзеркалить пакеты на другой комп внутри локальной сети?

delete83 ★★
()
Ответ на: комментарий от delete83

Примерно так:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -d 192.168.2.41 -p udp --dport 8793 -j DNAT --to-destination 192.168.2.201:8793
iptables -t nat -A POSTROUTING -d 192.168.2.201 -p udp --dport 8793 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

delete83 ★★
()
Ответ на: комментарий от delete83

Хотя совершенно непонятно, зачем вам в локальной сети маскарадинг. В голову не приходит ни одного полезного применения.

delete83 ★★
()

Я бы делал както-так:

iptables -t nat -A PREROUTING -d 192.168.2.41 -p udp --dport 8793 -j LOG --log-prefix "Hop PREROUTING nat: "
iptables -t nat -A PREROUTING -d 192.168.2.41 -p udp --dport 8793 -j DNAT --to-destination 192.168.2.201:8793
iptables -t nat -A POSTROUTING -d 192.168.2.201 -m udp -p udp --dport 8793 -j LOG --log-prefix "Hop POSTROUTING nat: "
iptables -t nat -A POSTROUTING -d 192.168.2.201 -m udp -p udp --dport 8793 -j SNAT --to-source 192.168.2.41
Tok ★★
()
Ответ на: комментарий от Tok

Зачем здесь SNAT? Он, во-первых, не будет отрабатывать, а во-вторых, если уж отработает, результат будет совсем не тем, какой ожидался, ибо перенаправление портов...

delete83 ★★
()

Про замену MASQUERADE на SNAT, причём только для этих пакетов, уже написали. В -t filter FORWARD нужно разрешить эти пакеты. И ещё, nat работает только для state NEW пакетов. У udp нет процедуры установления соединения, поэтому запись в conntrack'е удаляется через 5 мин. отсутствия пакетов.

Поэтому, если у вас в conntrack висит udp-соединение с 192.168.2.41 (без DNAT), ждите пока оно удалится (или удалите руками) и только потом проверяйте. А то у вас счётчик DNAT правила нулевой, значит оно не срабатывало.

mky ★★★★★
()
Ответ на: комментарий от Tok

Уважаемый, SNAT отличается от MASQUERADE только тем, что можно назначать конкретный ip-адрес, на который будут выплевываться пакеты. При этом ни один из этих таргетов не гарантирует сохранение номера порта отправителя. Поэтому я и говорю, что SNAT может вести себя непредсказуемо. А если пакет уже прошел через DNAT, то соединение уже отслеживается и трансляция будет происходить автоматически в обоих направлениях.

Уважаемый mky уже уточнил, что по прошествии достаточно длительного периода времени простоя udp-соединение будет считаться разорванным, потому что для этого протокола нет понятия состояния соединения. Однако, думаю, инициатива при обращении к серверу всегда должна исходить от клиента. А вы считаете по-другому?

delete83 ★★
()
Ответ на: комментарий от delete83

По поводу MASQUERADE: Какой смысл маскарадинга если жёстко вбит один интерфейс " -o eth0 -j MASQUERADE " И выбора с какого айпи\интерфейса пускать пакеты нет.. а я думаю что у ТС не динамика...

Теперь по поводу инициативы: Я то согласен с вами что инициатива должна исходить от клиента но не в этом случае ТС хочет наоборот скрыть этот факт.

> А если пакет уже прошел через DNAT, то соединение уже отслеживается и трансляция будет происходить автоматически в обоих направлениях.

DNAT - Destination NAT, тоесть меняется только заголовок «пункта назначения» но не «источник»... А DNAT параметр «источник» не как не транслирует и не меняет.. Теперь чтож будет если оставить один DNAT без SNAT/MASQUERADE?

Машина с IP «А» отправляет на машину с IP «B» (записав соответственно заголовок src «A», в dst «B») Но машина «В» выполняя действие DNAT (практически сразу) меняет значения dst на IP «С» и отправляет дальше в туже сеть откуда «А» и «В» (в заголовках получилось src «A», в dst «С» )... Теперь кульминация всего процесса.. Машина «С» получает пакет, обрабатывает его и отправляет на машину источник указанную в заголовке - IP «А». Машина «А» удерживая соединения с машиной «В» (пакет оно туда отправляло) ждёт ответа от машины «B» Но ответ приходит от какого непонятного «C»! Машина «А» в своё время думает: «Ты кто такой?.. я жду ответа от „B“ а не от ко кого то „С“, соединения я открывал с „В“ поэтому иди бегай » и дропает пакет соответственно и дальше продолжает ждать от «В» ответа.. И соответственно оно не работает...

Моряль басни такова - что без правила в -t nat POSTROUTING оно работать не будет.. Но это конечно всё моё ИМХО и я так это представляю

Tok ★★
()
Ответ на: комментарий от Tok

>Теперь чтож будет если оставить один DNAT без SNAT/MASQUERADE?

Написали всё правильно, только не уточнили, что это на случай, когда на машине C маршрут до A лежит не через B. Например, если у C маршрут по умолчанию через B, то должно работать без SNAT.

Но, это скорее вопрос к ТС, что у него представляет собой 192.168.2.201, какие там машруты, приходящие с каких адресов пакеты надо DNAT'ить.

mky ★★★★★
()
Ответ на: комментарий от Tok

Ах вот зачем вам SNAT. А я то гадаю. Тогда конечно все верно.

delete83 ★★
()
Ответ на: комментарий от recon88

> именно так - отзеркалить!

Вообще-то это не зеркалирование. Зеркалирование - это
-j TEE --gateway 192.168.2.201
Только xtables надо поставить.

AS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.