Резюме - нужно добавить ips из белого списка на mysite1.example.com. теперь, когда они добавлены, это не работает, так как каждый запрос приходит как исходящий от сервера балансировщика нагрузки.
Я работаю над установкой с передним сидящим хостом Nginx с бэкендом upstream для балансировки нагрузки всех пакетов tcp на порт 443 к бэкенд-серверам.
Конфиг nginx сервера Loadbalancer, на котором работает nginx - сервер C, выглядит следующим образом
stream {
upstream stream_backend {
hash $remote_addr consistent;
server 10.15.15.3:443; ## server A
server 10.15.15.9:443; ## server B
}
server {
listen 443;
proxy_pass stream_backend;
proxy_timeout 5s;
proxy_connect_timeout 5s;
}
}
сервер A и сервер B имеют следующие nginx.conf. это идентичные серверы с приложениями.
на каждом из них запущено по два виртуальных хоста. они работают нормально.
http {
server {
server_name mysite1.example.com;
listen *:443 ssl;
listen [::]:443 ssl;
allow 123.45.85.220; # this seems not working
deny all; # only this is working
location ^~ /static/ {
...
}
...
ssl_certificate file.pem;
ssl_certificate_key file.key;
}
server {
server_name mysite2.example.com;
listen *:443 ssl;
listen [::]:443 ssl;
location /somethin {
...
}
location /something2{
...
}
ssl_certificate file.pem;
ssl_certificate_key file.key;
}
}
мне нужно внести в белый список только несколько ips для виртуального хоста mysite1.example.com. Проблема в том, что nginx, запущенный на серверах A и B, видит Ip балансировщика нагрузки как Ip клиента. Поэтому, когда я пробовал добавить разрешить IP; запретить все, это не работает ни для одного хоста, поскольку IP балансировщика нагрузки на всех запросах является IP клиента.
Может ли кто-нибудь подсказать мне, как добавить конфигурацию прокси IP для достижения вышеупомянутой установки, которая работает нормально. Установка завершена, за исключением проблемы с белым списком IP.
p.s Завершение SSl происходит на внутренних серверах, сервере A и сервере B
Я искал в интернете и нашел эти полезные советы, но так и не смог понять, как заставить все это работать.
https://stackoverflow.com/questions/40873393/nginx-real-client-ip-to-tcp-stream-backend https://www.cyberciti.biz/faq/nginx-redirect-backend-traffic-based-upon-client-ip-address/
Это происходит из-за того, что балансировщик нагрузки nginx устанавливает новое TCP-соединение с вашими веб-серверами nginx, что приводит к потере исходного IP-адреса клиента.
Вы можете решить эту проблему, используя протокол PROXY. Этот протокол отправляет информацию об исходном IP-адресе при открытии нового соединения, чтобы ваши веб-серверы знали об этом.
Для его настройки необходимо внести следующие изменения:
В балансировщике нагрузки включить proxy_protocol;
:
stream {
server {{{1 }} proxy_pass where;
proxy_protocol on;
На веб-сервере примите протокол PROXY и включите функцию Real IP для IP-адреса балансировщика нагрузки.
сервер {
прослушивание 443 ssl http2 proxy_protocol;
прослушивание [::]: 443 ssl http2 proxy_protocol;
real_ip_header proxy_protocol;
set_real_ip_from ;
Есть дополнительные настройки, которые вы можете внести в протокол PROXY, которые вы можете найти в документации nginx , но это должно помочь вам начать работу и решить непосредственную проблему.
Мой подход был бы следующим:
Фильтр в балансировщике нагрузки с использованием SNI:
В основном: SNI позволяет прокси-серверу видеть имя домена без завершения TLS. Здесь - руководство. А вот документы nginx , чтобы объединить его в решение.
Если вы можете это сделать, вы можете отказать на основе $ ssl_preread_server_name
.
if ( $ssl_preread_server_name ~* mysite1.example.com && $remote_addr !~* <whitelisted_ip> ) {
return 404;
Модуль real_ip также кажется хорошим решением.
Править
Протокол PROXY был бы лучше, чем real_ip. Но это все равно будет означать, что ваши внутренние серверы получают запросы, которые в конечном итоге блокируются. Решение SNI улавливает их на балансировщике нагрузки.
похоже, что ваш прокси не передает реальный IP. попробуйте добавить этот параметр
proxy_set_header X-Real-IP $remote_addr;
можете ли вы проверить логи доступа, какой ip там?