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

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

唯一的问题是

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

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

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

好的,这个问题一遍又一遍地在互联网上被问到,大多数时候有一个(半)不正确的答案,你不能做原来的文章中所描述的。 让我澄清它一劳永逸:)

简短的答案是L2TP(和PPTP有关)在协议内部没有设施来做路由推送,但它可以在协议之外实现。

由于L2TP是微软的发明,最好的信息来源是他们的技术文档(顺便说一句,他们非常擅长)。 我将在下面解释的技术说明可以在VPN寻址和路由中find 。 正确设置一切的关键字(如果你打算自己做研究的话)是:DHCPINFORM和“无类静态路由”。

首先,它是如何工作的:

  1. 客户端连接到VPN服务器
  2. 在成功authentication之后,build立安全隧道
  3. 客户端在连接后使用DHCPINFORM消息来请求DHCP Classless Static Routes选项。 这个DHCP选项包含一组自动添加到请求客户端的路由表中的路由( 我直接从Microsoft文档中直接拷贝和粘贴这行
  4. VPN服务器用适当的路由组回复该消息

那么,有一个警告:

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

我将描述一个典型的使用Linux机箱作为VPN服务器的configuration(您可以使用指向Microsoft文档的链接来configurationMS服务器)。

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

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

以下是工作accel-pppconfiguration的转储。 我正在整体提供,否则将很难解释什么地方。 如果您已经有了VPN,那么您可以跳过这个configuration文件,专注于下面介绍的DHCPconfiguration。

[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服务器进行通信。 所以,唯一缺less的部分是DHCP服务器正在监听创build的隧道,并用必要的信息回应。 以下是dnsmasqconfiguration文件的摘录(我只提供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。

最后,如果您嗅探networkingstream量(例如,在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我几乎忘记了成功使用上述configuration所需的重要部分。 那么,在我提到的微软文档中有描述,但是谁阅读了文档? :)确定,客户端应该在VPN连接上没有“使用默认网关”(在Windows上是连接的属性 – >networking – > Internet协议版本4(TCP / IPv4) – >属性 – >高级 – > IP设置)。 在某些客户端,还有一个选项叫做“禁用基于类的路由添加” – 它必须是未设置的,因为它明确地禁用了我们试图实现的function。

我不认为你可以在L2TP / IPSEC VPN中推送路由到客户端。 您将不得不直接在客户端上进行configuration。

什么移动客户端,你有麻烦? 如果我们知道您使用的操作系统和软件,则提供一些input会更容易。