OpenVPN-客户端采用动态 IP,服务器端采用静态 IP

OpenVPN-客户端采用动态 IP,服务器端采用静态 IP

我正在关注本教程介绍如何设置 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 重置期间保留密钥来解决问题,因此无需重新读取它们。

相关内容