MASQUERADE или как пробросить запрос на другой сервер

Иногда возникают ситуации, когда необходимо предоставить доступ внешним пользователям,к какому-либо сервису, закрытому корпоративным Firewall-ом.

В этом случае к нам на помощь приходит IPTables и "маскарадинг" (MASQUERADE).
То есть, фактически, мы должны "обмануть" клиента, позволив ему "думать", что запрашиваемый сервис физически работает на сервере "А", но "прозрачно" пробрасывать его запрос на сервер "B".

Это делается с помощью команды MASQUERADE в IPTables.

Сначала, нужно убедиться, что IP-forwarding включен:

sysctl net.ipv4.ip_forward=1

Затем, добавить в IPTables (сервера "A") следующие строки:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 1.2.3.4:3000
iptables -A FORWARD -d 1.2.3.4 -p tcp --dport 3000 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

1.2.3.4 и 3000 - это адрес и порт сервера "B" (необязательно в нашей внутренней сети!), который закрыт корпоративным Firewall-ом, недоступен снаружи, или, что саще бывает, доступен только с сервера "A", но к которому мы открываем доступ, пробрасывая запросы, пришедшие на порт 80 сервера "A".

Всё.
Теперь при запросе к серверу "A", запрос будет пробрасываться на сервер "B":
при обращении, например - http://server-a.com реальные данные будут приходить с сервера 1.2.3.4 и его порта 3000.