LinuxForum.Fans
Тема

TCP mapping

Автор: dimaonline 8 сообщений 2856 просмотров
#352175

Привет всем

существует задача: клиент извне коннектится на порт скажем 8000 на Linux IP1, а Linux пересылает все пакеты на другой сервер IP2 c портом скажем 80. Т.е. необходим аля TCP прокси или TCP forwarding. От банального HTTP прокси отличается, что сервер IP1 выступает как СЕРВЕР, а не прокси. Обращения в формате http://IP1:8000/ транслируются прозрачно в http://IP2:80/ и удаленный клиент "думает", что web на IP1, а сервер IP2, что к нему коннектится клиент с IP1 !

Необходимо это для разработчиков, а сервер IP2 - сторонний и принимает запросы только от IP1

Вариант c iptables и PREROUTE скорее всего не пойдет(я так подозреваю), потому что в этом варианте необходимо 2 nic для NAT и настройка на IP2 в качестве шлюза маршрутизации GW - IP1(а это невозможно - сервер не наш).

Существует Windows решение - на базе прокси Wingate (в нем существует специальный сервис, который так и называется TCP mapping), но я не хочу для такой простой задачи, которая потребляет 0.1% CPU держать как сейчас отдельный Windows сервер.

Есть ли какое то Linux решение ? Чтобы запустить под эту задачу простенький сервер с RAM 128Мб(а не держать Windows сервер) ?

#352177

Проксей всяких разных куча. Посмотрите, например, на squid.

#352188
yars написал:
Проксей всяких разных куча. Посмотрите, например, на squid.

я же сказал НЕ ПРОКСИ а АЛЯ-ПРОКСИ !
при получении запроса GET / или GET /index.html squid просто не будет знать, что с ним делать.

#352193

Используйте iptables. Эта задача решается с помощью netfilter.

Да, так и есть. Только что затестил на виртуалках:

[console]
# iptables -t nat -A PREROUTING -d 192.168.56.11/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.56.10:80
# iptables -t nat -A POSTROUTING -d 192.168.56.10/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.56.11
[/console]

192.168.56.10 - хост с apache-м
192.168.56.11 - хост-роутер (который маппит трафик и на котором отрабатываются правила iptables)

Для проверки с 3-его хоста (192.168.56.1):
[console]
$ telnet 192.168.56.11 80
Trying 192.168.56.11...
Connected to 192.168.56.11.
Escape character is '^]'.
GET /
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
...
</body>
</html>
Connection closed by foreign host.
[/console]

В логах на 192.168.56.10:
[console]
# cat /var/log/http/access_log
...
192.168.56.11 - - [30/Nov/2013:15:45:59 +0900] "GET /" 403 5039 "-" "-"
...
[/console]

#352221
afanasev.p написал:
Показать
Используйте iptables. Эта задача решается с помощью netfilter.

Да, так и есть. Только что затестил на виртуалках:

[console]
# iptables -t nat -A PREROUTING -d 192.168.56.11/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.56.10:80
# iptables -t nat -A POSTROUTING -d 192.168.56.10/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.56.11
[/console]

192.168.56.10 - хост с apache-м
192.168.56.11 - хост-роутер (который маппит трафик и на котором отрабатываются правила iptables)

Для проверки с 3-его хоста (192.168.56.1):
[console]
$ telnet 192.168.56.11 80
Trying 192.168.56.11...
Connected to 192.168.56.11.
Escape character is '^]'.
GET /
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
...
</body>
</html>
Connection closed by foreign host.
[/console]

В логах на 192.168.56.10:
[console]
# cat /var/log/http/access_log
...
192.168.56.11 - - [30/Nov/2013:15:45:59 +0900] "GET /" 403 5039 "-" "-"
...
[/console]

насчет iptables согласен но это не тот вариант у человека 2 внешних ip и нат тут не причем, мой совет погуглить на предмет iptables редирект (но врятле что то получится найти), если это web тогда просто подними apache или nginx или lighttpd средствами htaccess или встроенными средствами nginx просто делаться редирект на другой сервер с указанием порта.

#352325

Это всего лишь вариант решения. iptables с редиректом тут не помогут, т.к. редирект работает только в пределах одной машины. Конечно же можно использовать apache или nginx. Даже nc и ssh можно заставить это сделать. Но iptables - самое простое решение, имхо :)

Да и какая разница сколько "белых" адресов? В своих тестах я не использовал ни одного белого, и все работало :)

#352418

SNAT + DNAT. Ничего сложного. Если вы считаете, что iptables вам не нужен, либо вы не понимаете суть решения, либо вы не до конца описали задачу.

#352421
afanasev.p написал:
Это всего лишь вариант решения. iptables с редиректом тут не помогут, т.к. редирект работает только в пределах одной машины. Конечно же можно использовать apache или nginx. Даже nc и ssh можно заставить это сделать. Но iptables - самое простое решение, имхо :)

Да и какая разница сколько "белых" адресов? В своих тестах я не использовал ни одного белого, и все работало :)

да признаю был не прав... признаю SNAT/DNAT это должно помочь

Войдите или зарегистрируйтесь, чтобы ответить.