如何告知 Mac OS 和 iOS 客户端 VPN 路由?

如何告知 Mac OS 和 iOS 客户端 VPN 路由?

在我的家庭网络 (10.0.1.0/24) 上,我有 Mac 和 iOS 设备(其他设备无关紧要)。LAN 客户端通过连接到 Comcast 有线调制解调器的 Airport Extreme (AEBS) 获得 IPv4 和 IPv6(本机)访问权限(我没有更好的选择)。我需要 VPN 来访问一些 $work 资源,如果 VPN 在我手边的任何屏幕上“正常工作”,那就太方便了。为了避免在每台设备上管理 VPN 客户端,我在服务器 (10.0.1.252) 上运行 OpenVPN。

连接到 VPN 后,服务器会添加典型的静态路由,并且我已启用转发和 NAT,因此来自 $private_lan -> 的流量<vpn_netblocks>会正确地通过 NAT 路由到 VPN 隧道 (tun0)。我的 DNS 递归器在该服务器上运行,并且知道将某些 DNS 请求转发到内部 DNS 服务器。一切正常。

最后一点是让 LAN 客户端知道 VPN。它们的默认路由是 AEBS (10.0.1.1)。这是理想的,因为 AEBS 和电缆调制解调器有自己的电池,因此网络在断电后仍能保持数小时。LAN 客户端要获得 VPN 访问权限,他们需要了解服务器上可用的更具体的路由。在 Mac OS 上,手动添加静态路由如下:

route add 10.7.0.0/16 10.0.1.252

问题是如何自动通知 Mac 和 iOS 设备这些路由可用。我无法向 AEBS 添加静态路由(我很高兴被证明是错的!)。将默认 IPv4 路由更改为指向服务器是我的最后手段。

我尝试将路由作为静态路由(dhcp 选项代码 121)添加到 dhcpd.conf,如RFC 3442。这是我的 dhcpd.conf 的相关部分:

# options for static routes
option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

subnet 10.0.1.0 netmask 255.255.255.0 {
      option rfc3442-classless-static-routes 16, 10,7, 10,0,1,252;
      option ms-classless-static-routes      16, 10,7, 10,0,1,252;
      # needed b/c this overrides option routers
      option rfc3442-classless-static-routes  0, 10,0,1,1;
      option ms-classless-static-routes       0, 10,0,1,1;
}

这些选项由 dhcpd 提供,但它们被 Mac OS X 忽略。 有没有:

  1. 其他 DHCP 选项可以起作用吗?
  2. 如果我设置了 OSPF 或 RIP,它是否对 Mac 和 iOS 设备都“有效”?
  3. 类似于 IPv4 的邻居发现协议吗?

非常感谢您提供已知有效的文档指针。

更新

  1. 添加了 dhcpd.conf 显示我的配置
  2. 添加了指向 Apple 讨论的链接,指出不支持 RFC 3442

答案1

Ad.1 我不是 OS X 专家,但您可以尝试像这样设置 DHCP 选项 249 (ms-classless-static-routes):

option ms-classless-static-routes 24, 192, 168, 16, 192, 168, 6, 1; 
24 - mask (number of bits)
192, 168, 16 - network address
192, 168, 6, 1 - gateway

还有 DHCP 选项 33(单一路由):-https://ercpe.de/blog/advanced-dhcp-options-pushing-static-routes-to-clients

单程

推送单条路由非常简单。配置值由两个十六进制的 IP 地址对组成。第一个地址是目标主机,第二个是路由器。

例子:

Destination: 192.168.123.234 (Hex: C0:A8:7B:EA)
Router: 10.34.72.42 (Hex: 0A:22:48:2A)

该值为:C0:A8:7B:EA:0A:22:48:2A

注意:这是 pfSense 配置,要在 dhcpd 中使用它,您需要将十六进制转换为十进制。

您可能犯了一些错误,可以向我们展示 dhcpd 配置吗?

这里有非常好的描述:https://ercpe.de/blog/pushing-static-routes-with-isc-dhcp-server

使用 pfsense 将静态路由推送到 dhcp 客户端比较棘手,因为您必须将网络和路由器信息指定为原始十六进制值。使用 ISC DHCP 服务器完成相同任务更容易。首先,我们必须在全局范围内向服务器声明 dhcp 选项:

option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

第二行用于 Windows 客户端,因为 MS 决定使用 dhcp 选项 249 而不是现有的 121。下一步是在我们的子网定义中声明这些选项:

 subnet 192.168.1.0 netmask 255.255.255.0 {
     ... other options ....
     option rfc3442-classless-static-routes 24, 192, 168, 123, 10, 10, 10, 1, 0, 192, 168, 1, 2;
     option ms-classless-static-routes 24, 192, 168, 123, 10, 10, 10, 1, 0, 192, 168, 1, ;
 }

选项的格式为:

<netmask>, <network-byte1>, <network-byte2>, <network-byte3>, <router-byte1>, <router-byte2>, <router-byte3>

其中省略了值为 0 的字节。同样,您应该在选项中包含默认路由,因为 dhcp 客户端可以忽略选项 routers xxxx 选项。因此,选项行 rfc3442-无类静态路由 24、192、168、123、10、10、10、1、0、192、168、1、2指定以下路由信息:

24, 192, 168, 123, 10, 10, 10, 1: 192.168.123.0/24 via 10.10.10.1 0,
192, 168, 1, 2: 0.0.0.0 via 192.168.1.2 (default route)

请务必阅读评论。

还有其他线程@serverfault 可能会有用:

https://serverfault.com/questions/248821/does-the-os-x-dhcp-client-support-classless-static-routes-rfc3442

还有一件事:您知道 OpenVPN 的推送选项吗?您可以通过添加如下选项直接通过 OpenVPN 服务器推送路由:

push "route 192.168.16.0 255.255.255.0 192.168.6.1" 

这意味着通过 192.168.6.1 将网络 192.168.16.0 的静态路由传递给客户端,并通过 192.168.6.1 掩码 255.255.255.0。

答案2

你不能只设置 LAN 客户端的默认网关指向 OpenVPN 服务器吗?它已经是一个路由器,应该知道所有正确的路由。

我假设它位于您的局域网上,因此本地客户端可以访问它。它会知道将内容转发到 OpenVPN 网络。它会将内容转发到您的边界路由器,或者为尝试与 Internet 通信的系统发送 ICMP 重定向。

答案3

看来这个问题的正确答案是“你不能”。

Mac OS X(和 iOS)不支持 RFC 3442,尽管 Mac OS X 10.10 仍然包含 routed 的手册页,但二进制文件已不再存在。

有解决方法。

  1. 为了通知 Mac OS X 客户端更具体的路由,可以通过名为斑驴其中包括 ripd 和 ospfd,它们随后可以从服务器上的等效守护进程(routed、quagga、zebra)中了解 OpenVPN 路由。这很麻烦,需要避免 #2。

  2. 将默认 IPv4 路由指向服务器(而不是路由器)并使用较短的 DHCP 租约。当服务器不可用时,DHCP 租约会很快到期,设备会从 AEBS 获取新的租约,并以自身作为默认网关。

(是的,我的 LAN 上有两个 DHCP 服务器,已经使用了十多年,服务器上的 dhcpd 获胜,除非它关闭,也就是说,它运行完美)。

相关内容