LINUX.ORG.RU
решено ФорумAdmin

Странное поведение iptables

 


0

2

Я уже создавал тему Настройка сети с виртуальным окружением в которой у меня разрешилось все само собой, я даже ничего не сделал, все просто заработало после перезагрузки, при этом правила я не менял !!!

Теперь у меня другая проблема. Задача тупейшая: перенаправить пакеты с порта 55900 снаружи во внутрь на порт 5900

Правила такие:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 55900 -j DNAT --to-destination 127.0.0.1:5900
iptables -A INPUT -i ppp0 -p tcp --dport 5900 -d 127.0.0.1 -j ACCEPT
однако порт 55900 снаружи все равно виден как закрытый. tcpdump фиксирует приходящие на 55900 порт пакеты, в таблице mangle цепочки PREROUTING пакеты логируются, в таблице nat цепочки PREROUTING пакеты логируются до правила DNAT и не логирются после, что логично.

В таблице mangle цепочек INPUT и FORWARD пакеты на порт 5900 не логирются вообще.

*mangle
:PREROUTING ACCEPT [3770:2898529]
:INPUT ACCEPT [3770:2898529]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4037:2843934]
:POSTROUTING ACCEPT [4037:2843934]
-A INPUT -p tcp -m tcp --dport 5900 -j LOG
-A INPUT -p tcp -m tcp --dport 55900 -j LOG
-A FORWARD -p tcp -m tcp --dport 5900 -j LOG
-A FORWARD -p tcp -m tcp --dport 55900 -j LOG
COMMIT
# Completed on Sun Oct 21 15:51:42 2012
# Generated by iptables-save v1.4.16.2 on Sun Oct 21 15:51:42 2012

Вот вся mangle. Такого происходить не должно, не так ли ? Хоть куда то эти сраные пакет попадать должны ! У меня подозрения на баг в ядре, или собственную тупость. Могу отправить полный iptables-save в личку, если этой инфы не достаточно.

16:04 root@localhost /root # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         91.144.128.76   0.0.0.0         UG    0      0        0 ppp0
91.144.128.76   0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
127.0.0.0       127.0.0.1       255.0.0.0       UG    0      0        0 lo
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
virtbr0 - создано либвиртом не знаю как выключить, он еще и в правила добавляет, но эти правила влиять ни на что не должны - там в правилах явно другая подсеть.

PS может я что то не так понимаю в iptables ? Совершенно аналогичное правило с перенаправлением на другой адрес работает, пакеты логирются и проходят в FORWARD на адрес.

16:04 root@localhost /root # uname -a
Linux localhost 3.6.1-gentoo #1 SMP Thu Oct 11 06:42:59 YEKT 2012 x86_64 Intel(R) Celeron(R) CPU G540 @ 2.50GHz GenuineIntel GNU/Linux

★★

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

Такого происходить не должно, не так ли ? Хоть куда то эти сраные пакет попадать должны !

TCP/IP стек ядра отбрасывает подобные пакеты по умолчанию, см. Martian packet (Wiki) и исходники ядра.

Чтобы убедиться в том, что это действительно так, нужно включить логирование подобных пакетов:

echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

...и затем после попытки подключения проверить вывод dmesg.

Один из вариантов решения проблемы будет использование цели REDIRECT в iptables:

iptables -t nat -A PREROUTING -p tcp --dport 55900 -j REDIRECT --to-ports 5590

Не так давно в ядро добавили возможность конфигурировать поведение TCP/IP стека при маршрутизации пакетов в/из сети 127.0.0.0/8. Параметр называется route_localnet, но на мой взгляд это будет не самым лучшим решением проблемы, лучше «перевесить» необходимый вам сервис на другой сетевой интерфейс.

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

Блин, ну точно ! Есть же REDIRECT. Про Martian packets спасибо, не знал что такое есть. Буду теперь проверять.

Чето я реально затупил. Раньше ведь как раз через REDIRECT такое делал. Спасибки.

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

Во первых форвард включен, во вторых он тут не причем, так как днат на 127.0.0.1 в третьих уже ответили.

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

Не понял.

FORWARD - это цепочка правил в iptables

DNAT - это замена целевого адреса в пакете

Да и кто сказал что я хочу через форвард ? (что хочу ?)

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

DNAT

я лишь хотел сказать что искомого можно добиться 2 способами: через REDIRECT и через FORWARD/DNAT. рецепты все есть в инете и именно первоначально описанный способ у мну работает в 1 месте. причём и udp тоже под DNAT. при этом INPUT тут вообще не при делах (читай почему так - в описании логики работы iptables, судя по упоминанию mangle -в голове ТС каша по этому поводу).

-t nat -A PREROUTING -i ethX -p udp --dport PORT --dst IP -j DNAT --to IP2:PORT2 -A FORWARD -p udp -o ethY --dport PORT2 -j ACCEPT

этих 2 правил - достаточно. это - работающий конфиг IRL.

и да, я не зря спрсоил про включённый IPv4 forwarding - уже столько раз на этом спотыкались .:-)

mumpster ★★★★★
()
Ответ на: DNAT от mumpster

этих 2 правил - достаточно. это - работающий конфиг IRL.

ТС'у нужно роутить пакеты на loopback интерфейс, поэтому такая схема будет работать только после дополнительной настройки TCP/IP стека.

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

ааа, точно. это - небольшой гемор, да. извиняюсь, loopback проглядел

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