Как я могу перекрыть маскировку IP (PAT / Overload) с NAT назначения, используя iptables во внутреннем IP-пространстве?
Я пытаюсь создать частную сеть, т.е. 10.0.0.0/24
где некоторые общедоступные IP-адреса отображаются на различные адреса внутри него. Однако, если есть соединение, которое исходит из 10.0.0.0/24, независимо от того, имеет ли он общедоступный IP-адрес DNAT или нет, оно будет перегружено на конкретный общедоступный IP-адрес.
Надеюсь, я понял ваш вопрос здесь ...
Похоже, вы хотите, чтобы стандартный NAT из вашей внутренней сети исходил к одному IP снаружи - да? Эта часть достигается с помощью этого:
iptables -t nat -A POSTROUTING -o $EXTERNAL_NIC -j MASQUERADE
Что касается сопоставления общедоступных IP-адресов с внутренними IP-адресами, это должно работать для каждого из них:
iptables -t nat -A PREROUTING -d $EXTERNAL_IP -j DNAT --to $INTERNAL_IP
Это даст вам одностороннюю карту для внешних IP-адресов. Трафик, поступающий с одного общедоступного IP-адреса, будет передан внутреннему блоку, а затем он будет отвечать, но ответ будет передан через внешний IP-адрес по умолчанию. Это может быть не тот. Это может вызвать проблемы с клиент-серверными приложениями.
Надеюсь, я тоже понимаю ваш вопрос. Ваш ответ Люку в комментариях к ответу Баумгарта заставил меня усомниться в моем понимании ваших требований, но я все равно опубликую это.
То, что Баумгарт говорит вам в своем ответе, сработает, но его последний абзац, где он говорит о «... вероятно, вызовет проблемы с клиент-серверными приложениями ...» неверен. Он забывает, что реализация NAT Netfilter сохраняет состояние. Этот постоянный характер механизма NAT в Netfilter - ваш друг.
Когда диалог между Интернет-хостом и одним из ваших общедоступных IP-адресов получает DNAT-соединение с частным IP-адресом, Netfilter не будет «МАСКАДАТЬ» ответные пакеты, приходящие с частного IP-адреса обратно на Интернет-хост. Это не значит, что ответные пакеты не имеют NAT, но они не "ЗАМАСКИРОВАНЫ". Скорее, неявность Netfilter «делает правильные вещи», и SNAT отправляет ответные пакеты с частного IP-адреса обратно на общедоступный IP-адрес, с которым узел Интернета инициировал диалог. Это действительно очень красиво.
Между тем, для разговоров, исходящих с частного IP-адреса в Интернет (не в ответ на входящие запросы из Интернета), будет применяться правило «MASQUERADE».
По сути, Netfilter делает то, что вы хотите, «из коробки». Я потратил некоторое время и смоделировал это на тестовой установке, чтобы быть уверенным, и, пока я правильно понимаю ваши требования, он делает именно то, что вы ищете.
(Извините за то, что не смог ответить ранее днем - я был занят некоторыми вещами ранее сегодня и не мог, знаете, играть в Server Fault так часто, как мне хотелось бы.)