這篇給我自己紀錄用的,我的 OpenWRT 上裝有 OpenVPN Client,這樣直接利用路由器連回工作場域所有連這台路由器 WiFi 的設備都可以同時進入內網,雖然 OpenWRT 有提供網頁介面控制 VPN 開關,但!這樣每次還要開網頁、打密碼、選擇頁籤等等,我就懶!這樣我也嫌麻煩,我想要按一個按鈕就可以開/關 VPN,於是便有這篇紀錄了🤣

1. 利用 Command Line 控制 OpenVPN

首先我需要先利用 CLI 設定 OpenVPN 的方法,上網查資料後找到下面這樣的格式可以啟動 OpenVPN 並將結果輸出到指定 log 檔。

若 OpenWRT 沒有安裝 pkill 則用 opkg install procps-ng-pkill 安裝

1
openvpn --config CONFIG_FILE --daemon --log-append LOG_FILE

而利用 `pkill`` 可以終止 openVPN 服務

1
pkill -f openvpn.*CONFIG_FILE

寫成 Shell Script

有了以上關鍵的指令後,借助 ChatGPT 的力量,腳本就這樣完成了!

 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
# Replace with the actual paths and filenames
CONFIG_FILE="YOUR_CONFIG_PATH"
LOG_FILE="YOUR_LOG_PATH"

start_vpn() {
    echo "Starting OpenVPN..."
    openvpn --config "$CONFIG_FILE" --daemon --log-append "$LOG_FILE"
    echo "OpenVPN started."
}

stop_vpn() {
    echo "Stopping OpenVPN..."
    pkill -f "openvpn.*$CONFIG_FILE"
    echo "OpenVPN stopped."
}

case "$1" in
    start)
        start_vpn
        ;;
    stop)
        stop_vpn
        ;;
            stop)                           
        stop_vpn                    
        ;;                          
    restart)                        
        stop_vpn                    
        start_vpn          
        ;;       
    *)           
        echo "Usage: $0 {start|stop|restart}"
        exit 1                               
        ;;                                   
esac                                         
                                             
exit 0 

測試了一下確實可以開關 OpenVPN! 接著進入下一步驟。

桌面端控制程式

原先打算在 OpenWRT 上面運行 API Server 去接受外來指令在呼叫腳本執行,但之前的經驗這樣防火牆好像不好處理而且也太費工,因此決定直接用 SSH 協定傳送指令就好,至於要用什麼傳呢? Python GUI 打包成 App bundle,不行,封裝太麻煩;利用 Swift 寫原生 MacOS App 呢? 不行,我還不太會寫,最後想到,Apple Shortcut 啊!蘋果內建的捷徑 App 就可以執行 SSH 指令了,拉拉方塊,最後長這樣。

除了基本的啟動/停止/重啟之外我還加入了開啟 log file 的選項,如果要基本偵錯可以不用 SSH 進去。

完成!

將捷徑加入選單列後便可以直接在選單列使用捷徑開關 OpenWRT 的 VPN! 我覺得唯一的問題是密碼寫死在裡面這樣有點不太安全,但自己的電腦又為了方便就將就一下,或是之後改成利用憑證登入~