L2TP VPN 可以在连接期间为客户端进行自动路由配置吗?

L2TP VPN 可以在连接期间为客户端进行自动路由配置吗?

我们已经用这个设置了一个 L2TP VPN 服务器教程,一切都进展顺利。

唯一的问题是

  1. 我们不希望客户端使用此 VPN 路由所有流量,只路由特定子网,例如 10.0.0.0/20

  2. 在Mac上,我们需要通过命令手动设置路线,但是对于移动设备,好像没有办法这样做?

那么,可以为客户端自动配置子网“10.0.0.0/20”吗?

答案1

好吧,这个问题在互联网上被问了一遍又一遍,大多数时候都有一个(半)错误的答案,即您无法按照原始帖子中描述的方式进行操作。让我一劳永逸地澄清一下 :)

简短的回答是 L2TP(以及 PPTP)没有在协议内部进行路由推送的功能,但可以在协议外部实现。

由于 L2TP 是 Microsoft 的发明,因此最好的信息来源是他们的技术文档(顺便说一句,他们在这方面相当擅长)。下面我将解释的技术描述可以在以下网址找到VPN 寻址和路由正确设置一切的关键词(如果您要进行自己的研究)是:DHCPINFORM 和“无类静态路由”。

首先,它是如何工作的:

  1. 客户端连接到 VPN 服务器
  2. 身份验证成功后,建立安全隧道
  3. 客户端在连接后使用 DHCPINFORM 消息来请求 DHCP 无类静态路由选项。此 DHCP 选项包含一组路由,这些路由会自动添加到请求客户端的路由表中(我直接从微软文档中复制粘贴了这一行:) )
  4. VPN 服务器使用适当的路由回复该消息

嗯,有一个警告:

  • RFC-3442描述“DHCP 无类静态路由”,其中指出此选项的代码为 121。Microsoft 决定重新发明轮子(一如既往),并使用代码 249 作为此选项。因此,为了支持更广泛的客户端,我们需要使用两个代码进行响应

我将描述使用 Linux 机作为 VPN 服务器的典型配置(您可以使用 Microsoft 文档链接配置 MS 服务器)。

要在客户端上配置路由,我们需要以下要素:

  • L2TP/IPSEC(或 PPTP)= 例如,accel-ppp 是一款不错的开源 L2TP/PPTP 服务器
  • DHCP 服务器 = 有很多,但我将描述 dnsmasq 的配置

以下是一个有效的 accel-ppp 配置的转储。我提供了完整的配置,否则很难解释什么在哪里。如果您的 VPN 已经正常工作,您可以跳过此配置文件并专注于下面描述的 DHCP 配置。

[root@vpn ~]# cat /opt/accel-ppp/config/accel-ppp.conf
[modules]
log_syslog
pptp
l2tp
auth_mschap_v2
ippool
sigchld
chap-secrets
logwtmp

[core]
log-error=/var/log/accel-ppp/core.log
thread-count=4

[ppp]
verbose=1
min-mtu=1280
mtu=1400
mru=1400
check-ip=1
single-session=replace
mppe=require
ipv4=require
ipv6=deny
ipv6-intf-id=0:0:0:1
ipv6-peer-intf-id=0:0:0:2
ipv6-accept-peer-intf-id=1

[lcp]
lcp-echo-interval=30
lcp-echo-failure=3

[auth]
#any-login=0
#noauth=0

[pptp]
echo-interval=30
echo-failure=3
verbose=1

[l2tp]
host-name=access-vpn
verbose=1

[dns]
dns1=192.168.70.251
dns2=192.168.70.252

[client-ip-range]
disable

[ip-pool]
gw-ip-address=192.168.99.254
192.168.99.1-253

[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
log-fail-file=/var/log/accel-ppp/auth-fail.log
log-debug=/var/log/accel-ppp/debug.log
copy=1
level=3

[chap-secrets]
gw-ip-address=192.168.99.254
chap-secrets=/etc/ppp/chap-secrets

[cli]
telnet=127.0.0.1:2000
tcp=127.0.0.1:2001

[root@vpn ~]# 
===

此时,我们的客户端可以通过 L2TP(或 PPTP)连接并与 VPN 服务器通信。因此,唯一缺少的部分是 DHCP 服务器,该服务器正在监听创建的隧道并返回必要的信息。以下是 dnsmasq 配置文件的摘录(我仅提供与 DHCP 相关的选项):

[root@vpn ~]# grep -E '^dhcp' /etc/dnsmasq.conf 
dhcp-range=192.168.99.254,static
dhcp-option=option:router
dhcp-option=121,192.168.70.0/24,192.168.99.254,192.168.75.0/24,192.168.99.254,10.0.0.0/24,192.168.99.254
dhcp-option=249,192.168.70.0/24,192.168.99.254,192.168.75.0/24,192.168.99.254,10.0.0.0/24,192.168.99.254
dhcp-option=vendor:MSFT,2,1i
[root@vpn ~]#

在上面的摘录中,我们通过 192.168.99.254(VPN 服务器)推送路由 192.168.70.0/24、192.168.75.0/24 和 10.0.0.0/24。

最后,如果你嗅探网络流量(例如在 VPN 服务器上),你会看到类似以下内容的 DHCPINFORM 消息响应:

19:54:46.716113 IP (tos 0x0, ttl 64, id 10142, offset 0, flags [none], proto UDP (17), length 333)
    192.168.99.254.67 > 192.168.99.153.68: BOOTP/DHCP, Reply, length 305, htype 8, hlen 6, xid 0xa27cfc5f, secs 1536, Flags [none]
      Client-IP 192.168.99.153
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: ACK
        Server-ID Option 54, length 4: 192.168.99.254
        Domain-Name Option 15, length 18: "vpn.server.tld"
        Classless-Static-Route-Microsoft Option 249, length 24: (192.168.70.0/24:192.168.99.254),(192.168.75.0/24:192.168.99.254),(10.0.0.0/24:192.168.99.254)
        Vendor-Option Option 43, length 7: 2.4.0.0.0.1.255

PS 我几乎忘记了成功使用上述配置所需的一个基本部分。好吧,我在参考的 Microsoft 文档中对此进行了描述,但是谁读过文档?:) 好的,客户端应该在 VPN 连接上配置为不使用“使用默认网关”(在 Windows 上,它位于连接的属性 -> 网络 -> Internet 协议版本 4 (TCP/IPv4) -> 属性 -> 高级 -> IP 设置中)。在某些客户端上,还有一个名为“禁用基于类的路由添加”的选项 - 必须取消设置,因为它明确禁用了我们尝试实现的功能。

答案2

我认为您无法在 L2TP/IPSEC VPN 中将路由推送到客户端。您必须直接在客户端上进行配置。

您在使用哪个移动客户端时遇到问题?如果我们知道您使用的操作系统和软件,那么提供一些信息会更容易。

相关内容