

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.shScript 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"
fiTự 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.targetsudo systemctl enable --now ip-watch.timerMẹ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.
Loạt bài hướng dẫn ip.tnd.vn
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 IPv4Tham 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 FacebookHạ 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.



