При использовании Nginx в качестве обратного прокси-сервера по умолчанию внутренний сервер может видеть только IP-адрес Nginx. Для регистрации, ограничения доступа или выполнения других операций на основе IP-адреса важно получить реальный IP-адрес клиента.
Nginx предоставляет два основных модуля для удовлетворения этого требования:
Здесь мы в основном представляем HttpRealipModule
。
В большинстве случаев Nginx Уже включено HttpRealipModule
。Вы можете проверить это с помощью следующей команды:
nginx -V 2>&1 | grep -o with-http_realip_module
Если этот модуль не включен, вам необходимо перекомпилировать Nginx или установить версию Nginx, включающую этот модуль.
отредактируйте свой Nginx файл конфигурации (обычно находится в /etc/nginx/nginx.conf
или /etc/nginx/conf.d/
файл), добавьте следующую конфигурацию:
http {
...
set_real_ip_from 0.0.0.0/0; # разрешить все IP адресиз Агент
real_ip_header X-Forwarded-For;
real_ip_recursive on;
...
server {
...
location / {
...
# Если вам нужно записать правду в бревно IP
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log custom;
...
}
}
}
set_real_ip_from
: Какие из них разрешены IP Адрес может служить доверенным прокси-сервером. Если ваш прокси-сервер находится в определенном IP в рамках области действия только те, которые разрешены IP。real_ip_header
: Указывает, какое поле заголовка содержит истинное значение. IP Адрес обычно используется. X-Forwarded-For
。real_ip_recursive
: Проверка рекурсивно X-Forwarded-For
все в голове IP адрес до тех пор, пока не будет найден первый ненадежный прокси IP。X-Forwarded-For
Заголовок может содержать несколько IP Адрес представляет собой серию прокси-серверов. Убедитесь, что настроено real_ip_recursive on
Получайте первый клиентиз правильно IP адрес.set_real_ip_from
будьте осторожны, не доверяйте бесконтрольному IP адрес, в противном случае это может привести к IP изменять.curl
Чтобы смоделировать запрос, принесите X-Forwarded-For
Заголовок, наблюдайте за ответом сервера и протоколированием.curl -H "X-Forwarded-For: 203.0.113.195" http://your-nginx-server
В файл конфигурации необходимо добавить формат журнала $http_x_forwarded_for. Основное содержимое следующее.
http {
include mime.types;
default_type application/octet-stream;
log_format main ' $remote_addr | $http_x_forwarded_for | $remote_user | $time_local | $request | $http_host |'
' $status | $upstream_status | $body_bytes_sent | $http_referer '
' $http_user_agent | $upstream_addr | $request_time | $upstream_response_time';
$http_x_forwarded_for необходимо добавить в формат журнала узла http.
log_format
Директивы используются для определения Nginx избревно Формат。это указано вбревно Что записано в файлеинформацияи как Форматтрансформировать этиинформация。каждое полеиспользоватьпеременная представляет,Переменные могут быть разделены разделителями,Такие как пространства、вертикальная линия(|
)ждать。определениеизбревно Форматможет быть применен к access_log
Директива для регистрации деталей запроса клиента.
Ниже приводится log_format
Значение каждой переменной в инструкции:
log_format main ' $remote_addr | $http_x_forwarded_for | $remote_user | $time_local | $request | $http_host |'
' $status | $upstream_status | $body_bytes_sent | $http_referer '
' $http_user_agent | $upstream_addr | $request_time | $upstream_response_time';
$remote_addr
: клиентиз IP адрес.Это напрямую связано с Nginx изклиентиз IP адрес.$http_x_forwarded_for
: клиентистина IP адрес Обычно используется для регистрации файлов через прокси-сервер, балансировщик нагрузки и зклиент. IP адрес,X-Forwarded-For
В шапке есть такие IP。$remote_user
: имя пользователя клиента, если требуется HTTP Имя пользователя записывается во время базовой аутентификации. Если аутентификационная информация отсутствует, это -
。$time_local
: Местное время и дата в формате day/month/year:hour:minute:second
。$request
: Запросить полноту URI, включая параметры. Формат: METHOD URI PROTOCOL
,Например GET /index.html HTTP/1.1
。$http_host
: Запрос Host
Содержимое заголовка — это имя посещенного хоста.$status
: отзывчивый HTTP код состояния, например 200
указывает на успех,404
Указывает, что не найдено,500
Указывает на внутреннюю ошибку сервера и т. д.$upstream_status
: Код состояния, возвращаемый вышестоящим сервером. когда Nginx При работе в качестве обратного прокси-сервера эта переменная записывает код состояния ответа вышестоящего сервера.$body_bytes_sent
: Количество байтов содержимого тела ответа, отправленного клиенту, без учета размера заголовка ответа.$http_referer
: проситьиз Страница цитирования,С какой страницы ссылка?из(Referer
содержимое заголовка). Если справочной страницы нет, то -
。$http_user_agent
: клиентиспользоватьиз Браузерилидругойклиентизинформация(User-Agent
содержимое заголовка).$upstream_addr
: Вышестоящий сервер изадрес.когда Nginx При работе в качестве обратного прокси-сервера эта переменная записывает данные вышестоящего сервера. IP адрес и порт.$request_time
: иметь дело спроситьизобщее время,Время от получения клиентского запроса до завершения отправки отзывчивого,Единица измерения — секунды.$upstream_response_time
: Считайте время отклика с вышестоящего сервера в секундах.server {
listen 80;
server_name localhost;
access_log logs/access.log main; #нуждатьсядобавить вбревно Цитата
proxy_set_header X-Real-IP $remote_addr; #добавить всквозной Конфигурация proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
location / {
root html;
}
}
https://www.cnblogs.com/shouke/p/15511149.html
Используйте директиву proxy_set_header, чтобы установить прозрачный заголовок передачи. Убедитесь, что прокси-серверы (например, Nginx) сохраняют IP-адрес исходного клиента при пересылке запросов.
Посетите страницу Nginx
журнал доступа
192.168.0.6 | 168.138.171.206 | - | 19/May/2024:10:57:24 +0800 | GET / HTTP/1.1 | nginx.frps.fun | 200 | - | 615 | - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 | - | 0.000 | -
192.168.0.6
:
168.138.171.206
:
X-Forwarded-For
Руководитель Get изклиентистина IP адрес. При прохождении через прокси или балансировщик нагрузки в этом заголовке будет записан исходный клиентский адрес. IP адрес.-
:
-
。19/May/2024:10:57:24 +0800
:
day/month/year:hour:minute:second timezone
。В данном примере это означает 2024 Год 5 луна 19 утро 10:57:24, часовой пояс +0800。GET / HTTP/1.1
:
nginx.frps.fun
:
Host
Заголовок, указывающий, что клиент запрашивает доступ к имени хоста.200
:
200
Олицетворяет успех.-
:
-
。615
:
-
:
-
。Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
:
-
:
-
。0.000
:
-
:
-
。Если перед нами нет apisix или другого lb, мы также можем использовать команду curl для имитации X-Forwarded-Forbrevno
curl http://127.0.0.1/ -H 'X-Forwarded-For: 1.1.1.1' -v
* About to connect() to 127.0.0.1 port 80 (#0)
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1
> Accept: */*
> X-Forwarded-For: 1.1.1.1 Параметр #-v может видеть, что параметры здесь были переданы.
>
< HTTP/1.1 200 OK
< Server: nginx
< Date: Sun, 19 May 2024 03:09:05 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 615
< Last-Modified: Mon, 09 Oct 2023 06:03:57 GMT
< Connection: keep-alive
< ETag: "652397cd-267"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
#http:127.0.0.1 Это сервер Nginx
бревно
127.0.0.1 | 1.1.1.1 | - | 19/May/2024:10:57:24 +0800 | GET / HTTP/1.1 | 127.0.0.1 | 200 | - | 615 | - | curl/7.29.0 | - | 0.000 | -
Из файла бревно logs/access.log в, могу проверить X-Forwarded-For Правильно ли записана информация заголовка, Эта бревно запись показывает, что X-Forwarded-For передано в шапке 1.1.1.1 Правильно документировано.