2019年12月23日 星期一

用樹莓派自製 VPN 翻牆機


最近這兩週忙著從新加坡撤出,以及準備來深圳工作的相關事項,一直沒有時間更新網誌,如今終於迎來第一個週末 (由於一週工作六天,所以週日真的是很寶貴),就來聊聊我放在台灣的家中、用樹莓派搭建的簡易 VPN 吧!

由於眾所周知的原因,中國的網路預設有防火牆擋住人民瀏覽萬惡資本主義國家的邪惡網站 (咦),所謂的 VPN (Virtual Private Network),就是一個遠端的主機,我們可以藉由連上它,然後用它的網路上網。如果在網路上找 VPN 的搭建方法,找到的資料多到看不完,用一般的電腦都可以架,但為了省電,我選擇用我的 Raspberry Pi 4B 去當 VPN 的主機。

乍看之下,VPN 就像個遠端桌面,但實際上是有不小的差別,之中要搞定不少數位簽名的問題,一開始我找到幾篇老外寫的教學,看得我都放棄了,比如說:How to set up your own Raspberry Pi powered VPN。後來發現一個非常傻瓜的解決方案:PiVPN,這篇文章將會以這個 VPN 架站軟體為例,盡可能詳細地介紹從安裝到設定的方法 [1]。


安裝作業系統及相關準備工作

首先,PiVPN 並不像我前一篇文章提到的 Lakka 是個作業系統,它只是個軟體,所以必須先安裝作業系統。我在前篇文章有提到,安裝作業系統在樹莓派上要注意,因為硬體如果沒有標示有被支援,就真的完全不能用。目前很多系統都不支援最新的樹莓派 4,但有一個例外,也就是樹莓派基金會自己開發的系統 Raspbian,這是一定可以相容的,如果買的是樹莓派 3 也可以用。依照 PiVPN 的建議,下載最陽春的 Lite 版即可 (現在的版本是 Raspbian Buster Lite),因為 VPN 的重點是穩定,設定都是由遠端連線登入,不需要圖形介面及其他工具軟體浪費系統資源。

將燒錄好的記憶卡放入樹莓派,第一次開機請把樹莓派接上電源 [2]、螢幕 [3] 及鍵盤,以預設用戶名 (pi) 及密碼 (raspberry) 登入,然後以 passwd 指令修改登入密碼 (參考資料)。改完之後輸入 sudo raspi-config,以剛剛設定的使用者密碼執行樹莓派的設定程式,介面如下:


找到 "Interfacing Options" 選項,進入後選擇 SSH 並開通其服務,之後使用 hostname -I 或 ifconfig 查詢樹莓派的內網 IP (我的樹莓派接在路由器上,內網 IP 為 192.168.X.Y,XY 為小於 255 的任意整數),然後使用 shutdown -h now 指令關機 (參考資料)。

OK,之後的操作就不需要鍵盤及螢幕,直接在遠端主機 (比如我的 Mac) 的終端機上完成即可。打開 macOS 的終端機 (Terminal),使用 SSH 加密連線登入樹莓派,比如說我的使用者帳號為預設的 pi,SSH 的指令為 ssh pi@[樹莓派的內網 IP] (e.g. ssh pi@192.168.0.102),輸入密碼即可登入 (參考資料)。


安裝 PiVPN 及設定

安裝的方式非常簡單,就一行指令:curl -L https://install.pivpn.dev | bash,執行後會自動下載 PiVPN 及引導使用者設定內部參數。由於設定的方式十分直覺,太簡單的步驟大家都會,我就不多作介紹,擔心的人可以看這篇文章,以下只提示兩點最容易出錯的地方 [4]。

1. 給樹莓派設定一個固定的內網 IP


由於我們要從外面的網際網路連到樹莓派,所以若只讓路由器以 DHCP 隨機給連上它的設備分配一個內網 IP,那可能每次都不一樣,當然身處外界網路的裝置就找不到樹莓派。這個部分要在路由器中設定,我以我家的 dlink 路由器為例,其他牌子應該都差不多。


在區域網路的設定裡新增一個 DHCP 保留位置,以下拉選單選擇區網內的電腦 (此時就是樹莓派),子網域遮罩會自動填入,再填入想固定的區網 IP (此例為 192.168.0.105),儲存設定即可。


設定好樹莓派的固定內網 IP 之後,注意閘道 (Gateway) 必須是路由器在內網中的 IP (此例為 192.168.0.1),確認無誤之後進行下一步。

2. 設定外連的連接埠 (port)


接下來的部分就比較複雜,也是一般人設定失敗的主要原因。這部份與自家網路的架構有關,首先設定連線的通訊協議,選 UDP (User Datagram Protocol) 會省事很多,這部份就不展開說了,再來就是設定連接埠。


前面提到 VPN 需要一個固定的內網 IP,以便讓其他裝置從外部網路連進來,那連出去為何不用呢?主要就是我們的路由器 (router) 已經將我們連出去時使用的區網 IP 記下來了,這就是 NAT (Network Address Translation) 的功用,它可以將發出網路需求 (request) 的電腦內網 IP 記錄下來,等到外部伺服器傳回資料時,再用它紀錄的內網 IP 找到內網的設備,轉換外網 IP 至內網 IP 以完成一來一回的數據傳輸。


可是如果要從外網主動連到內網的裝置,NAT 是沒有這些紀錄的,所以必須要開一個連接埠 (port) 以找到內網的裝置。一般來說,低於 500 的連結埠都用於特殊的通訊協定,比如說 21 是 FTP、22 是 SSH.... 等 (參考資料),如果要用於定位內網裝置,就要找一個沒有在使用的連接埠,比如說 5000。


