Я пытаюсь перенаправить трафик с одного сервера на другой, сохраняя исходный IP-адрес отправителя. Поэтому я не могу использовать SNAT или MASQUERADE.
СЕРВЕР A:
Публичный IP: 111.111.111.111
Частный IP: 10.0.0.1
СЕРВЕР B:
Публичный IP: 222.222.222.222
Частный IP: 10.0.0.2
Я хочу перенаправить трафик с сервера A (111.111.111.111) на сервер B (10.0.0.2).
Это отлично работает:
iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80
iptables -t nat -A POSTROUTING -j MASQUERADE
Однако, поскольку в этом случае я использую MASQUERADE, целевой сервер (10.0.0.2) видит весь трафик, как если бы он поступал с 111.111.111.111, то есть журналы apache и другие показывают все запросы, поскольку они поступают с 111.111.111.111
Как я могу настроить это вместо этого, чтобы сохранялся исходный IP-адрес источника, как это делает домашний маршрутизатор при использовании переадресации портов.
Я предполагаю, что мне нужно каким-то образом настроить «маршрут», чтобы исходящий трафик с 10.0.0.2 проходил через сервер A и не пытался отвечать на общедоступный IP-адрес сервера B?
Кажется, вы запутались в сети.
То, что вы хотите на уровне NAT, вообще не имеет смысла.
Адрес ДОЛЖЕН быть переписан в сетевых пакетах уровня 3, чтобы NAT вообще работал.
И частное IP-пространство НЕ является маршрутизируемым (в Интернете intrAnets может вести себя по-другому) в первую очередь.
Место, где вы хотите увидеть исходные IP-адреса, находится на Уровне 4: Уровень приложения. (Журналы и т. Д.) NAT вообще НЕ влияет на информацию. Вы можете увидеть IP-адрес NAT-маршрутизатора, но журналы Apache по-прежнему должны указывать, какой компьютер / имя хоста / пользователь из-за NAT запросил информацию на основе информации заголовка HTPP.
Вы смешиваете разные вещи, которые не связаны между собой.
Iptables прекрасны, но если вы сохраните все в nginx, он сможет выполнять ту работу, для которой был разработан. С помощью iptables можно выполнять другие продвинутые приемы, такие как ведение журнала и маркировка пакетов, но если у вас нет причин делать это за пределами nginx, вам следует пройти через nginx. Таким образом, если вы перейдете на другую систему, такую как (Уродливый) сервер Windows или FreeBSD, то конфигурация будет выполняться в nginx, а не на системно-зависимом уровне. Если вы беспокоитесь о скорости, это то, для чего был разработан nginx, поэтому, если вы используете некоторые из готовых или разрабатываете свои собственные мониторы журналов, это будет одинаково для каждой системы, с которой вы работаете. Linux великолепен, и не должно быть причин отказываться от него, но если вам нужно реализовать больше серверов с другими средами, все ваши конфигурации не зависят от среды.
Ваш DNAT
одного правила должно быть достаточно для преобразования адреса без необходимости добавлять MASQUERADE
в POSTROUTING
, вам просто нужно указать брандмауэру принять переведенный пакет.
Например, один из моих входящих маршрутов:
/sbin/iptables -t nat -A PREROUTING -p tcp -d $EXTERNALIP --dport 22 -j DNAT --to $INTERNALTARGET:22
/sbin/iptables -A FORWARD -p tcp -d $INTERNALTARGET --dport 22 -j ACCEPT
Судя по формулировке вашего вопроса, вы, похоже, пытаетесь перенаправить общедоступные запросы в частную подсеть, а затем в другую - если это так, вам может потребоваться настроить маршрутизацию, чтобы возвращаемые пакеты знали, куда идти. В моем примере выше я передаю запросы через общедоступный интерфейс ($ EXTERNALIP) на машину ($ INTERNALTARGET), подключенную к одной ветви частной сети, к которой маршрутизатор подключен напрямую, и этот маршрутизатор является маршрутом по умолчанию, поэтому возвращаемые пакеты знают куда идти без дополнительной помощи.