Nginx

nginx 拒絕對虛擬主機的所有請求。請求來自 nginx tcp 轉發器

  • June 15, 2021

摘要 - 需要將白名單 ips 添加到 mysite1.example.com。現在,當它們被添加時,它不起作用,因為每個請求都來自負載平衡器伺服器。

我正在使用帶有上游後端的前置 Nginx 主機進行設置,以將埠 443 上的所有 tcp 數據包負載平衡到後端伺服器。

執行 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;
   }
}

我需要的是將虛擬主機 mysite1.example.com 的幾個 ip 列入白名單。我面臨的問題是在伺服器 A 和 B 上執行的 nginx 將負載均衡器 Ip 視為客戶端 Ip。所以當嘗試添加允許 IP 時;全部否認。不適用於任何主機,因為它在所有請求上都將負載均衡器 IP 作為客戶端 IP。

有人可以指導我添加代理 IP 配置以實現上述設置執行良好。除 IP 白名單問題外,設置已完成。

ps 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 負載均衡器與您的 nginx Web 伺服器建立了新的 TCP 連接,導致原始客戶端 IP 地址失去。

您可以使用 PROXY 協議解決此問題。當新連接打開時,此協議會發送原始 IP 地址資訊,以便您的 Web 伺服器可以知道它。

要進行設置,您需要進行以下更改:

  • 在負載均衡器上,設置proxy_protocol on;
stream {
   server {
       proxy_pass somewhere;
       proxy_protocol on;
  • 在 Web 伺服器上,接受 PROXY 協議,並為負載均衡器的 IP 地址啟用真實 IP 功能。
server {
   listen 443 ssl http2 proxy_protocol;
   listen [::]:443 ssl http2 proxy_protocol;
   real_ip_header proxy_protocol;
   set_real_ip_from <load balancer's IP>;

您可以對代理協議進行額外的調整,您可以在nginx 文件中找到這些調整,但這應該可以幫助您開始並解決眼前的問題。

引用自:https://serverfault.com/questions/1066623