fbpx

Ubuntu 架設 L2TP IPSec VPN Server (Mac 相容)


macOS vpn L2TP IPSec

自從 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

上述 localip 為 VPN Server 的虛擬 IP Address,當 Client 建立 ppp 連線後可以透過這個 IP 設定為 Gateway。remoteip 則是設定 Client 連上後要配發的 IP 範圍。

設定 xl2tpd

編輯 xl2tpd 設定檔

sudo vim /etc/ppp/options.xl2tpd

上述設定檔中 name 是自訂名稱,但是要跟密碼檔 /etc/ppp/chap-secrets 的設定吻合,ms-dns 可以設定兩組(第三組無效),用來配發給連線的 Client 進行 DNS 設定。

設定 IPSec

sudo vim /etc/ipsec.conf

上述最重要記得將 <SERVER_IP> 修改為 Server 要連上 Internet 的 Interface IP Address,其他的都不用改照抄即可。

設定 IPSec 連線密鑰

L2TP/IPSec 除了使用者帳號密碼之外,還需要一組連線密鑰,下面的「YOUR_SECRET_KEY」請自行設定一組字串,待會 Client 設定連線的時候會用到。

sudo vim /etc/ipsec.secrets

設定 L2TPD

sudo vim /etc/xl2tpd/xl2tpd.conf

這裡的設定記得  pppoptfile 要跟前面步驟的檔案一樣是 /etc/ppp/options.xl2tpd 即可,另外剛開始建議 ppp debug = yes 打開 Debug Log,連線失敗的時候就可以在 /var/log/pptpd.log 查看問題。

設定連線密碼

sudo vim /etc/ppp/chap-secrets

這裡的 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

載入並生效設定

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...