簡體   English   中英

Nginx 通過IP地址過濾反向代理

[英]Nginx filtering by IP address for reverse proxy

我正在使用 Nginx 反向代理少數 web 服務器,每個服務器都被流式傳輸,效果非常好,這是配置:

stream {
        map $ssl_preread_server_name $name {
                portal1.site.com portal1_backend;
                portal2.site.com portal1_backend;
                portal3.site.com portal1_backend;
                portal4.site.com portal1_backend;
        }

        upstream portal1_backend {
                server 10.1.1.1:443;
        }

        upstream portal2_backend {
                server 10.1.1.2:443;
        }

        upstream portal3_backend {
                server 10.1.1.3:443;
        }

        upstream portal4_backend {
                server 10.1.1.4:443;
        }
        server {
                listen 10.1.2.2:443;
                proxy_pass $name;
                ssl_preread on;
        }
http {
        server {
                listen 80;
                server_name portal1.site.com;

                location / {
                    return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        proxy_pass http://10.1.1.1:80;
                }  # do not redirect requests for iframe location
        }

        server {
                listen 80;
                server_name portal2.site.com;

                location / {
                        return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        proxy_pass http://10.1.1.2:80;
                }
        }

        server {
                listen 80;
                server_name portal3.site.com;

                location / {
                        return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        proxy_pass http://10.1.1.3:80;
                }
        }

        server {
                listen 80;
                server_name portal4.site.com;

                location / {
                        allow 1.2.3.4;
                        deny all;
                        return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        proxy_pass http://10.1.1.4:80;
                }
        }
}

每個都有重定向到 https 的端口 80,除了眾所周知的 Lets Encrypt 位置。

我需要做的是限制 IP 地址能夠連接到第四台服務器而不影響當前功能,並且不限制其他服務器。

這個配置參考了Nginx TCP forwarding based on hostname

這可能嗎?

我環顧四周,嘗試了幾種不同的配置變體,最后不得不找到一個解決方法。 由於 stream 塊僅限於具有單個服務器塊,因此無論您包含什么allow / deny語句,都是“全有或全無”。

我確定的解決方法(雖然不理想)似乎非常實用,並且不太難以使用基本同步腳本進行自動化/維護。

我的主要入站代理服務器能夠控制對每個本地 http 服務器的端口 80 上的私有資源的“逐個”訪問,因此它處理所有入站 80 訪問控制和過濾。

但是,如果我需要限制對端口 443 上加密的 tcp stream 的私有資源的訪問,我將 stream 交給輔助 nginx 代理服務器(僅在 443 上運行 stream 代理服務器),並在那里進行額外的過濾和訪問控制.

IP 在私人土地上很便宜,而且延遲極小 (<0.000)。 我確實通過 proxmox lxc 容器運行我的 nginx stream 代理,所以它們實際上在同一台機器上。

我想你甚至可以菊花鏈額外的代理,並通過你的過濾變得非常精細......但如果沒有經過深思熟慮的話,這可能會很快變成一個糾結的 web :)

(甚至可以在相同的 VM/服務器/容器上運行所有 stream 服務器,但 IP 不同。我沒試過。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM