Docker Homelab Series - Phần 6: Cloudflare DDNS: Hướng dẫn Cập nhật DNS tự động

Hướng dẫn Cloudflare DDNS

Cloudflare DDNS: Hướng dẫn Cập nhật DNS tự động

Cloudflare DDNS

I. Giới thiệu Cloudflare DDNS

Cloudflare DDNS (Dynamic DNS) là công cụ tự động cập nhật IP address của bạn lên Cloudflare DNS khi IP thay đổi. Điều này rất hữu ích khi:

  • Bạn có ISP cấp IP động (DHCP)
  • Muốn access server từ internet mà không biết IP hiện tại
  • IP thường xuyên thay đổi (nhà riêng, VPS, ...)
  • Không muốn update DNS record thủ công mỗi lần IP thay đổi

Chức năng chính:

  • Tự động phát hiện IP công cộng hiện tại
  • Cập nhật DNS record trên Cloudflare tự động
  • Hỗ trợ IPv4 và IPv6
  • Kiểm tra định kỳ (interval tùy chỉnh)
  • Ghi log chi tiết hoạt động

II. Chuẩn bị Cloudflare API Token

1. Tạo API Token trong Cloudflare

Trước tiên, bạn cần tạo API token có quyền chỉnh sửa DNS:

  1. Đăng nhập Cloudflare Dashboard
  2. Vào Account Profile (góc phải) → API Tokens
  3. Click Create Token
  4. Chọn template: Edit zone DNS
  5. Cấu hình quyền:
    • Permissions: Zone → DNS → Edit
    • Zone Resources: Include → Specific zone → Chọn domain của bạn
  6. Click Continue to summaryCreate Token
  7. Copy token và lưu lại (chỉ hiển thị 1 lần)

2. Lấy Zone ID và Domain

Bạn cũng cần Zone ID của domain:

  1. Vào Cloudflare Dashboard → Chọn domain
  2. Kéo xuống dưới cùng → Zone ID (sao chép)
  3. Note lại domain name (ví dụ: yourdomain.com)

III. Cấu hình Cloudflare DDNS

1. Tạo File Config

Tạo file config.json với nội dung sau:

{
  "auth": {
    "api_token": "YOUR_API_TOKEN_HERE"
  },
  "zone_id": "YOUR_ZONE_ID_HERE",
  "subdomains": [
    {
      "name": "home",
      "type": "A",
      "ttl": 1
    },
    {
      "name": "server",
      "type": "A",
      "ttl": 1
    }
  ],
  "update_frequency": 600,
  "log_level": "info"
}

Giải thích:

  • api_token: API token từ Cloudflare (không phải password)
  • zone_id: Zone ID của domain
  • subdomains: Danh sách subdomain cần update
  • name: Tên subdomain (ví dụ "home" → home.yourdomain.com)
  • type: A (IPv4) hoặc AAAA (IPv6)
  • ttl: 1 để update ngay lập tức, hoặc 3600 cho TTL 1 giờ
  • update_frequency: Khoảng thời gian kiểm tra (giây), 600 = 10 phút
  • log_level: info, debug, warn, error

2. Docker Compose

version: "3.8"
services:
  cloudflare-ddns:
    image: timothyjmiller/cloudflare-ddns:latest
    container_name: cloudflare-ddns
    environment:
      PUID: 1000
      PGID: 1000
    volumes:
      - /root/cloudflare-ddns/config.json:/config.json:ro
    security_opt:
      - no-new-privileges:true
    network_mode: "host"
    deploy:
      restart_policy:
        condition: unless-stopped

Giải thích cấu hình:

  • PUID/PGID: User ID (1000 = non-root user)
  • volumes: Mount config.json (read-only)
  • network_mode: host: Sử dụng network host để phát hiện IP đúng
  • security_opt: Bảo mật, không tạo process mới
  • restart: unless-stopped: Tự động restart nếu bị crash

IV. Triển khai với Portainer

Bước 1: Tạo thư mục và file config

SSH vào server và chạy:

mkdir -p /root/cloudflare-ddns
# Tạo file config.json với nội dung từ phần III.1
nano /root/cloudflare-ddns/config.json

Paste nội dung config và thay đổi:

  • YOUR_API_TOKEN_HERE → API token từ Cloudflare
  • YOUR_ZONE_ID_HERE → Zone ID của domain
  • home, server → Tên subdomain của bạn

Lưu file (Ctrl+X → Y → Enter).

Bước 2: Deploy qua Portainer

  1. Vào Portainer Dashboard
  2. Chọn StacksAdd stack
  3. Đặt tên Stack: cloudflare-ddns
  4. Copy/paste docker-compose vào Web editor
  5. Click Deploy the stack

Container sẽ khởi động và bắt đầu cập nhật DNS.

Bước 3: Kiểm tra Logs

Vào Portainer → Stacks → cloudflare-ddns → Container → cloudflare-ddns → Logs.

Bạn sẽ thấy các dòng như:

[INFO] Updating DNS record for home.yourdomain.com to 203.0.113.42
[INFO] Successfully updated DNS record

V. Cấu hình Advanced

1. Hỗ trợ IPv6

Để cập nhật cả IPv4 và IPv6:

{
  "auth": {
    "api_token": "YOUR_API_TOKEN_HERE"
  },
  "zone_id": "YOUR_ZONE_ID_HERE",
  "subdomains": [
    {
      "name": "home",
      "type": "A",
      "ttl": 1
    },
    {
      "name": "home",
      "type": "AAAA",
      "ttl": 1
    }
  ],
  "update_frequency": 600,
  "log_level": "info"
}

2. Wildcard DNS

Để cập nhật wildcard record (*.yourdomain.com):

{
  "name": "*",
  "type": "A",
  "ttl": 1
}

3. Tùy chỉnh IP Detection

Nếu muốn phát hiện IP từ interface mạng cụ thể:

{
  "detection": {
    "strategy": "interface",
    "interface": "eth0"
  }
}

Hoặc sử dụng external service:

{
  "detection": {
    "strategy": "http",
    "url": "https://api.ipify.org?format=json"
  }
}

VI. Troubleshooting

DNS không update

  • Kiểm tra API token có quyền chỉnh sửa DNS không
  • Kiểm tra Zone ID có đúng không
  • Kiểm tra config.json có format JSON hợp lệ không (dùng jsonlint.com)
  • Xem logs: docker logs cloudflare-ddns

Container restart liên tục

  • Kiểm tra file config.json đã mount vào container không
  • Kiểm tra permission: chmod 644 /root/cloudflare-ddns/config.json
  • Xem logs để tìm lỗi cụ thể

IP không được phát hiện đúng

  • Kiểm tra network_mode: "host" trong docker-compose
  • Thử thay đổi detection strategy trong config.json
  • Test IP detection: curl https://api.ipify.org

VII. Lưu ý quan trọng

  • API Token: Giữ kín API token, đừng share hoặc commit lên Git
  • Config file: Mount với :ro (read-only) để bảo mật
  • TTL: Đặt TTL = 1 để update ngay, nhưng tốn API quota. Cloudflare có giới hạn API calls
  • Update frequency: Không nên quá thường xuyên (minium ~5 phút) để tránh abuse
  • DNS Propagation: Sau khi update, DNS mới sẽ propagate trong vài phút
  • Backup config: Sao lưu file config.json ở nơi an toàn

Vậy là bạn đã hoàn thành cấu hình Cloudflare DDNS để tự động cập nhật DNS khi IP thay đổi!

Post a Comment

Previous Post Next Post
QR Code
Quét mã QR để gọi miễn phí