自從 MacOS 升級到 10.12 之後,就已經拿掉系統預設的 PPTP VPN 連線方式,改用 L2TP/IPSec 這些比較安全的連線方式取代,很多人為了繼續使用 PPTP VPN 只好安裝第三方 VPN 連線工具,我實在不想裝,只好花點時間研究了一下 L2TP over IPSec,這種方式的 VPN 連線也比較安全。以下介紹如何在 Ubuntu Server 架設可以直接提供 MacOS 內建的 L2TP/IPSec VPN 連線服務,這樣就不需要裝一推 VPN Client 囉。
Ubuntu 14.04 安裝 pptpd 與 L2TP IPSec VPN 相關套件
測試的 Linux 版本為 Ubuntu Server 14.04 LTS,先用 apt 安裝需要的套件如下:
sudo apt-get install pptpd openswan xl2tpd
編輯 /etc/pptpd.conf 設定檔
sudo vim /etc/pptpd.conf
1
2
3
4
|
option /etc/ppp/pptpd-options
logwtmp
localip 192.168.200.254
remoteip 192.168.200.100-200
|
上述 localip 為 VPN Server 的虛擬 IP Address,當 Client 建立 ppp 連線後可以透過這個 IP 設定為 Gateway。remoteip 則是設定 Client 連上後要配發的 IP 範圍。
編輯 xl2tpd 設定檔
sudo vim /etc/ppp/options.xl2tpd
1
2
3
4
5
6
7
8
9
10
11
12
13
|
name xl2tpd
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noccp
auth
mtu 1460
mru 1460
crtscts
hide-password
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
|
上述設定檔中 name 是自訂名稱,但是要跟密碼檔 /etc/ppp/chap-secrets 的設定吻合,ms-dns 可以設定兩組(第三組無效),用來配發給連線的 Client 進行 DNS 設定。
sudo vim /etc/ipsec.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
version 2.0
config setup
dumpdir=/var/run/pluto/
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
oe=off
protostack=netkey
force_keepalive=yes
keep_alive=60
conn L2TP-PSK-NAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
ike=aes256-sha1,aes128-sha1,3des-sha1
phase2alg=aes256-sha1,aes128-sha1,3des-sha1
type=transport
left=
leftprotoport=17/%any
leftnexthop=�faultroute
right=%any
rightprotoport=17/%any
dpddelay=10
dpdtimeout=90
dpdaction=clear
|
上述最重要記得將
L2TP/IPSec 除了使用者帳號密碼之外,還需要一組連線密鑰,下面的「YOUR_SECRET_KEY」請自行設定一組字串,待會 Client 設定連線的時候會用到。
sudo vim /etc/ipsec.secrets
1 |
%any %any: PSK "YOUR_SECRET_KEY" |
sudo vim /etc/xl2tpd/xl2tpd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[global]
ipsec saref = yes
saref refinfo = 30
[lns default]
ip range = 192.168.200.100-192.168.200.200
local ip = 192.168.200.254
length bit = yes
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
|
這裡的設定記得 pppoptfile 要跟前面步驟的檔案一樣是 /etc/ppp/options.xl2tpd 即可,另外剛開始建議 ppp debug = yes 打開 Debug Log,連線失敗的時候就可以在 /var/log/pptpd.log 查看問題。
sudo vim /etc/ppp/chap-secrets
1 |
user1 xl2tpd USER_PASSWD * |
這裡的 xl2tpd 就是對應前面設定 /etc/ppp/options.xl2tpd 檔案中的 name 欄位,可以多行建立多組連線的帳號密碼。這裡的密碼採用明碼存放,整個很不自然,也可以更換為 Unix PAM 來進行認證,保護密碼的方式會好一些。
快了快了,最後重新啟用服務
sudo service pptpd restart
sudo service ipsec restart
sudo service xl2tpd restart
由於我們想要透過 VPN 做壞事翻牆,所以記得啟用 IP Forward,Linux 設定如下:
sudo vim /etc/sysctl.conf
1
2
3
4
5
6
7
|
net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
|
載入並生效設定
sudo sysctl -p /etc/sysctl.conf
設定 iptables 讓透過 Gateway eth0 出去的封包進行偽裝,就是 NAT 囉,如下:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
如果要開機自動載入可以加到 /etc/rc.local 檔案即可,最後透過以下命令驗證一下 IPSec,運氣好的話可以看到以下畫面:
sudo ipsec verify
這個錯誤「Two or more interfaces found, checking IP forwarding [FAILED]」可以不用理會,這樣就算完成囉。
完成囉,如果登入或連線有問題,可以檢查以下 Log File:
sudo tail -f /var/log/auth.log
設定 MacOS VPN 連線
系統偏好設定 > 網路 > + > 選「VPN」 > 選「透過 IPSec 的 L2TP」
設定連線 IP 與連線帳號,按下「認證設定...」
輸入登入密碼與密鑰,密鑰就是前面 /etc/ipsec.secrets 設定的那一組
輸入帳號的頁面按下「進階...」,勾選「透過 VPN 連線傳送所有流量」
然後進行「連線」就完成了,連線成功後可以在 Terminal 輸入以下命令,確認透過 VPN Gateway 上網:
route -n get default
看到 ppp0 就表示 OK 囉,如果連不上的話記得檢查一下防火牆,VPN Server 需要開啟 TCP 1723, UDP 500, UDP 4500 這些端口。如果你將以上的做法移植到 Ubuntu 16.04,是不會成功的!為什麼我還沒研究出來,Ubuntu 16.04 不 Work, 不 Work, 不 Work...