Существует шлюз на базе интрасети и CentOS, который обеспечивает связь для устройств интрасети.

Типичная переадресация портов в наборе правил iptables шлюза выглядит следующим образом (предоставляется версия TCP):

$IPTABLES -A PREROUTING -t nat -i $EXTERNAL_IF -p tcp -d $EXTERNAL_IP \
    --dport $EXTERNALPORT -j DNAT --to $INTERNAL_IP:$INTERNAL_PORT
$IPTABLES -A FORWARD -i $EXTERNAL_IF -p tcp -d $INTERNAL_IP \
    --dport $INTERNAL_PORT -j ACCEPT

$ EXTERNAL_IP:$ EXTERNAL_PORT недоступен из интрасети в такой конфигурации.

Есть ли способ перенаправить весь внутренний (исходящий из интрасети) трафик в $ EXTERNAL_IP:$ EXTERNAL_PORT напрямую в $ INTERNAL_IP:$ INTERNAL_PORT?

Добавление правил, таких как

$IPTABLES -A PREROUTING -t nat -s $INTRANET -p tcp -d $EXTERNAL_IP \
    --dport $EXTERNALPORT -j DNAT --to $INTERNAL_IP:$INTERNAL_PORT
$IPTABLES -A FORWARD -s $INTRANET -p tcp -d $INTERNAL_IP \
    --dport $INTERNAL_PORT -j ACCEPT

где $ INTRANET - это CIDR для адресов в интрасети, не работает.

В результате мне нужно сохранить исходные адреса устройств внутренней сети (цель должна знать точное происхождение соединения).

Пока что используется статическое переопределение для IP в файлах хостов, что не удобно.

1 ответ1

1

Конечно, это не работает.

Давайте на мгновение проследим за пакетом, покидающим YOUR_PC, перейдя на веб-сайт с внешним IP-адресом HTTP_EXT и внутренним IP-адресом HTTP_LAN. Давайте сначала рассмотрим оригинальное правило iptables.

  1. Пакет оставляет YOUR_PC идущим к HTT_EXT, идет к маршрутизатору CentOS;

  2. CentOS-маршрутизатор перехватывает его, переписывает исходный адрес как собственный и отправляет пакет в HTTP_LAN вместо HTTP_EXT;

  3. HTTP_LAN получает пакет, видит, что он поступил из CentOS, и отвечает на него;

  4. CentOS получает ответный пакет, запоминает, что он был частью разговора с DNAT, переписывает адрес ответа как HTTP_EXT вместо HTTP_LAN и отправляет его в YOUR_PC.

  5. YOUR_PC видит ответный пакет от HTTP_EXT, в который он записал. Все хорошо.

Но теперь, что произойдет , если вы могли бы делать то , что вы хотите сделать:

  1. Пакет оставляет YOUR_PC идущим к HTT_EXT, идет к маршрутизатору CentOS;

  2. CentOS-маршрутизатор перехватывает его, не переписывает исходный адрес как собственный и отправляет пакет в HTTP_LAN вместо HTTP_EXT;

  3. HTTP_LAN получает пакет, видит, что он получен от YOUR_PC, и отвечает на него, не проходя через CentOS;

  4. YOUR_PC получает пакет от HTTP_LAN, в то время как он записал в HTTP_EXT. По очевидным причинам безопасности он отбрасывает ответный пакет.

Так что в этом случае это не работает, как вы сказали. Иначе говоря: это преобразование адреса INTRANET работает тогда и только тогда, когда вы одновременно выполняете DNAT и SNAT.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .