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

我们用这个tutorial设置了一个L2TP VPN服务器,一切都像魅力一样.

唯一的问题是

>我们不希望客户端使用此VPN路由所有流量,仅使用特定子网,例如10.0.0.0/20
>在Mac上,我们需要使用命令手动设置路由,但对于移动设备,似乎没有办法这样做?

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

最佳答案
好的,这个问题在互联网上一遍又一遍地被问到,并且大多数时候有一个(半)错误的答案,你不能做原始帖子中描述的内容.让我一劳永逸地澄清一下:)

简短的回答是L2TP(并且PPTP就此而言)没有设施在协议内部进行路由推送,但它可以在协议之外实现.

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

首先,它是如何工作的:

>客户端连接到VPN服务器
>成功验证后,建立安全隧道
>客户端在连接后使用DHCPINFORM消息来请求DHCP Classless Static Routes选项.此DHCP选项包含一组自动添加到请求客户端的路由表的路由(我直接从Microsoft文档中直接复制并粘贴此行:))
> VPN服务器使用适当的路由集回复该消息

嗯,有一个警告:

> RFC-3442描述了“DHCP无类别静态路由”,并指出此选项的代码为121.微软决定重新发明轮子(一如既往)并使用代码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 ~]# 
===

此时,我们的客户端可以通过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

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

转载注明原文:linux – L2TP VPN是否可以在连接期间为客户端进行自动路由配置? - 代码日志