Linux

L2TP VPN 是否可以在連接期間為客戶端進行自動路由配置?

  • December 14, 2016

我們已經使用本教程設置了一個 L2TP VPN 伺服器,一切都像一個魅力。

唯一的問題是

  1. 我們不希望客戶端使用此 VPN 路由所有流量,僅路由特定子網,例如 10.0.0.0/20
  2. 在 Mac 上,我們需要使用命令手動設置路由,但是對於移動設備,似乎沒有辦法這樣做?

那麼,可以為客戶端自動配置子網“10.0.0.0/20”嗎?

好的,這個問題在網際網路上被一遍又一遍地問到,大多數時候有一個(半)不正確的答案,你不能按照原帖中的描述做。讓我一勞永逸地澄清它:)

簡短的回答是 L2TP(以及 PPTP)在協議內部沒有進行路由推送的設施,但可以在協議外部實現。

由於 L2TP 是 Microsoft 的一項發明,因此最好的資訊來源是他們的技術文件(順便說一下,他們非常擅長)。我將在下面解釋的技術描述可以在VPN 定址和路由中找到。正確設置所有內容的關鍵字(如果您要進行自己的研究)是:DHCPINFORM 和“無類靜態路由”。

首先,它是如何工作的:

  1. 客戶端連接到 VPN 伺服器
  2. 成功認證後建立安全隧道
  3. 客戶端在連接後使用 DHCPINFORM 消息請求 DHCP 無類別靜態路由選項。此 DHCP 選項包含一組路由,這些路由會自動添加到請求客戶端的路由表中(我直接從 Microsoft 文件中盲目地複制並粘貼了這一行:))
  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 設置)。在某些客戶端上,還有一個名為“禁用基於類的路由添加”的選項 - 它必須取消設置,因為它明確禁用了我們嘗試實現的功能。

引用自:https://serverfault.com/questions/574121