DDNS là gì?
DDNS (Dynamic Domain Name System – Hệ thống Tên miền Động) là dịch vụ tự động cập nhật tên miền (ví dụ: ddns.domain.com) để trỏ đến địa chỉ IP công cộng (WAN) đang thay đổi của thiết bị nhà bạn, thay thế cho việc phải nhớ IP động thường xuyên biến đổi, giúp truy cập từ xa các thiết bị như camera, máy chủ, NAS một cách liên tục và dễ dàng. Khi sử dụng dịch vụ DDNS các bạn có thể phải trả phí hoặc kích hoạt lại theo chu kỳ nhất định có thể gây phiền phức. Trong bài viết này tôi sẽ hướng dẫn tự tạo hệ thống DDNS.
Yêu cầu cần có
- VPS chạy n8n trong mạng (có thể dùng TVBox giá khoảng 200 300k)
- Tên miền bất kỳ có thể tự quản lý hoặc dùng tên miền miễn phí. Ví dụ domain.com
- Tài khoản Cloudflare để cấu hình tên miền
Các bước thực hiện
Bước 1: Gán tên miền để Cloudflare quản lý
Cái này các bạn có thể chuyển DNS tại nhà cung cấp hoặc mua trực tiếp tền miền từ Cloudflare. Sau đó tạo DNS Record để DDNS cập nhật với thông số như sau:
- Vào DNS → Records → Add record
- Type: A
- Name:
ddns - IPv4: điền ip bất kỳ (sẽ được n8n thay tự động)
- Proxy: OFF (nếu muốn dùng cho VPN, port forwarding)
- Save
Lưu lại Zone ID và Record ID của tên miền. Sau đó tạo API Token tại Cloudflare mới với template là Edit zone DNS
- Permissions:
- Zone → DNS → Edit
- Zone → Zone → Read
- Zone Resources:
- Zone: chọn domain.com
Lưu lại YOUR_API_TOKEN vừa tạo (sau đó dùng trong n8n). Tóm lại tại bước này bạn cần lưu lại 3 nội dung.
Zone ID: Khi chọn domain trong cloudflare sẽ hiện Zone ID và Account ID. Lưu lại Zone ID này.
YOUR_API_TOKEN: Token hiện ra khi tạo API Edit zone DNS
Record ID lấy bằng cách tạo HTTP Request với các thông số sau:
API
GET https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/dns_records?name=ddns.domain.com
Headers:
Authorization: Bearer
Content-Type: application/json
Response mẫu:
{
"success": true,
"result": [
{
"id": "RECORD ID",
"type": "A",
"name": "ddns.domain.com",
"content": "42.116.188.54"
}
]
}
result[0].id chính là Record ID.
Hoặc nhanh hơn là tại trang DNS Record bấm F12 (Chrome) rồi chọn Tab Network rồi Reload trang. RECORD ID sẽ hiện như hình

Bước 2: Tạo Workflow trong n8n
Schedule Trigger (để 15 phút/lần)
HTTP Request (Get IP WAN) và GET theo URL https://ipv4.icanhazip.com (để lấy địa chỉ IP WAN)
HTTP Request (Get DNS Domain) và GET theo URL https://cloudflare-dns.com/dns-query?name=ddns.domain.com&type=A
Chọn Send Header
Specify Headers: Using Fields Below
Name: Accept
Value: application/dns-json
Edit Fields (Get IP Domain) tại phần Fields to Set chọn như sau:
data
String
{{ JSON.parse($json.data).Answer.find(a => a.data !== “0.0.0.0”).data }}
IF (Check) để check IP đã thay đổi hay chưa?
{{ $(‘Get IP Wan’).item.json.data }}
is not equal to
{{ $json.data }}
True thì sang Node mới, False thì thôi
Code (Change IP) điền như sau:
const ip = $node["Get IP Wan"].json.data.trim();
return [{ip}];
HTTP Request (Post To Cloudflare)
Method: PUT
URL:
https://api.cloudflare.com/client/v4/zones/Zone_ID/dns_records/RECORD_ID
ZONE_ID = Zone ID CloudflareRECORD_ID = ID record A của ddns
Header
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN
Body Type: RAW
Body JSON:
{
"type": "A",
"name": "homeddns",
"content": "{{ $json.ip }}",
"ttl": 120,
"proxied": false
}
Send Telegram với chatid là ID telegram của bạn và nội dung
Địa chỉ IP mạng đã thay đổi sang {{ $json.result.content }}