之前都在 DSM 上面折騰 Docker,但是最近 Synology 放出的新版本 Docker(17.05.0-0349)

似乎有點問題不太穩定,經常所有映像檔清單消失,或者出現各種疑難雜症

(PS:2017/12/13 Synology Docker 17.05.0-0366 有稍微改善一點)

於是我慢慢把一些應用搬出來到樹莓派(Raspberry Pi)裡面

樹莓派真心不錯,便宜又大碗而且還挺省電的,跑跑消耗資源不是很多的應用非常適合

目前把 Pi-holeHome Assistant、UniFi Controller 跟 VPN Server 都搬過去了~

本文是基於這篇文章: VPN Server on Raspbian Jessie for iOS 9 and OS X El Capitan Clients ,自己踩坑修改完成的

並成功在 iOS 11.2.1 & macOS 10.13.2 完成測試

在想要安裝 IKEv2 VPN 以前,有考慮過 ocserv 的 AnyConnect 方案

但是因為 Cisco AnyConnect 電腦版軟體取得以及更新比較不容易,所以就直接採用 IKEv2 VPN

IKEv2 VPN 目前幾乎所有主流系統都已經內建,包含 iOS 9+、macOS 10.11+ 或者是 Windows 7+

都不需要額外安裝軟體就能直接設定使用,完美兼容

