FortiGate DDNS with DynuDNS
倘若你的 Fortigate 仍有保固的話,可直接使用 Fortinet 內建的 DDNS 服務,要是已無保固的話,仍有 DDNS 的需求的話,可參考 Fortigate DDNS RFC2136 with Dynv6.com 的做法,只是最近不知為何我的 DDNS 更新都沒有正常運作;後續也在查找除了 Dynv6 之外,是否有其他接受 RFC2136 更新方式的 DDNS 服務。
但目前更換 FG60F 之後,仍然希望 DDNS 的方式可以運作,因此,想到了利用 Log 的方式, Fortigate 在 PPPoE 更新 IP 後都會有 event log 紀錄,當有這個 Log 出現後,直接用 Webhook + POST 的方式,來更新 DDNS 的紀錄!
好,看起來很美好,但還是先說一下缺點,目前想到的是以下兩個缺點:
缺點一:倘若你的 Fortigate 設備不只使用一個 PPPoE 介面,那這個方式,可能不適合你,因為我看到的 Log 只有紀錄更新後的 IP 位址,至於能不能再搭配其他的 Log,這部分目前我沒有研究,也沒有想法。
缺點二:因為是使用免費的服務,難保有服務不穩的問題,我也還在觀望此作法相關的穩定性;也是除了用 Fortigate DDNS RFC2136 with Dynv6.com 之外另外的作法。
若是可接受也了解這兩個缺點的狀況,那就開始吧,要是還沒有申請 Dynu 帳號,請自行前往 https://blog.jia543.com/2018/01/dynudns-ddns.html 去參考及申請註冊吧!登入 DynuDNS 後,點選右上角“齒輪”圖案,進入 Control Panel,這邊包含了所有 DynuDNS 的功能~

接下來我們需要先取得 API Key,因此點選 API Credentials

可以看到 中間有個 API Key,預設是遮碼顯示,點選後方的 View,即可完整的 API key,將此 API Key 複製出來,等等後續都會用到~

API Key:3eg2Y45V554U2f66734646Xd4Ze44gV3
接著,我們要知道 API 要怎麼運作?語法要怎麼使用?因此點選右上方 Resource > API

點選中間的 Documentation,這邊不會要你查文件,而是會列出相關使用的語法,重點是可以直接測試!!

既然是線上測試 API 語法,比較重要的是,要先授權一下,因此往下滑在 Implementation 欄位這,右邊有個 “Authorize” 的按鈕,目前鎖頭是開的,表示目前網頁沒有任何的授權(也表示查任何 API 相關的都不會有正常回應的!),點一下 “Authorize” 的按鈕

api Key 這的 Value 欄位,就將剛剛複製下來的 api-key 貼上,並按一下 “Authorize” 的按鈕,即可完成授權!放心~關掉或離開這個網頁後,就沒了…

再往下滑一點,可看到 dns GET 的項目,展開這個 GET 項目,看到最右邊有 “Try it out” 按鈕,點一下這個 “Try it out” 按鈕,

會出現 “Execute” 的按鈕,再點選 “Execute” 按鈕來執行此 GET API

接下來,最主要是取得 id,後續用 POST 更新 DDNS 的話,都會使用到 id,因此先記錄並複製下來,後續查詢可使用。

id:12013976
好的,知道 id 後,再往下滑,有個 POST,/dns/{id} 的語法,後方描述為 “Update an existing DNS service.”,這個就是更新 DDNS 記錄的主要語法,點選 “Try it out” 按鈕

id 這的 Value 欄位:將剛剛上一步得到 id 貼上,
Request body 保持 application/json
Example Value 這邊依照範例上的來更改調整:
name:要使用此 API 更新的 DDNS 名稱
ipv4Address:1.2.3.4 //先測試 1.2.3.4 這個 IP 是否有更新至這個 DDNS 名稱
以下欄位可保留預設的即可。
底下是我的範例:
{
"name": "jiawan1.freeddns.org",
"ipv4Address": "1.2.3.4",
"ttl": 90,
"ipv4": true,
"ipv4WildcardAlias": true,
"allowZoneTransfer": false,
"dnssec": false
}
 
