Я даже не уверен, возможно ли это ... Кроме того, простите, пожалуйста, мое незнание по этому поводу.
Я ищу «что-то», что позволило бы мне перенаправить весь TCP-трафик, поступающий на хост A, на хост B, но на основе некоторых правил.
Допустим, хост A (посредник) получает запрос (скажем, простой HTTP-запрос) от хоста с доменом X. В этом случае он пропускает его, и его обрабатывает сам хост A.
Теперь предположим, что хост A получает другой HTTP-запрос от хоста с доменом Y, но на этот раз, из-за некоторых настраиваемых правил, хост A перенаправляет весь трафик на хост B, а хост B может обрабатывать его, как если бы он пришел напрямую. из домена Y. И в этот момент и хост B, и хост с доменом Y могут свободно обмениваться данными (конечно, с хостом A).
ПРИМЕЧАНИЕ. Все эти хосты находятся в Интернете, а не в локальной сети.
Пожалуйста, дайте мне знать, если объяснение недостаточно ясное.
Что вы описываете в TCP прокси. Если бы вы хотели только перенаправить HTTP-соединения, вам понадобится только HTTP-прокси.
Обычно используется TCP-прокси. rinetd
.
Пакет rinetd содержит простой инструмент, который можно настроить для прослушивания подключений на машине и перенаправления их в новое место назначения. Короче говоря, он действует как простой в настройке TCP-прокси.
Не имеет значения, находитесь ли вы в Интернете или внутри локальной сети, если вы можете выполнить маршрутизацию на новый IP-адрес и никакой брандмауэр не будет мешать вам.
Вы могли бы использовать haproxy
настроив один интерфейс с несколькими серверами в соответствии с вашими правилами:
frontend my_front
mode http
bind <ip_address>:80
option forwardfor
use_backend backend1 if <condition>
use_backend backend2 if <condition>
backend backend1
mode http
server server1 localhost:8000
backend backend2
mode http
server server2 remote_server:8000
Подробнее об этом можно прочитать на сайте haproxy: http://haproxy.1wt.eu/
Возможно, вы могли бы использовать socat?
socat TCP-LISTEN:80,fork TCP:my.newservername.com:80
Большинство аппаратных / программных брандмауэров могут сделать эту работу за вас на основе исходного IP-адреса.
Если вы хотите принять решение на основе исходного домена, то это определенно могут сделать следующие аппаратные межсетевые экраны: серия DLINK DFL (по крайней мере, старшие модели), CheckPoint, Cisco ASA.
Также говорят, что программное обеспечение FW Comodo может это делать (http://www.wilderssecurity.com/showthread.php?t=245901). Но я не уверен.
Учтите, что любое программное обеспечение, отличное от Windows, которое вам удастся найти, также можно развернуть как виртуальную машину на вашем Windows 2008R2.
Я ищу «что-то», что позволило бы мне перенаправить весь TCP-трафик, поступающий на хост A, на хост B, но на основе некоторых правил.
iptables лучший (несмотря на ненавистников)
Скажем, хост A (посредник) получает запрос (скажем, простой HTTP-запрос) от хоста с доменом X. В этом случае он пропускает его, и его обрабатывает сам хост A.
Чтобы это утверждение имело смысл, я предполагаю, что вы имеете в виду хост A, на котором запущен http на tcp / 80. между интернетом и хостом A есть другой хост, и вы маршрутизируете -s 0.0.0.0/0 на хост A: 80. если вы имеете в виду, что хост A подключен к Интернету, не делайте этого, пока вы хорошо не знаете iptables: P
Теперь предположим, что хост A получает другой HTTP-запрос от хоста с доменом Y, но на этот раз из-за некоторых настраиваемых правил хост A перенаправляет весь трафик на хост B, а хост B может обрабатывать его, как если бы он пришел напрямую. из домена Y. И в этот момент и хост B, и хост с доменом Y могут свободно обмениваться данными (конечно, с хостом A).
Хорошо, теперь я не думаю, что вы здесь говорите о слое 3/4, но слой 7 переписывает ... попробуйте .htacess на apache или даже лучше nginx (есть ли другой выбор?)
ПРИМЕЧАНИЕ. Все эти хосты находятся в Интернете, а не в локальной сети.
d00d прочитал, что я сказал выше. быстро изучить iptables. Защити себя.
Пожалуйста, дайте мне знать, если объяснение недостаточно ясное.
объяснение недостаточно ясное. сначала попробуйте g00gle.
Если то, что вам нужно, является общим решением уровня TCP, тогда вы должны принять ответ Ecolitan как правильный и присудить награду. Я вижу, вы проявили некоторый интерес к перенаправлению других служб.
Если вас интересует только HTTP, или rinetd не будет делать все, что вам нужно, тогда ответ nandoP об использовании .htaccess будет правильным (в любом случае, одно решение), но вам нужно знать немного больше. В качестве альтернативы вы можете использовать специальное программное обеспечение для прокси, такое как лак или кальмар. Если вы знакомы с Apache, вы можете придерживаться его.
Apacherule перенаправит, например, http://www.example.com/foo к http://hostb.example.com/foo, а затем, если вы что-то с этим не сделаете, hostB увидит, что поступающий запрос относится к этому домену. В зависимости от вашего веб-сайта вам, скорее всего, также потребуется исправить что-то на hostB, чтобы он не начал отправлять страницы с URL-адресами, которые ссылаются на hostb.example.com.
Если у вас более старая версия apache, вам может потребоваться исправить заголовок хоста на hostB, но с Apache 2.0.31 есть ProxyPreserveHost
директива (см. документы для mod_proxy), который вы можете поставить на hostA.
Прошло много времени с тех пор, как мне это было нужно, и я только что узнал о ProxyPreserveHost. Похоже, вам нужно что-то вроде этого на hostA (непроверено):
<VirtualHost *:80>
Servername www.example.com
RewriteEngine on
ProxyPreserveHost on
RewriteCond %{REMOTE_ADDR} ^123\.45\.67\.[0-9]*$
RewriteRule ^(.*)$ http://hostb.example.com/$1 [P]
...
</VirtualHost>
Можно было бы добавить несколько доменов в этот serverconfig, но, вероятно, лучше настроить, как указано выше, отдельно для каждого домена.
Если RewriteCond не совпадает, он будет обрабатывать другие правила в конфигурации виртуального хоста.
Я обнаружил, что следующие встроенные функции Windows идеально подходят для моих нужд, лучше, чем TCPTunnel или даже FPipe:
http://www.sysbiosis.com/blog/set-tcp-proxy-windows
Например, чтобы открыть туннель перенаправления, используйте следующее: netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport
А чтобы закрыть / остановить его, используйте следующее: netsh interface portproxy delete v4tov4 listenaddress=localaddress listenport=localport