Привет всем
существует задача: клиент извне коннектится на порт скажем 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 сервер) ?
TCP mapping
Проксей всяких разных куча. Посмотрите, например, на squid.
Проксей всяких разных куча. Посмотрите, например, на squid.
я же сказал НЕ ПРОКСИ а АЛЯ-ПРОКСИ !
при получении запроса GET / или GET /index.html squid просто не будет знать, что с ним делать.
Используйте 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. Эта задача решается с помощью 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 просто делаться редирект на другой сервер с указанием порта.
Это всего лишь вариант решения. iptables с редиректом тут не помогут, т.к. редирект работает только в пределах одной машины. Конечно же можно использовать apache или nginx. Даже nc и ssh можно заставить это сделать. Но iptables - самое простое решение, имхо :)
Да и какая разница сколько "белых" адресов? В своих тестах я не использовал ни одного белого, и все работало :)
SNAT + DNAT. Ничего сложного. Если вы считаете, что iptables вам не нужен, либо вы не понимаете суть решения, либо вы не до конца описали задачу.
Это всего лишь вариант решения. iptables с редиректом тут не помогут, т.к. редирект работает только в пределах одной машины. Конечно же можно использовать apache или nginx. Даже nc и ssh можно заставить это сделать. Но iptables - самое простое решение, имхо :)
Да и какая разница сколько "белых" адресов? В своих тестах я не использовал ни одного белого, и все работало :)
да признаю был не прав... признаю SNAT/DNAT это должно помочь