Назад | Перейти на главную страницу

Перенаправлять трафик на IP-адрес локальной сети, сохраняя исходный IP-адрес

Я пытаюсь перенаправить трафик с одного сервера на другой, сохраняя исходный 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), подключенную к одной ветви частной сети, к которой маршрутизатор подключен напрямую, и этот маршрутизатор является маршрутом по умолчанию, поэтому возвращаемые пакеты знают куда идти без дополнительной помощи.