Theo dõi IP động bằng bash, cron và ip.tnd.vn (DDNS tự dựng)

Chia sẻ bài viết

Mục lục
Theo dõi IP động bằng bash, cron và ip.tnd.vn (DDNS tự dựng)
Theo dõi IP động bằng bash, cron và ip.tnd.vn
Tự dựng một DDNS mini: phát hiện IP đổi và phản ứng tự động.

Mạng nhà, VPS rẻ, hay đường truyền dân dụng thường có IP động: hôm nay một kiểu, mai một kiểu. Điều đó làm hỏng whitelist firewall, link remote, và cấu hình DNS. Thay vì trả tiền cho dịch vụ DDNS, bạn có thể tự dựng một bộ theo dõi IP nhẹ bằng ip.tnd.vn + cron. Bài này dựng từ đơn giản tới nâng cao.

Vì sao dùng ip.tnd.vn cho việc này?

Endpoint trả về IP công khai sạch, không kèm rác, và quan trọng là đặt header Cache-Control: no-store nên mỗi lần gọi luôn là IP mới nhất, không bị cache đánh lừa. Body text không có newline thừa nên so sánh chuỗi rất gọn.

Script 1: Phát hiện IP đổi

#!/usr/bin/env bash
# /opt/ip-watch/check.sh
STATE=/opt/ip-watch/last_ip
NOW=$(curl -s --max-time 5 https://ip.tnd.vn)
[ -z "$NOW" ] && exit 0          # mạng lỗi, bỏ qua lần này

OLD=$(cat "$STATE" 2>/dev/null)
if [ "$NOW" != "$OLD" ]; then
  echo "$(date '+%F %T')  IP doi: ${OLD:-none} -> $NOW" >> /opt/ip-watch/history.log
  echo "$NOW" > "$STATE"
  # TODO: gọi hành động khi IP đổi (xem bên dưới)
fi

Đặt vào cron, chạy mỗi 5 phút

chmod +x /opt/ip-watch/check.sh
crontab -e
# Thêm dòng:
*/5 * * * * /opt/ip-watch/check.sh

Script 2: Gửi cảnh báo qua Telegram khi IP đổi

notify() {
  local msg="$1"
  curl -s "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
    -d chat_id="$CHAT_ID" -d text="$msg" > /dev/null
}

if [ "$NOW" != "$OLD" ]; then
  notify "IP server vua doi sang: $NOW"
  echo "$NOW" > "$STATE"
fi

Để token bot và chat id trong biến môi trường hoặc file config ngoài repo, đừng hardcode vào script công khai.

Script 3: Cập nhật DNS record qua Cloudflare API

Khi IP đổi, tự sửa bản ghi A để domain luôn trỏ đúng:

if [ "$NOW" != "$OLD" ]; then
  curl -s -X PATCH \
    "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
    -H "Authorization: Bearer $CF_TOKEN" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"A\",\"name\":\"home.example.com\",\"content\":\"$NOW\",\"ttl\":120}"
  echo "$NOW" > "$STATE"
fi

Tự chạy như service với systemd timer

Thích systemd hơn cron? Tạo timer chạy mỗi 5 phút:

# /etc/systemd/system/ip-watch.timer
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
sudo systemctl enable --now ip-watch.timer

Mẹo vận hành

  • Luôn đặt --max-time để script không treo khi mạng chập.
  • Kiểm tra rỗng trước khi so sánh, tránh ghi đè state bằng chuỗi rỗng lúc mất mạng.
  • Ghi log kèm timestamp để biết IP đổi lúc nào, hữu ích khi debug downtime.
  • Muốn IP đứng yên hẳn? Dùng VPS IP tĩnh thay vì chạy theo IP động.

Hết cảnh chạy theo IP động với VPS IP tĩnh

Cloud VPS TND cấp IP tĩnh sạch, đặt tại Việt Nam, lý tưởng để host DNS, remote, hay làm điểm whitelist cố định. SSD NVMe, từ 199k/tháng, tạo trong vài phút.

Xem Cloud VPS Xem Proxy IPv4

Tham gia nhóm Vibe Coder Việt Nam

Bạn đang code cùng Claude, Codex, Gemini, Cursor hay Windsurf? Vào nhóm Facebook để trao đổi tip, debug giúp nhau, chia sẻ workflow vibe coding, và update tool mới mỗi tuần. Cộng đồng dev tự host stack đang grow nhanh tại Việt Nam.

Join nhóm trên Facebook

Hạ tầng cho dev: truy vấn SQL, PHP dựng trang, build Next.js hay đóng gói app iOS và Android đều nghẽn ở tốc độ đọc ghi ổ đĩa và xung nhịp CPU. VPS Enterprise U.2 NVMe, chip Intel Xeon Platinum xung cao dùng ổ Enterprise U.2 NVMe chạy RAID 10, IOPS đọc ghi gấp 5 đến 7 lần SATA SSD, backup hàng tuần, bàn giao trong 5 phút.