Я хотел бы сделать немного NAT
в iptables
. Таким образом, все пакеты, приходящие на 192.168.12.87
порт, 80
будут перенаправлены на 192.168.12.77
порт 80
.
Как это сделать с помощью iptables?
Или же
Есть ли другие способы добиться того же?
linux
iptables
port-forwarding
сидел
источник
источник
192.168.12.87
. Итак, мне нужно отправить все запросы192.168.12.77
.iptables
. И я видел несколько примеров. Но, похоже, требуется два Ethernet. Ссылка: revsys.com/writings/quicktips/nat.htmlОтветы:
Эти правила должны работать, предполагая, что
iptables
работает на сервере192.168.12.87
:Вы должны DNAT входящий трафик через порт 80, но вам также нужно SNAT трафика обратно.
Альтернатива (и лучший подход ИМХО):
В зависимости от того, какой у вас веб-сервер (Apache, NGinx), вы должны использовать HTTP-прокси на сервере переднего плана (192.168.12.87):
mod_proxy (Apache)
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.
источник
-j MASQUERADE
здесь не упоминается; Разве это не обычный подход с DNAT?SNAT
вместоMASQUERADE
, потому что это то, что говорится в документации. Точная формулировка в документации:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.