Я бы хотел немного NAT
в iptables
. Итак, все пакеты, приходящие на 192.168.12.87
и порт 80
будет направлено 192.168.12.77
порт 80
.
Как это сделать с помощью iptables?
Или
Есть ли другие способы добиться того же?
Эти правила должны работать, если предположить, что iptables
работает на сервере 192.168.12.87
:
#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87
Вам необходимо направить входящий трафик DNAT на порт 80, но вам также необходимо будет вернуть трафик через SNAT.
Альтернатива (и лучший подход IMHO):
В зависимости от того, какой у вас веб-сервер (Apache, NGinx), вам следует рассмотреть возможность использования HTTP-прокси на своем интерфейсном сервере (192.168.12.87):
mod_proxy (Апач)
proxy_pass (NGinx)
Причина, казалось бы, очевидная iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
не будет работать, как будут маршрутизироваться возвратные пакеты.
Вы можете настроить правила, при которых пакеты, отправляемые на 192.168.12.87, будут просто преобразовываться через NAT для 192.168.12.77, но затем 192.168.12.77 будет отправлять ответы непосредственно обратно клиенту. Эти ответы не будут проходить через хост, на котором ваше правило iptables выполняет NAT, поэтому пакеты в одном направлении транслируются, а пакеты в другом - нет.
Есть три подхода к решению этой проблемы.
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
У каждого из этих трех решений есть недостатки, поэтому вам нужно внимательно подумать, действительно ли вам нужно выполнять эту конкретную пересылку.
Я думаю, что из трех подходов наиболее вероятно сработает первый. Поэтому, если вам не нужно знать IP-адреса клиентов, я бы порекомендовал именно их.
Вы также можете полностью забыть о NAT и не пытаться решить проблему на уровне MAC или IP. Вы можете пройти весь путь до уровня HTTP и найти там решение. В этом случае решение, которое вы найдете, - это HTTP-прокси. Если вы установите HTTP-прокси на 192.168.12.87 и настроите его соответствующим образом, вы можете настроить пересылку запросов на 192.168.12.77 и пересылку ответов обратно. Кроме того, он может вставлять заголовок X-Forwarded-For, сохраняя исходный IP-адрес клиента. Затем необходимо настроить сервер на 192.168.12.77 для доверия заголовку X-Forwarded-For из 192.168.12.87.