自從 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
設定 pptpd
編輯 /etc/pptpd.conf 設定檔
sudo vim /etc/pptpd.conf
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
編輯 xl2tpd 設定檔
sudo vim /etc/ppp/options.xl2tpd
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 設定。
設定 IPSec
sudo vim /etc/ipsec.conf
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=<SERVER_IP> leftprotoport=17/%any leftnexthop=%defaultroute right=%any rightprotoport=17/%any dpddelay=10 dpdtimeout=90 dpdaction=clear
上述最重要記得將 <SERVER_IP> 修改為 Server 要連上 Internet 的 Interface IP Address,其他的都不用改照抄即可。
設定 IPSec 連線密鑰
L2TP/IPSec 除了使用者帳號密碼之外,還需要一組連線密鑰,下面的「YOUR_SECRET_KEY」請自行設定一組字串,待會 Client 設定連線的時候會用到。
sudo vim /etc/ipsec.secrets
%any %any: PSK "YOUR_SECRET_KEY"
設定 L2TPD
sudo vim /etc/xl2tpd/xl2tpd.conf
[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
user1 xl2tpd USER_PASSWD *
這裡的 xl2tpd 就是對應前面設定 /etc/ppp/options.xl2tpd 檔案中的 name 欄位,可以多行建立多組連線的帳號密碼。這裡的密碼採用明碼存放,整個很不自然,也可以更換為 Unix PAM 來進行認證,保護密碼的方式會好一些。
快了快了,最後重新啟用服務
sudo service pptpd restart
sudo service ipsec restart
sudo service xl2tpd restart
設定 iptables NAT
由於我們想要透過 VPN 做壞事翻牆,所以記得啟用 IP Forward,Linux 設定如下:
sudo vim /etc/sysctl.conf
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...