使用 CGNAT 的站点到站点 VPN

Pau*_*ian 5 networking vpn ipv6

抱歉,如果我把这个贴在错误的地方。让我知道是否应该将其移至另一个 SE 站点。继续讲故事吧...

我的家庭 ISP 有时(但并非始终如此)强制我们通过 CGNAT,但是我需要以可靠的方式远程访问本地设备(只要首先有互联网连接;没有办法避免此要求:)) 。在切换 ISP 之前(旧的 ISP 总是给我相同的公共 IPv4 地址),我可以只使用 OpenVPN 就可以了。

现在 CGNAT 确实有可能,OpenVPN 不再是远程连接到我的 LAN 资源的可靠方式。因此,我正在寻找另一个足够可靠的解决方案(它将使我能够完成一些既需要的事情——远程访问安全摄像头——又有用——将 SSH 服务器反向连接到我的工作场所)。

现在进行设置:

  • 我家里有一个树莓派。Model 3 B+(如果有的话)(我会感到惊讶,但为了完整性而提供它)。它位于我自己的连接到 ISP (PPPoE) 的路由器后面。它具有对 LAN 资源的完全访问权限。我有一个私有的、固定的 IPv4(尽管现在由于 CGNAT 问题,我考虑删除“固定”要求;无论如何修复它可能不如以前有用)和一个自动(SLAAC,无隐私扩展)公共路由的 IPv6 地址。不能保证每次重新连接都会得到相同的 /64(因此 IP 地址会随时间而变化)。
  • 在场外,我有一台 AWS EC2 主机(最小的一台,“免费”,但我认为不会真正免费)。我在主机上配置了弹性 IPv4 和 IPv6,并进行了正确的网关配置(浪费了很多时间,但最终还是成功完成了)。因此从技术上讲,我可以通过 IPv6 从这里连接到 Pi(假设 Pi 有一个可以用于 IPv6 的适当的动态 DNS 服务),或者通过 IPv4 和 IPv6 从 Pi 连接到 AWS 主机。
  • 在工作中,我有一个高度戒备的网络,我只想对其进行反向 SSH。我也许可以使用 AWS 实例作为跳转主机并非常快速地解决它。我的意思是,无论如何我都可以在 AWS 实例的端口 443 上运行 SSH 服务器。所以这不是真正的问题(端口 22 被工作防火墙阻止:( )

我需要的帮助有两个:

  1. 首先,如何设置从我的 Raspberry Pi 到 AWS 主机的直接连接,以便 AWS 主机可以直接访问我的所有 LAN 资源(最终可以通过我在 Raspberry Pi 上的防火墙规则进行自定义)
  2. 其次,如何确保每次重新启动 Pi 时都会自动启动此支持(我倾向于经常重新启动它,断电也会导致意外重新启动)。

请注意,我确实有一个解决方法,但它确实很糟糕。每次我获得 CGNAT IP 地址时,都会通过 TP-Link 云服务重新启动我的路由器,直到获得公共 IP 地址。然后我的 ISP 足以提供适当的动态 DNS 服务,以便我可以解析到我的公共地址(或者我的私人地址,如果我确实获得了 CGNAT;但这并没有多大帮助)。我真的希望能够忘记这些解决方法。

Pau*_*ian 4

其实我自己最后也想通了。我遵循了通常的教程:

  • 首先,在服务器(EC2 实例)和客户端(CGNAT 后面的 Raspberry Pi)上安装 OpenVPN,并仅在服务器上安装 Easy-RSA。
  • 然后,使用 Easy-RSA 生成一些内容(信息直接取自 OpenVPN 社区页面上的教程):
    • 首先,在文件“vars”中配置变量。默认值运行良好,但建议无论如何更改它们。
    • 将 openssl-1.0.0.cnf 复制到 openssl.cnf (其他版本也可能有效)。
    • 运行 ./clean-all (这将删除任何预先存在的密钥和额外的配置,以便从空白开始)。
    • 运行./build-ca(这将生成keys/ca.crt和keys/ca.key;后者必须受到保护——一旦你确定不需要更新配置来添加更多内容,你就可以粉碎它客户。前者是必须保留的证书)
    • 运行 ./build-key-server 生成服务器密钥对。只有服务器需要这个。
    • 运行 ./build-key 为客户端生成密钥。每个客户端运行一次。我总共只为我的客户“raspberrypi”运行一次。生成的文件需要复制到客户端。
    • 将文件复制到它们所属的位置:
      • 服务器和客户端都需要keys/ca.crt。
      • 如果您想添加其他客户端,则需要keys/ca.key,并且它是您要保护的主要内容。如果您不需要额外的灵活性,建议您对其运行“shred”命令或将其移动到已知安全的系统(该系统可能是气隙的,因为它值得)
      • keys/raspberrypi.{crt,key} 属于客户端(在我的例子中,客户端是 raspberrypi,您为客户端输入自己的特定名称),并且应该相应地复制到客户端。
      • 密钥/服务器。{crt,密钥}保留在服务器上。.crt 文件会在任何连接尝试时自动发送,因此无需手动将其复制到客户端。
    • Easy-RSA 部分现已完成。
  • 在服务器端设置 OpenVPN
    • 默认服务器配置很好,除了一些更改:
      • ca、cert 和 key 选项必须更新为分别指向 ca.crt、server.crt 和 server.key 文件。server.key 文件应该受到保护(0400 权限),尽管我不确定是否确实检查了这一点。
      • 我设置了“拓扑子网”。这并不是绝对必要的,但却是一件好事。
      • 我已将“服务器”指令更改为另一个私有 IPv4 范围,以确保不会与另一台 OpenVPN 服务器(来自我的路由器的服务器)发生冲突。毕竟我稍后会做一些静态路由,因此范围不能重叠。
      • client-config-dir client(将“client”子文件夹设置为特殊并包含特定于客户端的配置;这对于路由很重要)
      • 客户端到客户端我再次继续,以便路由正常工作。
      • 我在这两种情况下都注释掉了“tls-auth ta.key 0”选项;这确实会产生警告,但我不需要额外的安全性。一旦我弄清楚它是如何工作的,我可能会在将来取消注释。然而,为了安全起见,强烈建议使用此选项。
      • 我添加了一条语句push "route 172.31.0.0 255.255.240.0",将 AWS 专用网络的路由推送到我的 Raspberry Pi。
    • 此外,对于客户端,您需要有一个文件 client/raspberrypi (同样基于客户端名称),其中包含iroute 192.168.1.0 255.255.255.0(以便从 AWS 实例到 Pi 和家庭网络的路由工作。
  • 客户端也需要设置
    • 设置远程地址。我只是将我拥有的弹性 IP 地址放在我的 AWS 实例上,因为除非我弄乱它,否则它不会改变。
    • 设置 ca、cert、key(ca 到 ca.crt、cert 到 raspberrypi.crt、key 到 raspberrypi.key)指令。
    • 注释掉 tls-auth 指令,就像在服务器上一样。这必须与服务器匹配。
  • 启用 SystemD 服务(这负责在启动时启用隧道)。在服务器上,您systemctl enable openvpn@server; systemctl start openvpn@server假设您的配置文件是 /etc/openvpn/server.conf。您不能将其用于子文件夹。在客户端上,它是相同的,除了你输入的文件名是 client.conf openvpn@client

现在剩下的就是做一些端口转发,但这不是这个问题的主题。