[RouterOS] 偵測 IPSec 無法連接


先前介紹

[RouterOS] 雙 WAN 備援線路

是為了替

[RouterOS] 建立與 FortiGate 的 IPSec 連線

建立備援線路,當光纖中斷時,自動改用 4G 上網,再觸發 IPSec 重新撥號。

理想很美好,現實很骨感。

我大概每分鐘將光纖網路插入、拔除的連續測試下,大部分情形,從光纖切換到 4G 約 2 秒,IPSec 重新撥號約 3 秒,從 4G 切回光纖,約 12 秒,IPSec 重新撥號約 3 秒。

如果一直穩定都是這樣,基本上是可以接受的,但麻煩就發生在有時 4G 切回光纖時,IPSec 超過 3 分鐘並未觸發重新撥號,導致 LAN 到 WAN 沒問題,但是透過 IPSec VPN 到機房異常。我是判斷可能是 4G 備援線路並未中斷,只是優先緒比光纖差,所以設備認為還連得上線,不算中斷。

首先查了資料,可以使用內建的 netwatch 去偵測網路,可以觸發斷線、恢復連線、測試等三種事件,官方說明如下:

Manual:Tools/Netwatch

Netwatch

我測試了幾個 IP ,分別用不同的方法:

netwatch 清單
1. VPN 內網的總 Gateway (10.0.0.1)

想法很簡單,不論走光纖還是 4G ,只要連不到 VPN 的 Gateway ,砍掉 IPSec ,讓系統自己連線。

但是 netwatch 不能指定從哪個介面 (Interface) 出去,所以造成 netwatch 本身就連不到 IPSec ,直接胎死腹中。

2. ISP 業者的 DNS (168.95.1.1)

想法是能上網,總能連線到 ISP 業者的 DNS 吧?結果不管是走光纖還是走 4G ,都能順利連線,退而求其次,改連線測試目標為光纖出去後第一台 ISP 業者的 Gateway ,測試結果仍是走光纖還是走 4G ,都能順利連線。所以也沒用了。

3. 光纖區網的上層 Gateway (172.16.60.1)

這個倒是滿順利的,我插、拔網路線都會引起對應事件,但這邊有個問題是,要是我 Router 沒事,出事的是光纖數據機或是 ISP 業者機房迴路,對 netwatch 來說,我這個偵測根本沒用,RouterOS 的硬體多半是工業級,可以耐溫到 70 度,但光纖數據機是商用級,只能耐溫到 40 度,經常斷網也是光纖數據機當機造成的,所以效用不大。

system log

從上述 log 可以看出,網孔1 的網路線拔除後,連不上 172.16.60.1 ,就把 IPSec 連線砍掉 (確保改由 4G 連線),系統自動連接後,把網孔1 的網路線插回,又能連上 172.16.60.1 ,仍把 IPSec 連線砍掉 (確保改由光纖連線)。

既然有 netwatch 做思路,我乾脆自己寫 script 來解決偵測問題,也是一種方案。一樣,翻出官方文件來:

Manual:Scripting

我寫兩個公用函數,一個主要功能是在指定介面下呼叫 ping 進行連線測試,一個主要功能是偵測連接不上 VPN 的 Gateway 時,把 IPSec 連線砍掉。

:global CheckConnectHost do={
   :if ( [/ping $Host interface=$Interface count=5 interval=100ms]=0)  do={
      :log warning "[自訂log識別字串]: $Interface connect $Host fail. ";
      :return false;
   } else={
#      :log info "[自訂log識別字串]: $Interface connect $Host success. ";
      :return true;
   }
}

:global CheckIPSecConnectHost do={
   :global CheckConnectHost;
   :if ( [$CheckConnectHost Host=$VpnHost Interface=$Interface]=false ) do={
      :foreach i in=[/ip/ipsec/active-peers find remote-address=$RemoteHost] do={
        :log info "[自訂log識別字串]: IPSec Active-Peers $RemoteHost STATE is $[/ip/ipsec/active-peers get (i) state]. ";
         /ip/ipsec/active-peers kill-connections;
}
      :log warning "[自訂log識別字串]: IPSec down, kill IPSec connection.";
   }
}

公用函數每次重開機需要載入記憶體,所以用開機排程執行:

開機執行排程載入 ScriptCommon

再利用排程指定從介面 BridgeLan (區域網路) 連接 IPSec VPN Gateway:

利用排程檢查遠端 VPN Gateway 是否正常連線

內建 ping 功能可以指定網孔或是 Bridge 的介面來進行連線測試,若有必要,也可以指定用網孔進行 DNS 連線測試,會比 netwatch 好用,但最終還是要看 IPSec 能不能連線,所以我沒做複雜的邏輯分別測試不同的 WAN ,直接測試 IPSec 能否正常連線,不能就砍掉讓系統自動重建。

原則上,在光纖斷網,會自動移轉到 4G ,然後自動重新撥號,我這段只是針對自動變化行為不正常時,強制斷線重連,沒有這段在一般狀況下不會有感覺,我是想,是不是因為我持續插拔網孔,讓系統的 timeout 還沒滿足,就被我當成異常… 但我不希望 IPSec 斷太久,所以超過 90 秒還連不上,我也強制中斷讓他自動重新建立連線了。

Categories: 資訊管理, 工作點滴, 技術分享 | 標籤: | 發表留言

文章分頁導航

發表留言

在WordPress.com寫網誌.