2017年9月4日 星期一

在 Raspberry Pi 樹莓派上實作 PiVPN 個人 OpenVPN 伺服器

在台灣被稱作樹莓派(官方名稱:Raspberry Pi )的開發用單板電腦其實有很多種用法,從低成本電腦到各類物聯網( IoT )裝置的基礎系統都可以,當然也有很多開發者把它當作小型伺服器來使用,運行 FTP/SFTP 伺服器做本地備份端,或是運行本地端的 Proxy Server、印表機伺服器等等,甚至也有人把它當作網頁伺服器來使用,安裝 Apache HTTP Server 跟其他必須軟體套件就好

之前是有買過一次樹莓派,不過是拿來當桌上的超小型迷你電腦,只要安裝小螢幕跟客製機殼,插上電源、連接鍵盤滑鼠就是一台小型桌上電腦,缺點就是那螢幕的解析度實在是慘不忍睹(HiRES+, 480 x 320 ),但看在 Waveshare 的螢幕這麼便宜,還有電阻式觸控的功能,就別計較了吧,之後大概會把它改裝成天氣顯示器

這次則是再額外買了一片樹莓派,不過這次打算讓他運行 OpenVPN 伺服器,讓使用公共無線熱點的裝置可以使用加密連線,強化安全性,當然這也是私人 OpenVPN 伺服器的優點之一,另一個優點是在學術網路或企業對外網路那種網路連線會被管制的地方可以做一些偷雞摸狗的事情,讓網路管理員不知道你在做什麼(你懂得


2017_09_02_170854
Raspberry Pi 3 Model B,內建 10/100Mbps 乙太網介面,而非前代是用內建 USB 通道轉接
2017_09_02_170830
在主要晶片上都黏貼散熱片,要讓樹莓派長時間運作還是安裝散熱片比較妥當
2017_09_02_170800
這款自行採購的黑色散熱片面積比晶片大,所以使用官方的塑膠機殼時要稍微切一下
2017_09_02_170652
蓋上蓋子,蓋子跟機殼間是有設計通風孔的
2017_09_02_231950
在俗稱小烏龜的中華電信 vDSL 數據機旁邊用 PP 瓦楞板做了一個支架給樹莓派,注意有留燈號跟電源的開口

在這邊來額外分享一下自製的數據機散熱方案

雖然說自從升級到光世代 100M/40M 而換成 vDSL 數據機( 使用光纖到交換機的 FTTE 模式,所以不是光纖數據機)之後,數據機熱到當機這個情況沒遇過,但有鑑於以前 ADSL 時代真的遇過熱到當機,所以一直有注意數據機散熱的問題,在之前整理線材而把數據機移動到家具櫃裡面時就做了主動式散熱

而這次則是趁著把樹莓派安裝到數據機旁邊時做了一些小改裝,並重新整理一下網路線與電源線

使用工具是繞線管、束帶、黏貼式固定座,而整線邏輯不外乎注意立體交錯順序、線材角度、綑綁鬆緊度


2017_09_02_231950
剛安裝好樹莓派時,數據機散熱方案還是用一次性束帶固定風扇
2017_09_06_005428
把之前使用一次性束帶的風扇改用螺絲、螺母與墊片固定
2017_09_06_005444
風扇架後方有強化用的、不同走向的加強條
2017_09_06_011344
將冷空氣從上方吹入數據機上方的開口,達成強制冷卻的效果
2017_09_06_011334
故意選用較長的螺絲是方便固定風扇護網、之後也可以換成金屬材質的護罩
2017_09_06_011408
風扇架一側使用魔鬼氈膠條,方便打開風扇架清理積塵或調整網路線
2017_09_09_111716
電源線與數據線隔離,後面走樹莓派與風扇的電源線,網路線走前面,vDSL 的銅纜與接線盒在頂部
2017_09_04_125022
紅色是中華電信 MOD 專線,灰色連接 AirPort Extreme 的 WAN,藍色是樹莓派,白色是 Apple TV,綠色是分享器橋接

硬體部分差不多就是這樣,再來是軟體的部分,AirPort Extreme 上要作傳輸埠指定,樹莓派則要安裝必須的軟體才能上線服務

DHCP/NAT 的傳輸埠指定可以將特定的傳輸埠開放到網路( WAN )上、並轉發給內部網路( LAN )的指定裝置,藉由傳輸埠指定可以讓使用者從外部連線回到內部網路,在這裡就是讓樹莓派可以從遠端操作,並讓 OpenVPN 服務可以運作

而 AirPort Extreme 的傳輸埠指定需要與設定 DHCP 保留,這樣樹莓派的內部網路位址才不會亂跳而讓傳輸埠指定失效

在這邊要強調的是,樹莓派的管理者密碼一定要設定為強密碼,因為一開啟 SSH 連線功能後,幾乎是立刻會被網路上的惡意程式試探登入,在安裝好樹莓派之後一定要立刻設定好強密碼再開啟 SSH 連線功能的選項,否則在設定傳輸埠指定後你的樹莓派幾乎是在網路上裸奔

而建議在樹莓派上安裝的軟體依序是 vim、scrot、fail2ban、nmon、vnstat、watchdog,用 sudo apt-get install 指令安裝


2017_09_03_232312
首先設定 DHCP 保留,通常用 MAC 位址去綁定,如何查詢樹莓派的 MAC 位址請去 Google,DHCP 保留設定依照各家廠商而不同
2017_09_03_232321
接著設定給 SSH/SFTP 加密傳輸的傳輸埠指定,埠號 22,指定到你剛剛保留給樹莓派的內部網路位址去
2017_09_02_175746
這樣你就可以從網路上存取你的樹莓派
2017_09_02_180103
這邊開始是把樹莓派接上螢幕操作,scrot 是一套很方便的終端機擷圖軟體,安裝後只要輸入 scrot 指令即可
2017_09_02_175828
安裝 fail2ban 來保護你的樹莓派
2017_09_02_175941
安裝 Watchdog
2017_09_02_175902
Watchdog 是內建於樹莓派的硬體看門狗,啟用後可以在樹莓派當機時自動重啟
2017_09_02_180021
另外安裝了 NTP 網路校時,因為樹莓派並沒有內建時鐘迴路
2017_09_02_170154
接著安裝 PiVPN 程式,一行 curl -L https://install.pivpn.io | bash 就可以開始
2017_09_02_170120
PiVPN 安裝程式會啟動
2017_09_02_170006
PiVPN 會提醒你要靜態網路位址,其實不只內部網路,對外也建議使用固定位址(中華電信用戶可以去申請一個固定制位址)
2017_09_02_165802
安裝過程有點久,尤其是生成 OpenVPN 使用的靜態金鑰那裡,即使是預設長度也夠嗆了
2017_09_02_165738
安裝完成後會重新開機,之後輸入 pivpn 這個指令就可以看到新增的額外指令
2017_09_02_165557
pivpn add 可以建立使用者帳號,生成的 opvn 設定檔會放在特定目錄下,透過 sftp 服務就可以存取
2017_09_02_162837
pivpn clients 可以查看連線中的使用者
2017_09_03_232330
記得把在安裝過程中設定給 OpenVPN 的傳輸埠指定到你剛剛保留給樹莓派的內部網路位址去

基本上到這裡應該就沒問題了,但人生總是會有一堆意外,跟一堆狗屎相容性問題

我自己在 Windows / macOS 上是使用付費的第三方 VPN 管理軟體 Viscosity,而 iOS 上則是使用 OpenVPN 官方的管理套件,而官方管理套件在匯入 PiVPN 的設定檔後會在連線時提示 PolarSSL: error parsing config private key : PKCS5 - Requested encryption or digest alg not available 而無法使用

這是不同廠商或是開源社群在實作 OpenVPN 時在加密演算法的相容性問題,在使用行動裝置上 OpenVPN 官方提供的管理套件時可能會有點問題,主要是行動裝置支援的加密演算法有限

接著開始找解法,有的解法是說是說直接改金鑰字串的檔頭跟檔尾,把 ENCRYPTED PRIVATE KEY 改成 RSA PRIVATE KEY ,然後再字串中加上 Proc-Type: 4,ENCRYPTED 跟 DEK-Info 等敘述,但實作去嘗試是失敗的,會跑另外一個 PEM 的錯誤訊息

在看了一堆外國社群的解法後,發現最佳解法是在 Reddit 論壇上的樹莓派開發社群,只能說想出這個解法的真的是個天才

cd /etc/openvpn/easy-rsa | 終端機移動到這個目錄

sudo ./easyrsa set-rsa-pass opvnuser | 執行 RSA,opvnuser 是 OpenVPN 帳號,會要求你輸入建立 OpenVPN 帳號時輸入的密碼

sudo vim pki/private/opvnuser.key | 使用 vim 編輯器檢視剛剛製作的金鑰檔案,這個存放金鑰的位置用 sftp 是看不了的,權限關係會拒絕存取

BEGIN RSA PRIVATE KEY | 找到這個段落,當然可以用全選把整個字串拷貝到剪貼簿後慢慢翻找

BEGIN ENCRYPTED PRIVATE KEY | 在你的 opvn 檔案中找到這個段落,取代它或是在 END ENCRYPTED PRIVATE KEY 後面依照金鑰字串的格式接續,我是選擇接續貼在後面而不是取代


2017_09_04_212634
沒意外的話在 Windows/Mac 上都可以正常使用
2017_09_04_235953
但是在 OpenVPN 官方發行的行動裝置客戶端上會出現問題
RSA
依照上面的操作,使用 set-rsa-pass 來製作 RSA 金鑰然後編輯 opvn 檔即可

這篇文章裡面省略的一些在 UNIX 環境下的指令跟操作方式,像是 vim 編輯器的操作跟在終端機下移動於不同目錄等等,可以參考 鳥哥的 Linux 私房菜 ,或是我之前在 VPS 上安裝 OpenVPN Access Server Shadowsocks 的教學

沒有留言:

張貼留言