L2TP VPN 是否可以在連接期間為客戶端進行自動路由配置?
我們已經使用本教程設置了一個 L2TP VPN 伺服器,一切都像一個魅力。
唯一的問題是
- 我們不希望客戶端使用此 VPN 路由所有流量,僅路由特定子網,例如 10.0.0.0/20
- 在 Mac 上,我們需要使用命令手動設置路由,但是對於移動設備,似乎沒有辦法這樣做?
那麼,可以為客戶端自動配置子網“10.0.0.0/20”嗎?
好的,這個問題在網際網路上被一遍又一遍地問到,大多數時候有一個(半)不正確的答案,你不能按照原帖中的描述做。讓我一勞永逸地澄清它:)
簡短的回答是 L2TP(以及 PPTP)在協議內部沒有進行路由推送的設施,但可以在協議外部實現。
由於 L2TP 是 Microsoft 的一項發明,因此最好的資訊來源是他們的技術文件(順便說一下,他們非常擅長)。我將在下面解釋的技術描述可以在VPN 定址和路由中找到。正確設置所有內容的關鍵字(如果您要進行自己的研究)是:DHCPINFORM 和“無類靜態路由”。
首先,它是如何工作的:
- 客戶端連接到 VPN 伺服器
- 成功認證後建立安全隧道
- 客戶端在連接後使用 DHCPINFORM 消息請求 DHCP 無類別靜態路由選項。此 DHCP 選項包含一組路由,這些路由會自動添加到請求客戶端的路由表中(我直接從 Microsoft 文件中盲目地複制並粘貼了這一行:))
- 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 設置)。在某些客戶端上,還有一個名為“禁用基於類的路由添加”的選項 - 它必須取消設置,因為它明確禁用了我們嘗試實現的功能。