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ó

  1. VPS chạy n8n trong mạng (có thể dùng TVBox giá khoảng 200 300k)
  2. 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
  3. 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:

  1. Vào DNS → Records → Add record
  2. Type: A
  3. Name: ddns
  4. IPv4: điền ip bất kỳ (sẽ được n8n thay tự động)
  5. Proxy: OFF (nếu muốn dùng cho VPN, port forwarding)
  6. Save

Lưu lại Zone IDRecord ID của tên miền. Sau đó tạo API Token tại Cloudflare mới với template là Edit zone DNS

  1. Permissions:
    • Zone → DNS → Edit
    • Zone → Zone → Read
  2. 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 IDAccount 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 Cloudflare
RECORD_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 }}