Linux

如何設置 Nginx 反向代理以從 Internet 訪問我的本地主機?

  • February 9, 2020

我在將 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 而不是您的專用網路的數據包,即 interface vmbr0,需要目標地址的轉換)。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),我寧願將MASQUERADEDNAT規則都替換為:

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

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