У меня есть веб-сервер за NAT, доступный в Интернете. Я использую маршрутизатор mikrotik для NAT.
Но когда доступ к веб-сайту осуществляется из Интернета или вне локальной сети, он не показывает фактический IP-адрес посетителя, а показывает IP-адрес шлюза. Я пробовал много вещей, изменяя формат журнала для назначения настраиваемого заголовка для x-forwarded, но все равно не повезло.
Правило NAT:
chain=srcnat action=masquerade
chain=dstnat action=dst-nat to-addresses=private-ip to-ports=80 protocol=tcp dst-address=public-ip dst-port=80
Apache не может регистрировать информацию, которой просто нет.
Проблема в том, что ваш маршрутизатор также маскирует исходный адрес для общедоступных IP-адресов, тогда как обычно для запросов, поступающих из Интернета, вы бы применять только NAT назначения.
Вам нужно настроить на микротике так называемое перенаправление портов
Взгляните сюда:
или здесь
Пример из моего микротика конфига перенаправления портов
Как видите, есть разница между тем, что вы опубликовали, и моей конфигурацией. В моей конфигурации src nat применяется только к моей частной сети. А строка под ним - это dst nat.
В вашей конфигурации вы делаете src nat в обоих направлениях.
Я только что сделал небольшой тест
Моему интерфейсу ether1-шлюза (тот, который обычно выходит в Интернет) назначен статический IP 10.0.0.1/16
Моя частная сеть - 192.168.10.0/24. В моей частной сети у меня есть ноутбук с Linux, подключенный к ether2-master-local, и для него установлен IP 192.168.10.247.
Этот ноутбук работает под управлением Apache
У меня на микротике такие настройки файрвола
У меня Mac подключен к интерфейсу ether1-gateway (имитирует клиент, расположенный где-то в Интернете). На этом Mac установлена версия 10.0.0.2.
А ниже - журнал доступа к apache. Как видите - отображается реальный IP клиента.