我有一个 Web 服务器,它在端口 3000 上为网站提供服务。此 Web 服务器可在我的本地网络上访问 (https://172.16.1.16:3000),但我需要它能够通过多个 URL 从互联网上访问。
为此,我使用 AirDNS 提供 URL 和端口转发。Web 服务器有三个 OpenVPN 客户端,它们独立连接到 AirDNS OpenVPN 服务器。
这三个 OpenVPN 服务器是:
OpenVPN 服务器 1) subdomain1.airdns.com - 将端口 3400 转发到 3000
OpenVPN 服务器 2) subdomain2.airdns.com - 将端口 36544 转发到 3000
OpenVPN 服务器 3) subdomain3.airdns.com - 将端口 28448 转发到 3000
目前,每个 VPN 连接都独立工作,或者,如果我将 Web 服务器连接到多个 AirDNS 服务器,则只有最后一个服务器可以工作。
因此,如果 Web 服务器连接到 OpenVPN 服务器 1,那么我可以从互联网浏览https://subdomain1.airdns.com:3400并且我顺利访问了该网站。如果我将 Web 服务器连接到 OpenVPN 服务器 2,我可以成功浏览https://subdomain2.airdns.com:36544但https://subdomain1.airdns.com:3400停止工作。如果我将网络服务器连接到第三个 OpenVPN 服务器,那么https://subdomain3.airdns.com:28448工作并且 OpenVPN 服务器 2 提供的 URL 停止工作。
我最初以为问题是 OpenVPN 设置默认网关规则,所以我添加了拉动过滤器忽略重定向网关到 Web 服务器上的 OpenVPN 配置。这确实会阻止 OpenVPN 设置 0.0.0.0/1 和 128.0.0.0/1 路由。但是,这也会破坏从任何 AirDNS URL 访问页面的能力。
我还尝试使用 IP 表在 Web 服务器上设置 IP 转发,以便到达任何目标端口为 3000 的接口的任何流量都将被伪装成 Web 服务器的 LAN IP(172.16.1.16:3000)进行转发。
我尝试过的规则(我认为应该有效)是(与忽略重定向网关 OpenBPN 选项结合使用):
sudo iptables -t nat -A POSTROUTING -o lo -j MASQUERADE
sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 172.16.1.16:3000
应用的其他 iptables 规则包括:
1) 始终允许环回流量:
sudo iptables -A INPUT -i lo -j ACCEPT
2) 始终允许 LAN 接口上的流量:
sudo iptables -A INPUT -i ens160 -m state --state RELATED,ESTABLISHED -J ACCEPT
3) 始终允许前向链中的流量:
sudo iptables -A FORWARD -j ACCEPT
/etc/sysctl.conf 中启用了 IP 转发
该服务器正在运行 Ubuntu 18.04.2 Server。
如能得到任何帮助,使 Web 服务器所提供服务的站点能够同时通过所有三个 AirDNS URL 访问,我们将不胜感激。
答案1
非常感谢迪尔克特,策略路由才是最佳选择。
我添加了三个额外的路由表,每个路由表都有一个默认路由和一个 IP 规则。
我使用的命令是:
echo "13 tun0" | sudo tee -a /etc/iproute2/rt_tables
sudo ip rule add from 10.35.0.104 lookup tun0
sudo ip route add default via 10.35.0.1 table tun0
echo "14 tun1" | sudo tee -a /etc/iproute2/rt_tables
sudo ip rule add from 10.25.0.127 lookup tun1
sudo ip route add default via 10.25.0.1 table tun1
echo "15 tun2" | sudo tee -a /etc/iproute2/rt_tables
sudo ip rule add from 10.15.0.223 lookup tun2
sudo ip route add default via 10.15.0.1 table tun2