Как Nginx за NAT определяет оригинальный IP-адрес клиента?

Вопрос или проблема

Как Nginx за NAT определяет оригинальный IP-адрес клиента?

У меня есть виртуализированный роутер с публичным IP-адресом, который назначен ему напрямую в Proxmox. Когда я отправляю запрос на порт 443 из другой сети (из браузера), роутер правильно перенаправляет его на мой контейнер NGINX с частным IP-адресом.

Поскольку роутер выполнил NAT на пакете с публичного IP на локальный адрес 10.0.0.0/8, как NGINX знает, каков был оригинальный IP-адрес клиента? Он правильно отображает мой публичный IP в access.log, но вся информация о IP, которую он должен видеть, была бы приватным IP роутера, не так ли?

Также, когда я проверяю заголовки в сетевой вкладке на клиенте, там нет заголовка X-Forwarded-For, к тому же, нет и другого обратного прокси (насколько я знаю), который мог бы добавлять этот заголовок, определенно не с правильными SSL-сертификатами, чтобы иметь такую возможность.

Спасибо

Потому что роутер переводит адрес назначения входящих IP-пакетов (в сторону публичного IP вашего роутера) и переводит их, чтобы они имели адрес назначения вашего частного IP-адреса NGINX (когда он перенаправляет пакеты дальше), оставляя адрес происхождения в пакетах неизменным.

Таким образом, изменяется только адрес назначения, а не исходный (адрес происхождения), который, я полагаю, называется DNAT.

Роутер может это делать, потому что он может отслеживать соединение внутри себя, в своей собственной таблице отслеживания NAT. Любые пакеты, возвращающиеся от NGINX, могут быть снова корректно обработаны при выходе, как только начальное входящее соединение было отслежено и установлено.

Этот процесс сохраняет адрес источника, и поэтому NGINX знает, что это за адрес.

Ответ или решение

Когда Nginx работает за NAT (Network Address Translation), он может определять исходный IP-адрес клиента по нескольким причинам, связанным с особенностями работы NAT.

  1. Принцип работы NAT: Ваша виртуализированная маршрутизаторская система использует методы преобразования адресов (NAT) для перенаправления входящих соединений с публичного IP-адреса на приватный IP-адрес Nginx. При этом, когда маршрутизатор получает пакет от клиента, он меняет только адрес назначения, сохраняя исходный адрес клиента (IP-адрес) неизменным. Это изменение называется DNAT (Destination NAT), где маршрутизатор отслеживает соединение и знает, какой исходный адрес за ним стоит.

  2. Отслеживание соединений: Для отслеживания открытых соединений маршрутизатор ведет внутреннюю таблицу NAT, в которой сохраняет информацию об исходящих и входящих пакетах, что позволяет ему связывать исходные адреса с соединениями. Таким образом, когда Nginx отвечает на запрос, маршрутизатор знает, какие пакеты должен отправить обратно клиенту, и использует хранящиеся данные из таблицы NAT для корректной обработки ответов.

  3. Отсутствие X-Forwarded-For: Если в заголовках запросов от клиента действительно нет X-Forwarded-For, это не означает, что Nginx не имеет доступа к исходному IP-адресу клиента. Дело в том, что X-Forwarded-For – это дополнительный заголовок, который часто используют другие прокси-серверы или балансировщики нагрузки для информирования серверов об исходном IP-адресе, когда NAT производится другими устройствами. Однако в вашем случае маршрутизатор просто не изменяет IP-адрес клиента, что и позволяет Nginx видеть исходный IP.

  4. Логи Nginx: В логах доступа Nginx (access.log) отображается именно тот IP-адрес клиента, с которого поступил запрос, и это возможно благодаря тому, что, как уже упоминалось, маршрутизатор не меняет исходный IP-адрес. Таким образом, если вы видите в логах Nginx ваш публичный IP, это скорее всего означает, что маршрутизатор также производит преобразование адреса в обратном направлении, сохраняя для Nginx информацию о исходном IP.

В итоге, Nginx на вашем сервере может корректно определять IP-адрес клиента благодаря природе работы NAT в вашем маршрутизаторе, который, сохраняя исходный адрес, передает его на внутренний сервис. Это делает возможным дальнейшую обработку и логирование IP-адресов без каких-либо дополнительных заголовков.

Оцените материал
Добавить комментарий

Капча загружается...