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.
Mục Lục
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ạ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
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.
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=startup
Code 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)
Làm gì cực quá :D. tạo cái cname với cloud ddns của mikrotik là xong mà
Đọc câu đầu tiên trong bài viết nhé 🙂