本文使用的硬體以及系統版本:

  • 樹莓派 Raspberry Pi 3B(Raspbian
  • MacBook Pro(macOS 10.13.2)
  • iPhone X(iOS 11.2.1)

事前的準備工作:

  • 一套已經安裝好 Raspbian 系統的樹莓派,並開啟 SSH 訪問與固定好樹莓派的內網 IP
  • 在路由器上打開 UDP 500、UDP 4500 兩個端口,指向樹莓派的內網 IP(以下文章範例為 192.168.2.200
  • 一個外網固定 IP 或者是動態 DNS 也可以(以下文章範例為 vpn.jkg.tw

把樹莓派系統更新到最新版本

$ ssh [email protected]
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get install rpi-update && echo Y | sudo rpi-update

更新完成後重新啟動一次

$ sudo reboot

安裝 strongSwan 與相關軟體

稍等幾十秒等機器重開後再 SSH 登入回去,然後變更身份為 root(因為接下來操作需要 root 權限)

$ sudo -s

安裝軟體

$ apt-get install strongswan libcharon-extra-plugins strongswan-pki insserv vim

安裝完以後確認一下版本

$ ipsec version

看起來大概會長下面這樣,我的版本是 5.5.1

證書

生成自簽 CA 證書

cd /etc/ipsec.d/
$ ipsec pki --gen --type rsa --size 4096 --outform pem > private/strongswan-key.pem
$ chmod 600 private/strongswan-key.pem
$ ipsec pki --self --ca \
--lifetime 3650 \
--in private/strongswan-key.pem \
--type rsa \
--dn "C=TW, O=jkgtw, CN=jkgtw Root CA" \
--outform pem > cacerts/strongswan-certificate.pem

以上第 8 行的 C 是國碼,O 是組織名稱,CN 是通用名稱,請根據自己情況自行修改

生成 VPN 主機證書

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ cd /etc/ipsec.d/
$ ipsec pki --gen --type rsa --size 2048 --outform pem > private/vpn-host-key.pem
$ chmod 600 private/vpn-host-key.pem
$ ipsec pki --pub --in private/vpn-host-key.pem --type rsa | \
ipsec pki --issue --lifetime 730 \
--cacert cacerts/strongswan-certificate.pem \
--cakey private/strongswan-key.pem \
--dn "C=TW, O=jkgtw, CN=vpn.jkg.tw" \
--san "vpn.jkg.tw" \
--flag serverAuth --flag ikeIntermediate \
--outform pem > certs/vpn-host-certificate.pem

同樣,以上第 8 跟第 9 行,請根據自己情況自行修改

生成客戶端證書

$ cd /etc/ipsec.d/
$ ipsec pki --gen --type rsa --size 2048 --outform pem > private/jkgtw-key.pem
$ chmod 600 private/jkgtw-key.pem
$ ipsec pki --pub --in private/jkgtw-key.pem --type rsa | \
ipsec pki --issue --lifetime 730 \
--cacert cacerts/strongswan-certificate.pem \
--cakey private/strongswan-key.pem \
--dn "C=TW, O=jkgtw, [email protected]" \
--san "[email protected]" \
--outform pem > certs/jkgtw-certificate.pem

同樣,以上名稱部分請根據自己情況自行修改

輸出客戶端證書

以下會輸出 PKCS p12 客戶端證書,輸出過程會提示輸入密碼

這個密碼是客戶端在安裝證書時候會要求輸入的

$ cd /etc/ipsec.d/
$ openssl pkcs12 -export -inkey private/jkgtw-key.pem \
-in certs/jkgtw-certificate.pem \
-name "jkgtw's VPN Certificate" \
-certfile cacerts/strongswan-certificate.pem \
-caname "jkgtw Root CA" \
-out certs/jkgtw.p12

至此所有需要的證書都已經生成完畢,我們再透過以下指令

把兩個客戶端安裝時需要用到的證書複製到 home/pi 目錄下,方便取用

$ cp /etc/ipsec.d/cacerts/strongswan-certificate.pem /home/pi
$ cp /etc/ipsec.d/certs/jkgtw.p12 /home/pi

Server 配置

strongSwan 的設定檔

這邊可以用自己熟悉的文字編輯器,nano 之類也是可以,我習慣用 vim

$ 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
30
31
32
33
34
35
36
37
38
# ipsec.conf - strongSwan IPsec configuration file

config setup
charondebug="cfg 2, dmn 2, ike 2, net 2"
uniqueids=never

conn %default
compress=yes
dpdaction=restart
dpddelay=30s
inactivity=300s
fragmentation=yes
forceencaps=yes
rekey=no
keyexchange=ikev2
leftauth=pubkey
left=%any
leftid=@vpn.jkg.tw
leftcert=vpn-host-certificate.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=[email protected]
rightcert=jkgtw-certificate.pem
rightsourceip=10.0.0.0/24
rightdns=8.8.8.8,8.8.4.4
ike=aes256-sha1-modp1024,aes128-sha1-modp1024,aes256-sha256-modp1024,3des-sha1-modp1024!
esp=aes256-sha256,aes256-sha1,3des-sha1!

conn iOS
auto=add

conn OSX-EAP-TLS
rightauth=eap-tls
rightcert2=jkgtw-certificate.pem
auto=add

include /var/lib/strongswan/ipsec.conf.inc

以上第 18、23、24、35 行,請根據自己的情況修改

注意:第 18 行,如果使用的跟我一樣是域名,需要在域名前加一個 @ ,如果是 IP 則不需要

編輯完以後,保存退出

PS:如果想要了解所有設定選項的作用,可以到 strongSwan 官方 WiKi 頁面查看: https://wiki.strongswan.org/projects/strongswan/wiki/ConnSection

接下來編輯密碼檔案

$ vim /etc/ipsec.secrets

打開後,在最下面增加一段

: RSA vpn-host-key.pem

存檔退出,然後輸入以下指令可以讓系統重讀密碼檔案

$ ipsec rereadsecrets

啟用系統轉發功能

$ vim /etc/sysctl.conf

找到以下三行選項,刪除這三行選項前面的 # 符號,這三行不會連續出現,要稍微找一下

#net.ipv4.ip_forward=1

#net.ipv4.conf.all.accept_redirects = 0

#net.ipv4.conf.all.send_redirects = 0

修改完畢之後,保存退出,然後輸入以下指令啟動服務

$ sysctl -p

配置防火牆

在進行防火牆配置前,請先重新啟動一次機器

$ sudo reboot

等待幾十秒後再次 SSH 登入進去,同樣透過以下指令切換到 root

$ sudo -s

從這邊開始,透過 SSH 連線修改過程中可能會造成終端機當機,如果發生了,請關閉再重新打開即可

$ iptables -t nat -A POSTROUTING -o eth0 ! -p esp -j SNAT --to-source 192.168.2.200
$ iptables -A INPUT -p udp --dport 500 -j ACCEPT
$ iptables -A INPUT -p udp --dport 4500 -j ACCEPT
$ iptables -A INPUT -p esp -j ACCEPT
$ iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
$ iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
$ iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT

以上第 1 行的 192.168.2.200 為我的樹莓派內網固定 IP,請根據自身情況自行修改

接下來保存

$ iptables-save > /etc/iptables.conf

以上防火牆規則樹莓派在每次重新啟動後都會清空,所以我們這裡安裝 iptables-persistent 工具

讓我們剛剛設定的防火牆規則每次重開機都自動恢復

$ apt-get install iptables-persistent

安裝過程中全部都選 Yes 即可

讓 strongSwan 每次開機都自動啟動服務

$ vim /etc/init.d/ipsec

找到以下內容

# Provides: ipsec

# Required-Start: $network $remote_fs

# Required-Stop: $network $remote_fs

在兩行的 $remote_fs 後面添加 $syslog 字串,改完之後應該像下面這樣:

# Provides: ipsec

# Required-Start: $network $remote_fs $syslog

# Required-Stop: $network $remote_fs $syslog

存檔,退出

輸入以下指令,把 strongSwan 加入開機啟動服務

$ insserv -r ipsec
$ insserv ipsec

至此,所有 Server 端的設定都已經全部完成,接下來就是在 iOS 與 macOS 設定 VPN

Client 配置

開始前我們先把之前生成的兩個證書下載到本地的電腦,透過下面兩條指令可以把證書傳輸到本地 Downloads 文件夾

$ scp [email protected]:~/strongswan-certificate.pem ~/Downloads/
$ scp [email protected]:~/jkgtw.p12 ~/Downloads/

for iOS

以上兩個證書直接透過 AirDrop 或者是 iCloud Drive 甚至是 email 寄給自己都 OK

直接打開這兩個檔案,然後一路安裝

其中在安裝 p12 檔案的時候,會額外要求輸入一個密碼,那就是剛剛我們在 Server 上面生成證書的密碼

輸入完畢後就能安裝完畢

接著到 iOS 的「設定」 > 「一般」 > 「VPN」 > 「加入 VPN 設定」

類型:IKEv2

描述:隨意填寫

伺服器:vpn.jkg.tw

遠端識別碼:vpn.jkg.tw(對應 ipsec.conf 設定檔裡面的 leftid )

本機識別碼:[email protected](對應 ipsec.conf 設定檔裡面的 rightid )

使用者認證:選擇「憑證」

憑證:選擇剛剛匯入的「[email protected]

以上填寫完畢後,應該會跟下圖一樣

全部沒問題後,點一下右上角的「完成」即可

for macOS

使用 Spotlight 搜索「Keychain」程式,打開它

然後點一下左上角的「登入」,再點一下左下角的「憑證」

然後點一下左上角 Menu Bar 的「檔案」 > 「輸入項目」

先輸入 CA 證書「strongswan-certificate.pem」,系統會提示說不信任,請把它修改成「永遠信任」

然後再輸入客戶端證書「jkgtw.p12」,輸入時會提示要證書密碼,輸入完創建證書時的密碼後,完成輸入即可退出

接著到電腦的「系統偏好設定」 > 「網路」,左下角點「+」加入新的服務,選擇「VPN」跟「IKEv2」

這時候出現的內容與上面 iOS 設定差不多,同樣內容填寫進去即可~

另外因為樹莓派效能比較低的關係,VPN 速度的瓶頸大約在 50 Mbps 左右

不過我因為使用的是台灣之星雙 11 限速吃到飽方案,限速在 21M 左右。。。

所以其實樹莓派的 VPN 也足夠我自己在戶外移動使用了 XD