在路由器上也要設定,在進階設定的 "連接埠轉傳" (port forwarding) 中 (參考資料):


但此時又有一個問題,若要從外網連到家中的電腦,必須要知道家中路由器對外的外部 IP,可是一般網路運營商都不會提供固定 IP,而是一堆動態 IP 隨機分給客戶,此時就要申請動態 DNS (Dynamic DNS) 的服務,讓家中的外網 IP 變成一個網域,比如說 ABC.ddns.net,然後定期給動態 DNS 提供最新的外網 IP,這樣就可以確保每次都能連線成功 (此為 In case 1)。


PiVPN 提供兩種外部連線的方法,一種是固定 IP (Public IP),另一種就是連線到動態 DNS (此處稱為 Public DNS,一樣的意思)。固定 IP 當然很容易,選了之後設定一下家中網路使用的 DNS 網址 (Custom) 或是公用的 DNS 網址 (如 Google 及 Cloudflare) 即可;動態 DNS 則需要跟第三方廠商申請,比如免費的 NoIP (相關教學如此文),再把網域設定在 PiVPN 中。動態 DNS 並不是通靈者,它無法自動抓取我們的真實 IP (廢話,我們的 IP 會變成怎樣它哪裡知道),其 IP 資訊必須由申請者主動提供,比如說在電腦上裝一個軟體定期傳送新的 IP 資訊給動態 DNS 供應商,或是讓路由器自動做這樣的事,我個人比較偏好後者,以下為設定的介面:


OK,以上就是 VPN 最麻煩的外網設定,但正如我在一開頭說的,這種設定會跟自家網路的架構有關。比如說我家的社區網路是給我們每戶一個固定的內網 IP (當然也包含固定的閘道及 DNS 網址),然後網路業者的機房為一個超大的路由器 (super router) 對外連線,所以光是設定我家的路由器是沒用的,必須要網路業者也為我家的網路開一個固定的連接埠才行,而這個埠必須跟家裡路由器設定轉傳的連結埠相同 (此為上圖 In case 2),所以請先搞清楚家裡網路的架構並隨機應變,不然可能還是連不上。


開始使用自製的 VPN


首先為每一個要連線的裝置製作一個 ovpn 設定檔,PiVPN 把這個步驟全部自動化了,只要輸入 pivpn -a,再依照程式的引導輸入連線的名字及密碼即可 (在上圖的例子中,名字就是 secureChris)。檔案會存在家目錄下的 ovpns 資料夾中 ( /home/pi/ovpns/ ),可以用 FTP 連線去抓檔,或是退出樹莓派的 SSH 連線後,以 scp 指令去抓取檔案,格式如下:

scp pi@[樹莓派內網 IP]:/home/pi/ovpns/[檔案全名] [複製檔案的目標資料夾] 
範例:scp pi@192.168.0.105:/home/pi/ovpns/secureChris.ovpn ~/Desktop/

請注意不能使用通配符 *,必須一個一個慢慢抓,且注意兩個路徑之間的空格。當然可以寫個 shell script 去自動化這個過程,只是對我來說總共不過三四個檔案,所以我就慢慢抓啦~


有了 ovpn 檔之後就可以開始翻牆了,macOS 端我推薦 Tunnelblick,使用方式很簡單,啟動程式後把 ovpn 檔拖到右上角的圖示,先輸入管理者的帳號密碼以取得管理者權限,之後在彈出的驗證視窗中輸入連線密碼,就可以開始翻牆了,隨時可連可斷。


iOS 端同樣簡單,安裝 OpenVPN Connect 後以 Finder / iTunes 或 AirDrop 將 ovpn 檔案傳入,然後一樣輸入連線密碼就可以開始翻牆了,左上角會出現 VPN 的圖示。

以上,有問題歡迎在下面留言討論。


溫馨提示:這樣的翻牆方法看似很完美,其實連線可能會不太穩定。原因不在我們,而是中國的電訊商會擋 VPN,所以商用的 VPN 都有很多 IP 當跳板,我們自家網路的 IP 即使是動態 IP 也不夠多,所以 .... 如果要常駐中國,最好還是花錢了事,不然就是養一張其他國家的電話卡,然後用漫遊上網。

20191226 Update: 我昨天在 Google 推送的廣告中看到一個收費的 VPN WiFi hotspot 的服務:VPNCity,我心裡想 .... 是什麼樣的傻子會去用這個?一個要收費、需自備樹莓派、只能當 WiFi hotspot 的玩意,還有臉拿出來賣錢?有能力或喜歡動手的人,會像我一樣自己做,其他花錢的人就是要省麻煩啊,誰跟你搞樹莓派?看來該公司真的是很傻,傻到這種市場定位錯誤的產品還付錢打廣告。



附註
1. 為何我要說 "盡可能詳細" 呢?因為我不可能詳細到讓每一個人都看得懂,但又不想像這位仁兄:"手殘都會!「PiVPN」在樹莓派快速部屬 OpenVPN Server",標榜內容很簡單,結果關鍵的網路設定都沒講清楚,新手小白看了還是不會成功。
2. 我回台灣後有去光華買點東西,發現我找不到樹莓派的原裝電源供應器,看來只能靠網購或是自己去電料行湊了,我的樹莓派 4 比前代耗電,使用的是 5 V * 3.1 A 的 15.5 W 電源供應。
3. 樹莓派只支援 HDMI,由於我沒有 HDMI to VGA 的轉接頭,而家裡的螢幕都舊到只有 VGA 接頭,所以我很克難地用了電視當螢幕,災難現場在此 .... 囧。
4. PiVPN 有個大問題是它的設定過程是一次性的,如果設定完發現不能連線,無法進入設定介面去改,只能砍掉重裝、重新設定全部的參數。

沒有留言:

張貼留言