
Ладно, возможно, это из-за того, что я тупой, а может, просто не нашёл нужный источник, но я не могу понять, почему одна из этих настроек IPTABLES лучше другой.
Вот моя установка:
У меня есть ящик, который служит прозрачным прокси и маршрутизатором или сортами. На нем есть два интерфейса, ETH0 и ETH1, и следующая схема адресации:
ETH0 = DHCP ETH1 = 192.168.5.1/24 обслуживает DHCP для сети 192.168.5.0/24 для клиентов за ней в локальной сети
У меня установлен Privoxy, который прослушивает порт 8080 как прозрачный прокси. С помощью этой настройки я хочу подключить этот ящик к существующей сети с минимальной конфигурацией и прикрепить клиентов к прокси.
Вот мой оригинальный файл IPTABLES
*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-port 8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT
Эта конфигурация работает отлично, и трафик идет туда и обратно без проблем. Я получаю исходный IP-адрес клиента в файлах журнала privoxy, и жизнь хороша.
Мое замешательство начинается, когда я начинаю смотреть на конфигурации других людей и вижу, что они используют DNAT вместо REDIRECT, и я пытаюсь понять реальное преимущество одного над другим. Вот пример конфигурации:
*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to 192.168.5.1:8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT
Опять же, эта конфигурация тоже работает и дает мне все, что нужно с точки зрения ведения журнала...
Какой из них правильный или, может быть, БОЛЕЕ правильный, чем другой?
Спасибо, что уделили время и дочитали до этого места...
решение1
REDIRECT
изменяет IP-адрес назначения для отправки на саму машину. Другими словами, локально сгенерированные пакеты сопоставляются с адресом 127.0.0.1. Это для перенаправления локальных пакетов. Если вы хотите перенаправить трафик только между службами на локальной машине, это будет хорошим выбором.
DNAT
является реальнымТрансляция сетевых адресов. Если вы хотите, чтобы пакеты, отправляемые за пределы локальной системы, имели измененный пункт назначения, то это лучший выбор из двух, поскольку он REDIRECT
не будет работать.
решение2
REDIRECT
изменяет IP-адрес назначения для отправки на саму машину, как ответил Warner@. Но я бы сказал, что этот ответ не совсем правильный или немного вводит в заблуждение.
REDIRECT
не только для перенаправления локальных пакетов. Это действительно то, DNAT
в котором IP-адрес назначения для использования неявный, 127.0.0.1, если это локальный пакет или IP-адрес интерфейса машины в противном случае, 192.168.5.1 в случае OP.
Итак, в этом вопросе, независимо от конечного пункта назначения, пакеты должны сначала достичь прокси-сервера, поэтому REDIRECT
это идеально подходит.
Поскольку REDIRECT
вам не нужно указывать IP-адрес, он просто возьмет нужный, у него есть некоторые преимущества по сравнению с DNAT
:
Если IP-адрес машины по какой-либо причине изменится, вам не нужно будет изменять правила, в частности,
DNAT
это не будет работать для интерфейсов, контролируемых DHCP.Вы можете написать и поддерживать одни и те же правила для нескольких систем (например, нескольких экземпляров прокси-сервера), не сохраняя при этом различные версии из-за конкретных IP-адресов.
решение3
DNAT и REDIRECT — это абсолютно одно и то же, если вы хотите отправить трафик на локальную машину.
В документации это описывается так: «[Перенаправление] — это особый случай целевого NAT, называемый перенаправлением: это простое удобство, которое в точности эквивалентно выполнению DNAT к адресу входящего интерфейса».
https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html#ss6.2