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

  • Đã có sẵn tên miền và đã có tài khoản Cloudflare.
  • Tên miền đã được chuyển về CloudFlare quản lý.
  • Router chạy RouterOS v7.

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ạo API Token

Truy cập vào trang Cloudflare API Token để tạo Token mới

Bấm vào Create Token
Chọn Use Template ở mục Edit Zone DNS
Kéo xuống mục Zone Resources, chọn tên miền bạn muốn sử dụng để cập nhật IP sau đó bấm Continue to Summary
Bấm Create Token
Token đã tạo xong

Bạn cần lưu lại Token vừa mới tạo để lưu vào script đã tạo. Token này sẽ không hiện ra lại trên Cloudflare vì lý do bảo mật. Nếu bạn quên lưu, cần phải xoá Token và tạo lại cái mới.

3. Tìm Zone ID

Từ trang chủ Cloudflare, bạn bấm vào tên miền muốn sử dụng để cập nhật IP. Sau đó kéo xuống dưới sẽ thấy mục Zone ID. Lưu lại thông số này để điền vào script

Lưu lại thông tin Zone ID

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

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-09T04:35:30.960774Z","modified_on":"2024-06-26T06:20:59.657374Z"}],"success":true,"errors":[],"messages":[],"result_info":{"page":1,"per_page":100,"count":1,"total_count":1,"total_pages":1}}%Code language: JavaScript (javascript)

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.

  • Name: điền vào alibaba
  • IPv4: điền tạm 66.66.66.66, thông số này sẽ được tự động cập nhật về IP của modem sau khi chạy script.
Tạo A Record cho subdomain alibaba.thuanbui.me

5. 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

curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_IDENTIFIER/dns_records?type=A&name=$DNS_NAME" \
     -H "Authorization: Bearer $API_TOKEN"Code language: Nginx (nginx)
  • $ZONE_IDENTIFIER: thông số Zone ID tìm được ở bước 3
  • $DNS_NAME: tên miền đã tạo ở bước 4
  • $API_TOKEN: Token API đã tạo ở bước 2

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-09T04:35:30.960774Z","modified_on":"2024-06-26T18:51:00.274137Z"}],"success":true,"errors":[],"messages":[],"result_info":{"page":1,"per_page":100,"count":1,"total_count":1,"total_pages":1}}%Code language: JavaScript (javascript)

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:

  • Dòng 11 – wanInterface: thay bằng tên WAN Interface nhận Public IP từ nhà mạng, xem trong phần Interfaces của RouterOS (thường sẽ là pppoe-out)
  • Dòng 19 – cfToken: thay bằng API Token ở bước 2
  • Dòng 20- cfZoneid: thay bằng Zone ID ở bước 3
  • Dòng 21 – cfDnsId: thay bằng DNS Identifier ở bước 5
  • Dòng 23 – dnsName: thay bằng tên miền ở bước 4
  • Dòng 25 – dnsProxied: true (kích hoạt chế độ proxy trên Cloudflare nhằm mục đích ẩn IP của router) hoặc false (hông muốn ẩn IP của router).
#--------------------------------------------
# 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"
  }
}
Code language: Bash (bash)

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

  • Name: đặt tên ddns_cloudflare
  • Start_time: chọn startup
  • Interval: 00:10:00 (10′ chạy 1 lần)
  • Policy: bấm chọn read, write, test.
  • Phần On Event: nhập vào /system script run ddns_cloudflare

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=startupCode language: Dockerfile (dockerfile)

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)

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *