我在将 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-up
和post-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
),我宁愿用以下方式替换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 连接到另一个 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;
}
}