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

Переадрессация портов с помощью DNAT


0

1

Вечер добрый сообществу! Ситуация: надо перенаправлять трафик с 80-го порта с одного сервера на другой, который не находится в локальной сети. Сервер должен знать адрес клиента, нужно просто выполнить подстановку адреса получателя. Как я понимаю, это задача DNAT.

Делаю следующее:

iptables -t nat -A PREROUTING --dst 192.168.1.12 -p tcp --dport 80 -j DNAT --to-destination 91.100.100.100:80

Добавил еще следующие правила:

iptables -A FORWARD -p tcp -m state --state NEW -d 91.100.100.100 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -i eth0 -j ACCEPT

и SNAT:

iptables -t nat -A POSTROUTING -p tcp --dst 91.100.100.100 --dport 80 -j SNAT --to-source 192.168.1.12

Проблема: В переадрессованных пакетах remote address - адрес сервера, который их перенаправил, а не клиента.

Такой рецепт не подходит если сервер находится не в локальной сети? Как быть?

★★★

В переадрессованных пакетах remote address - адрес сервера, который их перенаправил, а не клиента.

--to-source 192.168.1.12

Простите, вы же сами подстановку source адреса делаете, а потом вам же не нравится результат?

zgen ★★★★★ ()

html:

<meta http-equiv='refresh' content='0,URL'>

php:

header(«Location: ».$url);

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

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

Я правильно понимаю, что предлагаете с первого сервера просто редиректнуть на другой адрес? Такое не устраивает поскольку нужно скрыть реальное место нахождение сервера с сайтом.

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

тогда одно не согласуется с другим NAT - это трансляция адресов и после форварда будет адрес того кто переадресовал пакет

как вариант на сайте анализировать $_SERVER[remote_addr] и иже с ним HTTP_X_FORVARDED_FOR HTTP_REMOTE_ADDR ....

jaw ()
Ответ на: комментарий от observer

Надо разбираться, почему не работает. Смотрите пакеты, скорее всего 91.100.100.100 пытается отвечать клиентам напрямую, а не через 192.168.1.12.

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

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

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

поможет, если вы согласны весь траффик пускать через впн.
ещё может помочь mod_rpath, или что-нибудь аналогичное в вашем http-сервере, если у вас не апач.

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

Я правильно понимаю, что в случае использования VPN, правило будет выглядеть:

iptables -t nat -A PREROUTING --dst 10.0.0.2 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.3:80
+ необходимо добавить форвардинг 192.168.1.12 > 10.0.0.2 ? Остальное наверное не поможет - используется apache.

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

iptables -t nat -A PREROUTING --dst 192.168.1.12 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.3:80
iptables -t nat -A POSTROUTING -s 10.0.0.3/32 --out-iterface ${тут название интерфейса 192.168.1.12} --to-source 192.168.1.12
и на сервере с http-сервером прописать роут до тех сетей, с которых на него будут обращаться через 192.168.1.12 через 10.0.0.2 (например ip route add 192.168.1.0/24 via 10.0.0.2 )

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

tcpdump вполне подойдёт для данной задачи. Вам главное увидеть, что если пакет от любого хоста, пройдя DNAT ушёл на 91.100.100.100, то и ответ от него пришёл обратно на ту машину, которая делала DNAT.

«tcpdump -i eth?? -n -nn host 91.100.100.100 and port 80»

VPN это будте правильно, и, раз уж нет задачи шифрования и т.д. хватит, ИМХО, обычного GRE-тунеля. На http сервере можно прописать машруты по-хитрому (через MARK/CONNMARK в iptables + ip rule), чтобы от сервера в тунель заворачивались только пакеты, идущие в ответ от DNAT соединений).

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

Без VPN - сервер на который форвардится порт не видит адрес 192.168.1.12.

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

Решение с VPN помогло. Добавил два правила:

iptables -t nat -A PREROUTING --dst 192.168.1.12 -p tcp --dport 80 -j DNAT --to-destination 10.112.0.2:80
iptables -t nat -A POSTROUTING --dst 10.112.0.1 -j SNAT --out-interface eth0 --to-source 192.168.1.12

Появилась новая проблема: работает не у все клиентов, которые заходят на сайт. Видимо зависит от провайдера. Как такое может быть?

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

Позволит на http-сервере прописать «обратный» маршрут через сервер, делающий DNAT.

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

Зачем SNAT и что такое 10.112.0.1?

Нужно искать клиента, у которого не работает и смотреть его трафик.

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