確認資訊都無誤後,點選 “Execute”按鈕來執行~
執行後,可看到 code 200 會顯示執行狀況,因此,200 這個欄位是顯示 Success,這樣這個 POST 的行為是成功的,語法也都可被接受!

既然成功!就回到 Control Panel 確認 DDNS 資料是否已被更新?!
點選右上角“齒輪”圖案,進入 Control Panel ,再點選 “DDNS Services”

可看到目標 DDNS 的 IPv4 位址為剛剛 API 測試所填寫的 1.2.3.4!

好的,接下來就得回到 Fortigate 上了!回到一開始說的,當 PPPoE 重新撥號後,會產生 EventLog,有這個 EventLog 後會呼叫 webhook,而這個 webhook 的內容即是 DynuDNS 的 API 內容!換成 Fortigate 上的說法就是 Automation 自動化設定中,一個 Stitch 流程在收到 event 的 Trigger 觸發條件後,Action 發送通知。
這邊從後面設定回來,Automation > Action > Create New 新增一個 Action 動作

Name:自己看得懂的名稱,如:Dynu
Protocol:選 HTTPS
URL:填入 dynu 的 API 網址,
api.dynu.com/v2/dns/{上面得到的id}
Method:剛剛在 Dynu API 測試的語法,其中 ipv4Address 要換成 %%log.assigned%%,這個 log 的內容,可自行前往 Fortinet文件 查看
{
  "name": "你自己的DDynu DDNS 名稱",
  "ipv4Address": "%%log.assigned%%",
  "ttl": 90,
  "ipv4": true,
  "ipv4WildcardAlias": true,
  "allowZoneTransfer": false,
  "dnssec": false
}
HTTP header 這邊要填入兩個數據:
accept: application/jason API-Key: 你的Dynu DDNS API-Key
接著,來建立 Trigger,點選 Create New 新增一個 Trigger

找到 FortiOS Event Log,點選 “FortiOS Event Log”

Name:自己看得懂的名稱,如:PPPoE-Event
Event:利用搜尋 “ppp” 的方式,找到 PPPoE status report,將 PPPoE status report 選入至 Event 欄位中,這個 status report 內容,想知道更多內容請參考  Fortinet文件 上的說明。
確認以上設定正確後,點選 “OK” 新增

Trigger 跟 Action 都完成了,接著來新增一個 Stitch 吧
Name:自己看得懂的名稱,如:Wan1-PPPoE_to_Dynu
Trigger:選擇剛剛新增的 PPPoE-Event
Action:選擇剛剛新增的 Dynu
Delay:如果沒特別設定表示有 eventlog 後,馬上執行 action,我會給予系統 5 秒的延遲時間
確認以上設定正確後,點選 “OK” 完成 Stitch 的新增

接下來驗證一下整個過程及設定是否如我們所想像的?
可直接從 Fortigate 上將 wan1 Disable 後再 Enable (此舉會關閉 wan1 的對外連線,請確認此動作不會造成其他的影響!!),wan1 會重新 PPPoE 並取得新的 IP,如畫面中 wan1 取得 114.46.160.118

再回到 Security Fabric > Automation > Stitch,找到剛剛建立的 Wan1-PPPoE_to_Dynu,後方的 Trigger Count 為觸發的次數,目前是 1,表示剛剛的 wan1 重新 enable 後,Trigger: PPPoE-Enent > Action: Dynu

前往 Dynu 上查看此筆 DDNS 紀錄,沒錯~不是 1.2.3.4 了,而是剛剛 wan1 的 114.46.160.118 了!

PPPoE 的 Wan1 IP 若有變動的話,Foritgate Stitch 會呼叫 Action 來自動這個 DDNS,一樣不用再特別去記憶 wan1 的 IP 是什麼了!!😁😁😁


