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

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