埋坑: 修正 OpenVPN Client 的路由表

MIS 都哭惹,只好自己來

Lililala
6 min readJan 5, 2019
Picture by 3dman_eu on Pixabay

問題源於商務中心網路,網路邏輯如下

每個房間網段與虛擬閘道器均不同,192.168.2.0 網段規劃為共用的服務區域

連上外部公用 VPN 後,公用服務區宣告 GG

在不能更動中心網路的前提下,尋找與思考可能的解決方案,結果為:

方案

❌1). 從 Server 強制 push 全部房間的閘道器路由,不管有沒有衝突,例如在 server.conf 中加入:

push "route 192.168.2.0 255.255.255.0 192.168.10.254"
push "route 192.168.2.0 255.255.255.0 192.168.20.254"
push "route 192.168.2.0 255.255.255.0 192.168.30.254"
push "route 192.168.2.0 255.255.255.0 192.168.40.254"

結果因規則彼此衝突,連上後過一陣子會被 Windows 自動清除而斷線

❌2). 從 Server 強制 push 全部房間的閘道器路由,Client 端指定使用哪條規則,概念上使用 iroute 的設定方式

遺憾的是 iroute 只能用在 site-to-site 的場景

❌3).從 Server push 複寫 Client 的 route 將其 metric 設大 (優先權降低),例如設 100

push "route 10.8.0.0 255.255.255.0 10.8.0.1 100"

結果該條是變更了,但似乎不只一條需要修改 (以後有空研究,先放著)

👎4). 從 Server push 單條 route 指定 192.168.2 走房間閘道器的規則,例如

push "route 192.168.2.0 255.255.255.0 192.168.30.254"

結果當然成功,但別鬧了,一台 VPN Server 只能給單一房間使用?

👎5). PC 連上 VPN 後自己的路由自己改? (茶🍵

✔️6). 自己寫 Script 讓連線時觸發,執行設定正確的 route table

目前最佳解

OpenVPN Client 支援在連線/斷線前後等時候執行 Script 做任何事情,我們使用的 Securepoint Client 底層是 OpenVPN Client,當然也有支援。

因此我們可以在連線後,執行一個 Script 來:

  • 取得現在 PC 上 192.168 開頭網段的閘道器 IP 位址
  • 新增路由將 192.168.2.0 網段導向 192.168 開頭的閘道器 IP 位址

斷線後也執行一個 Script 來:

  • 刪除我們增加的 route

Securepoint 介面設定連線與斷線後執行的 Script 如下圖:

此 UI 對應設定步驟 4).

⚠️ 從 UI 設定有時會把我們的 ovpn 設定檔內容搞爛 (沒有完整支援),所以我偏好直接改設定檔案

設定步驟

1). 新增設定與各 Script 檔案,需要和 ovpn 檔放在一起,除了 scripts.conf 檔名不能變,bat 檔名可以隨意 (⚠️OpenVPN 原廠 Client 有限制),此例連線後觸發 CN1_up.bat,斷線後觸發 CN1_down.bat

2). 連線後執行的 Script CN1_up.bat 檔案內容,Windows 限定 (Linux 更簡單,請自行 Google):

for /f "tokens=2,3 delims={,}" %%a in (
'"WMIC NICConfig where IPEnabled="True" get DefaultIPGateway /value | find "192.168" "'
) do (
set GWIP=%%~a
)
:: %%~b is IPv6 Gateway
route ADD 192.168.2.0 MASK 255.255.255.0 %GWIP%
:: echo Found Default GW: %GWIP%

3). 斷線後執行的 Script CN1_down.bat 檔案內容:

route DELETE 192.168.2.0

4). 在 scripts.conf 中指定 連線後與斷線後要執行哪個檔案:
路徑與檔名請自行修改
AC: 是指連線後
AD: 是指斷線後
TO: 是指連線後要延遲多少毫秒 ms 再執行 Script

AC:D:/SecurepointSSLVPNClient/Portable/config/CN1/CN1_up.bat
TO:500
AD:
D:/SecurepointSSLVPNClient/Portable/config/CN1/CN1_down.bat

⚠️ Script 的檔名與路徑不能有空格!!!

5). VPN 連線測試

Log 中可查詢 Script 執行結果
連線 VPN 後,則可看到路由加入了 192.168.2.0 網段

現在每間房終於可以共用 VPN Server 與 Client 設定了

--

--

Lililala
Lililala

Written by Lililala

技能樹越點越歪的 Software Architect (Fullstacker for fun)、大自然狂熱愛好者、V豚、不認真的貓蛋劊子手。不特定反SEO佛系寫作

No responses yet