我有一台 Ubuntu 18.04 设备,它有两个网络接口,以太网和 USB LTE 调制解调器。有一个 IP 摄像头直接连接到以太网端口,它有地址192.168.0.90
。我使用 LTE 接口进行其他所有操作 - 互联网、ssh 等 - 它有静态 IP 地址172.10.0.10
(我们公司有自己的 APN)。
我的设备正在运行一个 Python 应用,该应用与本地 Node.JS 服务器通信,http://localhost/abc
该服务器通过 LTE 接口与我的服务器通信https://myserver.com/app
IP 摄像机有自己的 Web 服务器,用于配置目的。为了进入摄像机的配置页面,我设置了端口转发规则,以便可以访问以下 IP 摄像机172.10.0.10:8888
:
sudo sysctl net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 192.168.0.90:80
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
它运行正常,我可以正常访问相机和 shell。但 Python 应用程序停止与本地 Node.JS 服务器通信,并出现以下错误:
502 Server Error: Bad Gateway for url: http://localhost/abc
我猜是我的端口转发规则破坏了这两个本地应用程序通信时所用的一些端口。有什么办法可以解决这个问题吗?
答案1
您的 MASQUERADE 规则是错误的。它需要指定出站接口,否则它将尝试对所有流量进行 NAT。由于您有两个 Internet 接口,因此可以指定两次。每次都仅适用于离开该接口的流量。例如:
iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wwp0s20f0u3 -j MASQUERADE
如果修复此问题后仍出现 502 错误,请检查您的 Web 应用程序是否确实正在运行并侦听您期望的端口。此错误的常见原因是应用程序未运行或侦听其他端口。
PS 如果您不在美国德克萨斯州普莱诺的 La Jolla Baking Company 工作,则应使用不同的 IP 地址块。他们拥有您在问题中使用的全局 172.10.0.10 地址。使用其他人的全局 IP 地址也会导致问题。