如何通过 VPN 将传入请求转发到 IP
How to forward incoming requests to IP through VPN
我正在做一个项目,需要通过 VPN 连接到我们客户的网络(我们正在发送 HTTP 请求并连接到他们本地服务器上的数据库)。
我想要实现的是:
我在 AWS 上有一组实例,但我不想在每个实例上都设置 VPN 连接,事实上,如果可能的话,我宁愿根本不更改它们。 (我们称这些为应用程序实例。)
所以我想我要做的是为每个客户端设置其他具有 VPN 连接的实例。 (我们称这些为 vpn 实例。)
想法是,应用程序实例将具有 vpn 实例的 DNS(例如:myclient.vpn.myservice)并将其用于通过 VPN 的所有流量。
示例:应用程序实例 #1 向 http://myclient.vpn.myservice:1234 发送 HTTP 请求,vpn 实例接收请求,将其转发到 1.2.3.4:1234(在客户端的本地网络上)和 returns对应用程序实例 #1 的响应,因此从应用程序实例的角度来看,这就像向 myclient.vpn.myservice 发送常规 HTTP 请求(旁注:这也适用于常规的 tcp 和 udp 连接)。
我试过在 vpn 实例上启用 ip 转发和设置 iptables 规则,如下所示:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A PREROUTING -p udp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A POSTROUTING -j MASQUERADE
但这似乎不起作用(至少对于 HTTP 请求)。
所有服务器 运行 Ubuntu 20.04。
我不确定这个想法是否完全错误,而且我在 Ubuntu 方面没有特别丰富的经验,所以我愿意接受建议,唯一重要的是我真的不想更改应用实例。
有一种在 AWS 上设置 VPN 的最简单方法。
您可以 create a VPN in your VPC(您还需要客户网关和虚拟专用网关)并更改现有路由 Table 以将连接从您的客户 VPN CIDR 范围路由到 AWS VPN 资源.
有了这个,来自您的实例的连接将转到 VPN,而不需要 VPN 实例。
好的,我明白了。首先,我上面写的所有步骤不是从 vpn 实例本身开始工作,而是从应用程序实例开始工作,但这些 iptables 规则过于宽松,它们搞砸了系统的内部主机解析,sudo 命令变得非常慢应用后。
这就是我最终得到的结果(继续使用问题中的示例):
在 vpn 实例上:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A OUTPUT -o lo -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A OUTPUT -o lo -p udp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
其中 eth0 是实例的 public 网络接口,tun0 是 vpn 连接的网络接口。
在这些规则之后,我能够 curl http://myclient.vpn.myservice:1234
来自所有实例并接收来自 vpn 另一端的响应。
我正在做一个项目,需要通过 VPN 连接到我们客户的网络(我们正在发送 HTTP 请求并连接到他们本地服务器上的数据库)。
我想要实现的是:
我在 AWS 上有一组实例,但我不想在每个实例上都设置 VPN 连接,事实上,如果可能的话,我宁愿根本不更改它们。 (我们称这些为应用程序实例。)
所以我想我要做的是为每个客户端设置其他具有 VPN 连接的实例。 (我们称这些为 vpn 实例。)
想法是,应用程序实例将具有 vpn 实例的 DNS(例如:myclient.vpn.myservice)并将其用于通过 VPN 的所有流量。
示例:应用程序实例 #1 向 http://myclient.vpn.myservice:1234 发送 HTTP 请求,vpn 实例接收请求,将其转发到 1.2.3.4:1234(在客户端的本地网络上)和 returns对应用程序实例 #1 的响应,因此从应用程序实例的角度来看,这就像向 myclient.vpn.myservice 发送常规 HTTP 请求(旁注:这也适用于常规的 tcp 和 udp 连接)。
我试过在 vpn 实例上启用 ip 转发和设置 iptables 规则,如下所示:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A PREROUTING -p udp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A POSTROUTING -j MASQUERADE
但这似乎不起作用(至少对于 HTTP 请求)。
所有服务器 运行 Ubuntu 20.04。
我不确定这个想法是否完全错误,而且我在 Ubuntu 方面没有特别丰富的经验,所以我愿意接受建议,唯一重要的是我真的不想更改应用实例。
有一种在 AWS 上设置 VPN 的最简单方法。
您可以 create a VPN in your VPC(您还需要客户网关和虚拟专用网关)并更改现有路由 Table 以将连接从您的客户 VPN CIDR 范围路由到 AWS VPN 资源.
有了这个,来自您的实例的连接将转到 VPN,而不需要 VPN 实例。
好的,我明白了。首先,我上面写的所有步骤不是从 vpn 实例本身开始工作,而是从应用程序实例开始工作,但这些 iptables 规则过于宽松,它们搞砸了系统的内部主机解析,sudo 命令变得非常慢应用后。
这就是我最终得到的结果(继续使用问题中的示例):
在 vpn 实例上:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A OUTPUT -o lo -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A OUTPUT -o lo -p udp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
其中 eth0 是实例的 public 网络接口,tun0 是 vpn 连接的网络接口。
在这些规则之后,我能够 curl http://myclient.vpn.myservice:1234
来自所有实例并接收来自 vpn 另一端的响应。