使用 DNS 注册 OpenVPN 客户端地址

使用 DNS 注册 OpenVPN 客户端地址

我在家用路由器上运行 OPNSense,并在设备上配置了 OpenVPN,这样我就可以从世界任何地方连接到我的家庭网络。

我还在家庭网络上运行 BIND DNS 服务器,为该网络上的所有系统设置了一个专用区域。到目前为止,所有 RR 都是静态的,并由人工维护。

我现在想通过我的内部 DNS 解析我的客户端 VPN 地址(相关客户端运行基于 Debian 的 Linux 发行版)。据我了解,我有两个选择:

  1. 配置 OpenVPN 为每个 VPN 客户端分配一个静态地址,并向我的内部 DNS 添加一个静态 RR
  2. 配置我的 DNS 服务器以接受来自客户端的 RR 更新,并配置 OpenVPN(在客户端或服务器端)以在建立连接时更新 RR

限制在于 OpenVPN 在 OPNsense 盒上运行,这限制了我在服务器端安装一些尖端扩展的能力(我必须使用 OPNsense repo 官方提供的任何内容)。

对于选项 2,有一个文章在 OpenVPN wiki 上,但它指的是一个正在开发的功能,在撰写本文时已有 8 年历史,并且似乎需要一些额外的服务器端包,而这些包可能不适用于我的用例。

考虑到我提到的限制,有没有什么行之有效的方法可以让我的内部 DNS 解析客户端的地址?

答案1

配置 BIND 以接受“VPN 客户端”区域的动态更新。(请注意,这与手动维护的区域文件(无论是否动态)大多不兼容,但nsdiff工具可以帮助维护动态区域的“手动”部分,或者您可以手动将每个主机从主区域 CNAME 到动态区域。)

使用 OpenVPN--client-connect脚本调用nsupdate以插入新的 A 和 AAAA 记录。(nsupdate 工具随 BIND 提供。)

用于--ifconfig-pool-persist使客户端 IP 地址在首次连接后“粘性”。尽管每次都会调用客户端连接脚本,但拥有粘性 IP 地址仍然很有用,因为它允许动态记录具有更长的 TTL。

“DynamicDNS”页面讨论了完全相同的方法 - 尽管它没有明确说明,但更新机制只是一个作为“客户端连接”脚本运行的外部 Perl 脚本,从环境中获取客户端信息并提交 DNS 更新。

限制在于 OpenVPN 在 OPNsense 盒上运行,这限制了我在服务器端安装一些尖端扩展的能力(我必须使用 OPNsense repo 官方提供的任何内容)。

在 pfSense 中,您可以添加标准 FreeBSD 软件包存储库并使用 从中安装任何内容pkg add。我不确定这在 OPNSense 中是否有效,但应该有效。

答案2

我发现了一种不同的方法,它比设置动态 DNS 更容易:配置特定于客户端的覆盖,以便为某些客户端分配静态地址,然后在 DNS 中注册(现在是静态的)客户端地址。

使用 net30 拓扑(OPNsense 中的默认设置),每个客户端连接都会获得自己的子网,掩码为 30 位。在两个地址中(不包括网络和广播地址),第一个是服务器,第二个是客户端。

客户端特定覆盖中使用的地址必须位于为服务器配置的 IPv4 隧道网络之外。

配置步骤:

  • 将 IPv4 隧道网络的子网掩码增加一。这意味着只有一半的范围仍将用于动态分配的地址,其余部分现在可供客户端特定地址使用。这样,所有基于 IP 范围的规则和其他配置(包括网络上的其他地方)将继续适用于具有静态地址的客户端。(可选)更改网络地址,以便仅使用前一个范围的后半部分。
  • 将旧的 IPv4 隧道网络地址(具有较短的子网掩码)添加为 IPv4 远程网络。这样,到整个范围(静态和动态地址)的流量将通过 OpenVPN 路由。(如果没有此设置,OpenVPN 将无法访问通过客户端特定覆盖设置的地址的客户端。)
  • 为要分配静态地址的每个客户端添加客户端覆盖:
    • 服务器:选择您的 OpenVPN 服务器实例
    • 通用名称:客户端证书使用的通用名称
    • IPv4 隧道网络:分配您在上一步中释放的网络部分;它的子网掩码必须为 30,并且最后一个八位字节必须是 4 的倍数。
  • 如果您需要 VPN 客户端之间的通信,请将全范围(静态和非静态)添加到服务器配置中的 IPv4 本地网络。(这也适用于具有特定覆盖的客户端)。
  • 最后,在 DNS 中注册客户端地址(该客户端的子网地址,加上最后一个八位字节的 2)。

相关内容