LINUX.ORG.RU

iptables - port redirect

 


0

1

Всем привет:)

У меня сегодня вот такой вопрос:

Есть четыре машины , первая и четвертая с разными версиями аппликации , которая отвечает на запросы по порту 8080/tcp.

все машины в одной сети 192.168.1.0/24

host1 192.168.1.1 host2 192.168.1.2 host3 192.168.1.3 host4 192.168.1.4

хочу что бы при обращении на первую машину вторая получала ответ первой машины , а запрос с третьей машины перебрасывался на порт четвертой машины со старой версией .

host2 -> host1:8080 host3 ->host1:8080 ---> forward to host4:8080

Пишу на первой машине такой руль :

iptables -t nat -I PREROUTING --src 192.168.1.3 -p tcp --dport 8080 -j REDIRECT --to 192.168.1.4:8080

Включаю wireshark на четвертой машине , вижу приходит пакет , но уходит не туда ..

Ну и вот. .. Тройка ждет ответа… а ответа нету .. Как всегда что то забыл ? Не подскажите, где мои грабли ?

Как всегда что то забыл ?

Возмножно такое правило (не уверен насчет корректности, ибо настраивал форвардинги немного другого плана):

iptables -A FORWARD -s 192.168.1.3 -d 192.168.1.1 -p tcp --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

И в первом, кажется, не REDIRECT, а DNAT использовался.

segfault ★★★★★
()

Думаю, ответ уходит напрямую, а не через третью машину. SNAT на третьей машине или настройка хитрой маршрутизации на четвёртой.

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

открываемся ...

# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *nat

:PREROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

-A PREROUTING -i eth1 --src 192.168.1.3 -p tcp --dport 8080 -j DNAT --to 192.168.1.4:80

COMMIT

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

-A FORWARD -p icmp -j ACCEPT

-A FORWARD -i lo -j ACCEPT

-A FORWARD -s 192.168.1.3 -d 192.168.1.4 -p tcp --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

не помогло

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

идея хорошая .. :)

маршрутизация, если я ее правильно понимаю требует конфигурации тройки ( клиент машины ) А этого мне делать низзя..я.

поэтому я на всякий случай проверил гипотезу с помощью программки , все работает.

теперь нужно без дополнительного софта , перехватить пакет , замаскировать его и перекинуть его четверке .

а когда четверка ответит , передать этот ответ тройке.

вот такая картина маслом : " Что делать , шеф ? "

evgenyra
() автор топика
Ответ на: идея хорошая .. :) от evgenyra

Реализуйте

iptables -t nat -I POSTROUTING -d 192.168.1.4 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1

А если рассматривать вариант с маршрутизацией, то она нужна на 4-ой машине, чтобы она ходила на третью через первую. В простейшем случае маршрут:

ip route add 192.168.1.3 via 192.168.1.1 dev eth0

Или более тонкая маршрутизация, с маркировкой пакетов MARK/connmark и выбрасыванием пакетов в другую таблицу маршрутизации ip rule. Но это вам нужно будет долго учить матчасть (гуглить и смотреть примеры).

Вы, похоже, пока даже не поняли, что происходит. А происходит сейчас, с вашими правилами в iptables, следующее:

1. Машина 3 отправляет запрос на машина 1, dst 192.168.1.1 src 192.168.1.3.
2. Машина 1 перенаправляет запрос на машина 4, dst 192.168.1.4 src 192.168.1.3
3. Машина 4 получает запрос от машины 3, dst 192.168.1.4 src 192.168.1.3
4. Машина 4 отвечает на запрос, dst 192.168.1.3 src 192.168.1.4
5. Так как все машины в одной сети, ответ от машины 4 идёт к машине 3 напрямую, а не через машина 1,
НО машина 3 ждёт ответа  от машины 1 и отбрасывает полученный ответ.

mky ★★★★★
()
Ответ на: Реализуйте от mky

так оно и происходит . понимание порой мучительный процесс ..

если маркировать пакеты , все равно четверка будет отвечать тройке на прямую .

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

Я правильно понимаю ?

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

Можно менять ip, можно вобще унести четвёртый в другую сеть (не физически, а по ip-адресам), чтобы четвёртый могла общаться с остальными только через первый.

А пакеты надо не просто маркировать. Нужно маркировать соединение (connmark), по маркировке соединения маркировать ответные пакеты (идущие от четвёрки) и с помощью «ip rule» отправлять эти пакеты через отдельную таблицу маршрутизации, где нет прямого маршрута между четвёркой и тройкой.

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

пошел учить мат часть. так как четверку унести в другую сеть нельзя , а таких троек клиентов может быть много .. буду идти этим курсом. Если заработает , покажу конфиг.

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