将本地 Web 服务器通过隧道连接到 AWS Openvpn 服务器并从 AWS IP 地址提供流量?

将本地 Web 服务器通过隧道连接到 AWS Openvpn 服务器并从 AWS IP 地址提供流量?

我在路由器后面本地运行 LEMP 服务器。一切正常。因为我希望我的 IP 地址不暴露给世界,所以我试图通过运行 Ubuntu 18.04 的 AWS 实例来隧道传输 Web 服务器。我“认为”,这就像构建 AWS Ubuntu OpenVPN 云服务器、通过终端中的 openvpn 将我的本地 Web 服务器连接到该服务器,然后更改我的 dns A 记录以指向 Amazon VPN 服务器的 IP 地址一样简单。

显然,我遗漏了一些东西,因为我已经完成了上述所有假设,但我仍然无法让我的网络服务器在我的 AWS IP 地址上提供流量。

我的设置:我的本地 Web 服务器已通过 openvpn 成功连接到我的 ubuntu aws 实例。我的本地 Web 服务器正在正确接收我的 aws 实例的 IP 地址。Openvpn 服务器似乎运行正常。我的 DNS 配置有指向我的 AWS 实例 IP 地址的 A 记录。我可以通过隧道浏览互联网,whatsmyip.org 显示正确的 aws IP 地址。

在 EC2 实例上,输出ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 0e:86:bb:81:3b:dd brd ff:ff:ff:ff:ff:ff
    inet 172.31.47.112/20 brd 172.31.47.255 scope global dynamic eth0
       valid_lft 3208sec preferred_lft 3208sec
    inet6 fe80::c86:bbff:fe81:3bdd/64 scope link
       valid_lft forever preferred_lft forever
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none
    inet 10.8.0.1/24 brd 10.8.0.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::2405:76a5:410a:17a7/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

在本地网络服务器上,输出ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:a6:32:14:6d:e1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.30.32/24 brd 192.168.30.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::815e:ba7:5be8:1fb5/64 scope link
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether dc:a6:32:14:6d:e2 brd ff:ff:ff:ff:ff:ff
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 10.8.0.3/24 brd 10.8.0.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::292b:b09f:9ac9:2cc7/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

在我的 EC2 实例上,输出sudo iptables -t nat -vnL是:

Chain PREROUTING (policy ACCEPT 396 packets, 22897 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 173 packets, 8430 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 361 packets, 44271 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 361 packets, 44271 bytes)
 pkts bytes target     prot opt in     out     source               destination
  223 14467 SNAT       all  --  *      *       10.8.0.0/24         !10.8.0.0/24          to:172.31.47.112

在我的本地服务器上,输出sudo iptables -t nat -vnL是:

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

据我所知,我的 IP 地址在重新启动或重启 VPN 服务器时不会改变。最后,为了在 EC2 端设置 VPN 服务器,请遵循以下指南,以防您想查看:

https://linuxhint.com/vpn_amazon_ec2_setup/

经过这样的设置后,我的网络服务器就不再为亚马逊 IP 地址提供流量了。

谁能告诉我我到底遗漏了什么以及如何补救?

答案1

您不需要通过 VPN 将 AWS 实例上的流量转发 /dnat 端口回去(也许绑定到隧道 IP 和/或本地防火墙上的 Web 服务器 - 但 dnat 对我们来说是最重要的)。

您尚未提供您的地址,但您的 AWS iptables/防火墙实例上很可能有一个 NAT 伪装规则,以允许从您的 VPN 进行浏览。您还需要确保 AWS 允许 http(s) 的入站连接。您需要添加一条规则,例如 (未经测试)

更新

  iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j DNAT --to-destination 10.8.0.3:80
  iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 443 -j DNAT --to-destination 10.8.0.3:443

您需要确保在重启时将这些规则添加到您的 AWS 服务器。第一个规则用于 http,第二个规则用于 https。

如果您将 AWS 盒子想象成虚拟 SOHO 路由器 - 路由器/AWS 盒子默认配置为允许出站连接,但不知道将传入连接重定向到何处。以上几行相当于在路由器中设置端口转发,以将进入路由器外部地址的流量重定向到服务器的内部 IP。

我们知道 Web 服务器的 IP 地址是 10.8.0.3,因为“ip address show”输出的第 4 个条目用于运行接口,即 openvpn 隧道。

相关内容