如何设置 Nginx 反向代理以从互联网访问我的本地主机?

如何设置 Nginx 反向代理以从互联网访问我的本地主机?

我在将 Nginx 配置为反向代理时遇到了一些麻烦,以便我的虚拟机具有私有 IP 地址可以从互联网访问。

我根据我当前的配置绘制了一张图表。

在此处输入图片描述

我的专用服务器在 Proxmox 虚拟机管理程序上运行,并且只有 1 个公共 IP 地址。虚拟机管理程序上已安装桥接器,以便虚拟机通过其本地 IP 地址访问互联网。

我进行了一些研究,发现使用 Nginx 反向代理可以从互联网访问具有私有 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,并运行一个网站(使用 Apache),其域名为“london.austria.com”

Vm2 的 IP 地址为 192.168.4.5,并运行一个网站(使用 Apache),其域名为“manchester.austria.com”

我购买了一个域名,我们称之为“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/站点可用

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:

所以,我做了以下事情:

在 shell 中我输入:

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

答案1

您的DNAT规则方向错误(来自互联网而非您的私有网络(即接口)的数据包vmbr0需要转换目标地址)。在修改post-uppost-down钩子之前,请从 root 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 连接到另一个 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;
    }
}

相关内容