Skip to content
Thuan Bui's Blog
Go back

Cấu hình Dynamic DNS trên RouterOS (Mikrotik) sử dụng Cloudflare API

Updated:

Trước đây, mình đã có bài hướng dẫn cách cấu hình Dynamic DNS cho router Mikrotik bằng cách sử dụng tính năng Cloud có sẵn của RouterOS. Tuy nhiên, cách này sẽ không áp đụng được trên các con router Mikrotik clone (router Tàu được flash firmware Router OS Level 1).

Bài viết này sẽ hướng dẫn cách cấu hình Dynamic DNS trên RouterOS sử dụng Cloudflare API, có thể áp dụng được trên router Mikrotik chính hãng lẫn Mikrotik clone.

1. Yêu cầu

Lưu ý: Tên miền sử dụng phải là loại trả phí (.com, .net, .org, .me, …), không thể sử dụng các loại tên miền miễn phí (.tk, .ga, .ml, .cf, .gq, …) vì Cloudflare không hỗ trợ.

2. Tìm Zone ID và Tạo API Token

Xem hướng dẫn ở đây:

https://thuanbui.me/cloudflare-zone-id-api-token/

3. Tạo A Record cho tên miền

Terminal window
curl -X GET "https://api.cloudflare.com/client/v4/zones/aeb40ea505787b4683e2616b8af51a0b/dns_records?type=A&name=alibaba.thuanbui.me" \
-H "Authorization: Bearer BvCx9zk6gHvTRBeuVeeiEZllnKuff4ZZqKd4bdHL"
{"result":[{"id":"2b4e30cd70ed17de26b8389f89e70a5d","zone_id":"aeb40ea505787b4683e2616b8af51a0b","zone_name":"thuanbui.me","name":"140.thuanbui.me","type":"A","content":"1.1.1.1","proxiable":false,"proxied":false,"ttl":1,"locked":false,"meta":{"auto_added":false,"managed_by_apps":false,"managed_by_argo_tunnel":false},"comment":null,"tags":[],"created_on":2021-09-09:1}}%

Ví dụ mình muốn sử dụng tên miền alibaba.thuanbui.me để truy cập đến homelab ở nhà. Bấm vào Add record và tạo một A record mới.

Tạo A Record cho subdomain alibaba.thuanbui.me
Tạo A Record cho subdomain alibaba.thuanbui.me

4. Tìm DNS Identifier

Để tìm DNS Identifier, bạn cần phải sử dụng Terminal trên Linux hoặc macOS (mình chưa thử trên Windows nên không biết) để truy xuất Cloudflare API. Thông tin DNS Identifier sẽ được bao gồm trong phần kết quả trả về.

Bạn cần sử dụng câu lệnh như bên dưới, và cần sửa lại các thông tin cần thiết

Terminal window
curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_IDENTIFIER/dns_records?type=A&name=$DNS_NAME" \
-H "Authorization: Bearer $API_TOKEN"

Kết quả trả về sẽ tương tự như bên dưới:

{"result":[{"id":"2b4evvvvcd17de26b8389f89e70a5d","zone_id":"ae23242305787b4683e2616b8af51a0b","zone_name":"thuanbui.me","name":"alibaba.thuanbui.me","type":"A","content":"171.123.247.32","proxiable":true,"proxied":false,"ttl":1,"locked":false,"meta":{"auto_added":false,"managed_by_apps":false,"managed_by_argo_tunnel":false},"comment":null,"tags":[],"created_on":2021-09-09:1}}%

Thông số 2b4evvvvcd17de26b8389f89e70a5d của mục id chính là DNS Identifier chúng ta đang cần.

6. Tạo script trên RouterOS

Script cập nhật Dynamic DNS này mình tham khảo trên website MikroTik DDNS with Cloudflare API v4 (bayukurnia.com), đã test và thấy chạy ngon

Truy cập vào RouterOS thông qua Winbox hoặc trình duyệt web. Truy cập vào mục System —> Scripts. Bấm dấu + hoặc nút Add New để tạo script mới

Mục Name: đặt tên ddns_cloudflare

Mục Policy: bấm chọn read, write, test.

Phần Source: nhập vào đoạn code dưới đây sau khi đã chỉnh sửa các thông tin cần thiết:

Terminal window
#--------------------------------------------
# MikroTik DDNS Script | Cloudflare API v4
# bayukurnia.com
#--------------------------------------------
# global variables
# we'll update it on every ddns success
:global currentIp
# outgoing interface
:local wanInterface "pppoe-out1"
# get current $wanInterface IP
:local newIpCidr [/ip address get [find interface="$wanInterface"] address ]
:local newIp [:pick $newIpCidr 0 [:find $newIpCidr "/"]]
:if ($newIp != $currentIp) do={
# cloudflare variables, adjust with yours
:local cfToken "aJV8sCQqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
:local cfZoneId "fb36edd6xxxxxxxxxxxxxxxxxxxxxxxx"
:local cfDnsId "afc8b34dxxxxxxxxxxxxxxxxxxxxxxxx"
:local dnsType "A"
:local dnsName "alibaa.thuanbui.me"
:local dnsTTL "1"
:local dnsProxied "true"
# compose endpoint
# docs: https://api.cloudflare.com/#dns-records-for-a-zone-update-dns-record
:local apiUrl "https://api.cloudflare.com/client/v4/zones/$cfZoneId/dns_records/$cfDnsId"
# compose headers & payload
:local headers "Authorization: Bearer $cfToken"
:local payload "{\"type\":\"$dnsType\",\"name\":\"$dnsName\",\"content\":\"$newIp\",\"ttl\":$dnsTTL,\"proxied\":$dnsProxied}"
# make API request
:do {
:local response [/tool fetch http-method="put" url=$apiUrl http-header-field=$headers http-data=$payload as-value output=user]
:if ($response->"status" = "finished") do={
:log info "DDNS: changed $currentIp to $newIp"
# update $currentIp with the new one
:set currentIp $newIp
}
} on-error {
:log error "DDNS: failed to change IP $currentIp to $newIp"
}
}

Bấm Run Script để cho chạy thử script. Nếu thấy Dynamic DNS được cập nhật chính xác, bấm OK để lưu lại. Nếu bị lỗi, bạn cần kiểm tra lại các bước ở trên.

7. Lên lịch cập nhật tự động

Để RouterOS tự động chạy script cập nhật Dynamic DNS, chúng ta cần sử dụng tính năng Scheduler. Truy cập vào mục System —> Scheduler. Bấm dấu + hoặc nút Add New để tạo mới

Bấm OK để lưu lại.

Hoặc bạn nào thích Terminal thì dùng lệnh sau:

/system scheduler
add interval=10m name=ddns_cloudflare on-event="/system script run ddns_cloudflare" policy=read,write,test start-time=startup

Vậy là xong. Chúc bạn thực hiện thành công

Tham khảo: MikroTik DDNS with Cloudflare API v4 (bayukurnia.com), Configure Mikrotik with Cloudflare DDNS (vectops.com)


Share this post on:

Previous Post
Thay áo mới cho blog: Kadence Theme
Next Post
Học tiếng Nhật – Ngày 515: Dọn nhà qua Nhật, chìm đắm trong Kanji