Обратный прокси (reverse proxy)
Обратный прокси (reverse proxy) это сервер, который стоит перед одним или несколькими backend-серверами, принимает запросы клиентов, пересылает их на нужный backend и возвращает ответ. Клиенты общаются только с прокси. Его используют для терминации TLS, кеширования, балансировки нагрузки и сокрытия исходного сервера, а nginx один из самых частых вариантов.
Что такое обратный прокси и чем он отличается от прямого
Руководство MDN делит прокси на два вида. Прямой прокси работает от имени клиентов, например для кеширования или сокрытия того, кто просматривает сайты. Обратный делает противоположное: работает от имени серверов и контролирует и защищает доступ к ним для балансировки нагрузки, аутентификации, расшифровки или кеширования. Посетители видят один публичный адрес и не узнают, какой backend ответил.
В nginx руководство по обратному прокси описывает задачу как отправку запроса клиента проксируемому серверу, получение ответа и возврат его клиенту. Ключевая директива это proxy_pass внутри location. Она может указывать на один backend или на именованную группу серверов, а соседние директивы вроде fastcgi_pass и uwsgi_pass покрывают не-HTTP протоколы приложений. Типичные задачи: терминация TLS один раз на границе, кеширование ответов и распределение нагрузки.
Минимальный обратный прокси на nginx и как его проверить
Этот блок терминирует TLS и передаёт запросы приложению на том же хосте. Заголовок Host важно задать, потому что, как сказано в документации nginx, по умолчанию он равен $proxy_host, то есть адресу backend:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Проверьте и перезагрузите конфигурацию без разрыва соединений командой sudo nginx -t && sudo systemctl reload nginx, затем посмотрите заголовки ответа через curl -I https://example.com/. Помните: URI в proxy_pass заменяет совпавшую часть пути запроса, а без URI путь передаётся как есть, что объясняет справочник по модулю proxy. По умолчанию nginx также буферизует ответ backend (proxy_buffering on) и ждёт между чтениями не более 60 секунд (proxy_read_timeout).
Реальный IP клиента и проблема доверия
За прокси backend видит адрес прокси вместо клиента. Исходный адрес несёт заголовок X-Forwarded-For, но MDN говорит прямо: если сервер доступен напрямую, ни одной части этого списка доверять нельзя, а для защитных задач, таких как ограничение частоты, нужно брать только адреса, добавленные доверенным прокси. Любой клиент может отправить поддельный заголовок.
Модуль realip не собирается по умолчанию и подменяет адрес клиента только для перечисленных отправителей:
set_real_ip_from 192.0.2.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
Доверяйте только адресам собственных прокси. Широкий диапазон в set_real_ip_from позволяет любому внутри него выбрать себе адрес и обойти limit_req или списки разрешённых. Если прокси в цепочке несколько, real_ip_recursive on заставляет nginx брать из заголовка последний недоверенный адрес, а не просто последний.
Плюсы для безопасности, риски и место в защите
Обратный прокси даёт одно место, где можно настроить TLS, заголовки безопасности, ограничение частоты запросов и WAF, а CDN перед ним может поглотить флуд до того, как он дойдёт до вас. Он также скрывает исходный сервер, но только пока его адрес остаётся закрытым. Если backend по-прежнему отвечает из открытого интернета, атакующие могут обойти прокси целиком, поэтому закройте его межсетевым экраном для всех, кроме прокси.
Риски связаны с настройкой. Прокси это единая точка отказа. Неверное доверие к пересылаемым заголовкам ломает журналы и лимиты. Если цель proxy_pass строится из данных клиента, например $http_host, посетители выбирают, куда подключается nginx, и он превращается в открытый прокси. Пройдите руководство по безопасности nginx, а о роли CDN и об атаке SYN-флуд читайте в руководстве по защите от DDoS.
Связанные термины: nginx, TLS / SSL, WAF, Ограничение частоты запросов, limit_req.
Часто задаваемые вопросы
Что такое обратный прокси простыми словами?
Это сервер перед вашими настоящими серверами. Посетители подключаются к нему, а он передаёт их запросы нужному backend и возвращает ответ.
Чем прямой прокси отличается от обратного?
Прямой прокси работает от имени клиентов, например скрывает или кеширует их трафик. Обратный работает от имени серверов: для балансировки, кеширования, расшифровки и защиты.
Как nginx работает обратным прокси?
Используйте директиву proxy_pass внутри блока location, чтобы отправлять запросы на backend, например http://127.0.0.1:8000. Добавьте строки proxy_set_header, чтобы передать заголовок Host и адрес клиента.
Можно ли доверять заголовку X-Forwarded-For?
Только той части, которую добавил подконтрольный вам прокси. Клиент может прислать любое значение, поэтому настройте модуль realip с set_real_ip_from только для собственных прокси.
Скрывает ли обратный прокси мой сервер полностью?
Нет. Он скрывает адрес исходного сервера, только пока этот адрес неизвестен и сервер отказывает в прямых подключениях. Ограничьте backend трафиком от прокси и держите его адрес закрытым.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab