如何設置 Nginx 反向代理以從 Internet 訪問我的本地主機?
我在將 Nginx 配置為反向代理時遇到了一些麻煩,以便讓我的帶有私有 IP 地址的虛擬機可以從 Internet 訪問。
我用我目前的配置畫了一個圖表。
我的專用伺服器在 Proxmox 管理程序上執行,並且只有 1 個公共 IP 地址。虛擬機管理程序上安裝了一個網橋,以使 vm 通過其本地 IP 地址訪問 Internet。
我進行了一些研究,發現使用 Nginx 反向代理可以從 Internet 訪問具有私有 IP 地址(正在執行網站)的虛擬機,但我在正確設置它時遇到了一些麻煩。
我在管理程序上的配置 /etc/network/interfaces :
root@ns568745:~# cat /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # vmbr0: Bridging. Make sure to use only MAC adresses that were assigned to you. auto vmbr0 iface vmbr0 inet static address 40.53.XX.XX/24 gateway 40.53.XX.254 bridge_ports eno1 bridge_stp off bridge_fd 0 auto vmbr1 iface vmbr1 inet static address 192.168.4.254/24 broadcast 192.168.4.255 bridge_ports none bridge_stp off bridge_fd 0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE post-up iptables -t nat -A PREROUTING -i vmbr1 -p tcp --dport 80 -j DNAT --to 192.168.4.2:80 post-down iptables -t nat -D PREROUTING -i vmbr1 -p tcp --dport 80 -j DNAT --to 192.168.4.2:80 post-up iptables -t nat -A PREROUTING -i vmbr1 -p tcp --dport 443 -j DNAT --to 192.168.4.2:443 post-down iptables -t nat -D PREROUTING -i vmbr1 -p tcp --dport 443 -j DNAT --to 192.168.4.2:443
vm1 的 IP 地址為 192.168.4.4 並執行一個域名為“london.austria.com”的網站(使用 Apache)
vm2 的 IP 地址為 192.168.4.5 並執行一個域名為“manchester.austria.com”的網站(使用 Apache)
我購買了一個域名,我們稱之為“austria.com”。
在我的註冊商中,我為 2 個子域設置了 A 記錄:
london.austria.com 的 A 記錄指向 40.53.XX.XX
manchester.austria.com 的 A 記錄指向 40.53.XX.XX
VM1 配置:192.168.4.4,子域“london.austria.com”在 Apache 上執行 wwebiste。防火牆被禁用
VM2 配置:192.168.4.5,子域為“manchester.austria.com”,使用 Apache 執行 wwebiste。防火牆已禁用
Nginx 已安裝在 LXC ubuntu 容器中,步驟如下:
systemctl 啟動 nginx
systemctl 啟用 nginx
取消連結 /etc/nginx/sites-enabled/default
cd /etc/nginx/sites-available
vim reverse-proxy.conf server { listen 80; listen [::]:80; access_log /var/log/nginx/reverse-access.log; error_log /var/log/nginx/reverse-error.log; location / { proxy_pass http://192.168.4.4:80; } }
ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/reverse-proxy.conf
我進行的測試:
在 vm1 內部:
我可以通過輸入 ip 地址 192.168.4.4 訪問該網站
我無法通過在瀏覽器中輸入域名“london.austia.com”來訪問該網站。
從家裡:
我無法訪問虛擬機中的網站。
我什至沒有進一步測試vm2。
我的新 /etc/network/interfaces
root@ns568745:~# cat /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # vmbr0: Bridging. Make sure to use only MAC adresses that were assigned to you. auto vmbr0 iface vmbr0 inet static address 40.53.XX.XX /24 gateway 40.53.XX.XX .254 bridge_ports eno1 bridge_stp off bridge_fd 0 auto vmbr1 iface vmbr1 inet static address 192.168.4.254/24 broadcast 192.168.4.255 bridge_ports none bridge_stp off bridge_fd 0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE iptables -t nat -A PREROUTING -d 40.53.XX.XX -p tcp -m multiport --dports 80,443,22 -m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2 iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 40.53.XX.XX
編輯 1:
所以,我做了什麼:
在外殼中,我輸入:
iptables -t nat -F iptables -t nat -A PREROUTING -d 40.53.XX.XX -p tcp -m multiport --dports 80,443,22 -m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2 iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 40.53.XX.XX
然後,在家中,如果我在瀏覽器中輸入網址http://london.austria.com,我現在可以訪問該網站。
但是,如果我打開另一個標籤頁,第二個網站的網址http://manchester.austria.com>,顯示的網站仍然是<http://london.austria.com
您的
DNAT
規則方向錯誤(來自 Internet 而不是您的專用網路的數據包,即 interfacevmbr0
,需要目標地址的轉換)。post-up
在修改andpost-down
鉤子之前,從根 shell 測試它們:iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m multiport --dports 80,443 \ -m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2
但是,由於您有一個靜態 IP 地址 (
40.53.XX.XX
),我寧願將MASQUERADE
和DNAT
規則都替換為:iptables -t nat -A PREROUTING -d 40.53.XX.XX -p tcp -m multiport --dports 80,443 \ -m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2 iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 40.53.XX.XX
因為
SNAT
目標更快(參見netfilter 手冊)。這組規則還將提供髮夾式 NAT配置,並允許您使用伺服器的公共 IP 從 VM 連接到另一個。編輯:由於您的網路現在正在執行,您可以使用兩個塊配置nginx :
server
server { listen 80 default; listen [::]:80 default; server_name manchester.example.com; location / { proxy_pass http://192.168.4.5:80; } } server { listen 80; listen [::]:80; server_name london.example.com; location / { proxy_pass http://192.168.4.4:80; } }