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

How*_*ard 17 linux vpn ipsec l2tp linux-networking

我们已经使用本教程设置了一个 L2TP VPN 服务器,一切都像魅力一样。

唯一的问题是

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

  2. 在 Mac 上,我们需要使用命令手动设置路由,但对于移动设备,似乎没有办法这样做?

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

gal*_*axy 38

好的,这个问题在互联网上被一遍遍地问,大多数时候都有一个(半)不正确的答案,你不能做原始帖子中描述的事情。让我一劳永逸地澄清一下:)

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

由于 L2TP 是 Microsoft 的发明,因此最好的信息来源是他们的技术文档(顺便说一下,他们非常擅长)。我将在下面解释的技术说明可以在VPN 寻址和路由中找到。正确设置所有内容的关键字(如果您要自己研究的话)是:DHCPINFORM 和“无类静态路由”。

首先,它是如何工作的:

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

嗯,有一个警告:

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

我将描述使用 Linux box 作为 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 ~]# 
===
Run Code Online (Sandbox Code Playgroud)

此时我们的客户端可以通过 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 ~]#
Run Code Online (Sandbox Code Playgroud)

在上面的摘录中,我们通过 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
Run Code Online (Sandbox Code Playgroud)

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

  • 另外,当我提供了一个指向 Microsoft L2TP 技术文档的链接时,得到这种评论是很奇怪的,其中描述了如何使用 DHCPINFORM 正确设置。我可以理解当人们不想阅读答案时(尽管它包括来自工作系统的配置文件),因为它是某人的研究,但是当有技术规范时说“我认为 PPP 不支持 DHCP”协议的创建者声称这就是它的设计方式,这有点奇怪。 (2认同)