我正在关注本教程介绍如何设置 VPN在我的家庭服务器和生产服务器之间。
我的问题是,在我的网络中,客户端(家庭服务器)位于动态 IP 后面,而服务器(生产)位于静态 IP 后面。
考虑到我家的 IP 地址经常由 ISP 更改,我需要做些什么才能在我的家庭和生产网络之间创建 VPN?
答案1
OpenVPN 要求一个系统配置为服务器,另一个系统配置为客户端。客户端连接到服务器。
因此,您将在具有静态 IP 的生产服务器上运行服务器实例,并在具有动态 IP 的家庭服务器上运行客户端实例。您的客户端 IP 无关紧要,因为它将启动与服务器的连接。
答案2
当客户端和服务器之间至少有一个没有静态 IP 地址时,OpenVPN 连接会出现以下问题:如果其中一个在连接过程中更改地址,则该连接将被断开。
然而,有一种标准方法(请参阅此 OpenVPN 官方维基页面)在连接断开时自动提示客户端和/或服务器强制重新连接。它包括在客户端中使用以下几行和服务器配置文件:
ping 15
ping-restart 300 # 5 minutes
resolv-retry 300 # 5 minutes
persist-tun
persist-key
但请注意,无论暂时断开的原因是什么(不要介意公共 IP 地址的变化),这些行都会保留 OpenVPN 链接,因此我通常将它们保存在客户端和服务器配置文件中,以允许自动重新连接。
根据手册:
--ping n
如果至少 n 秒内没有发送任何数据包,则通过 TCP/UDP 控制通道对远程设备进行 ping 操作(在两个对等端上指定 --ping 可使 ping 数据包双向发送,因为 OpenVPN ping 数据包不会像 IP ping 数据包那样回显)。在 OpenVPN 的安全模式之一中使用时(其中指定了 --secret、--tls-server 或 --tls-client),ping 数据包将具有加密安全性。
–ping 重启 n
类似于 --ping-exit,但在 n 秒内未收到来自远程的 ping 或其他数据包后触发 SIGUSR1 重启。此选项在远程对等方具有动态 IP 地址并使用低 TTL DNS 名称通过以下服务跟踪 IP 地址的情况下很有用,例如http://dyndns.org/+ 动态 DNS 客户端,例如 ddclient。
如果无法联系到对方,则会触发重新启动,从而导致重新解析与 --remote 一起使用的主机名(如果还指定了 --resolv-retry)。
在服务器模式下,--ping-restart、--inactive 或任何其他类型的内部生成信号将始终应用于单个客户端实例对象,而不会应用于整个服务器本身。还请注意,在服务器模式下,任何通常会导致重启的内部生成信号都会导致删除客户端实例对象。
在客户端模式下,--ping-restart 参数默认设置为 120 秒。此默认值将一直保持,直到客户端根据服务器配置中的 --keepalive 设置从服务器提取替换值。要禁用 120 秒默认值,请在客户端上设置 --ping-restart 0。
有关 SIGUSR1 的更多信息,请参阅下面的信号部分。
请注意,可以通过 --persist-tun、--persist-key、--persist-local-ip 和 --persist-remote-ip 选项修改 SIGUSR1 的行为。
还要注意,--ping-exit 和 --ping-restart 是互斥的,不能一起使用。
--resolv-retry n 如果 --remote 的主机名解析失败,则重试解析 n 秒,然后才会失败。将 n 设置为“infinite”可无限重试。
默认情况下,--resolv-retry infinite 是启用的。您可以通过设置 n=0 来禁用。
--persist-tun
不要在 SIGUSR1 或 --ping-restart 重启时关闭并重新打开 TUN/TAP 设备或运行启动/关闭脚本。SIGUSR1 是一种类似于 SIGHUP 的重启信号,但它提供了对重置选项的更细粒度的控制。
--persist-key
不要通过 SIGUSR1 或 --ping-restart 重新读取密钥文件。此选项可以与 --user nobody 结合使用,以允许由 SIGUSR1 信号触发的重新启动。通常,如果您在 OpenVPN 中放弃 root 权限,则守护进程无法重新启动,因为它现在无法重新读取受保护的密钥文件。
此选项通过在 SIGUSR1 重置期间保留密钥来解决问题,因此无需重新读取它们。