之前都在 DSM 上面折騰 Docker,但是最近 Synology 放出的新版本 Docker(17.05.0-0349)
似乎有點問題不太穩定,經常所有映像檔清單消失,或者出現各種疑難雜症
(PS:2017/12/13 Synology Docker 17.05.0-0366 有稍微改善一點)
於是我慢慢把一些應用搬出來到樹莓派(Raspberry Pi)裡面
樹莓派真心不錯,便宜又大碗而且還挺省電的,跑跑消耗資源不是很多的應用非常適合
目前把 Pi-hole、Home 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 主機證書
|
|
同樣,以上第 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
刪除該檔案所有內容,然後複製以下內容貼上
|
|
以上第 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