Ngày nay, việc dựng một Lab Network tại nhà để chạy NAS, server lưu trữ, dịch vụ tự host… đã trở nên phổ biến hơn rất nhiều. Vấn đề thường gặp là: làm sao truy cập được vào các dịch vụ mạng ở nhà từ bên ngoài Internet trong khi đa số đường truyền tại nhà đều dùng IP động, modem mỗi lần restart là IP thay đổi.
| Tham gia kênh Telegram của AnonyViet 👉 Link 👈 |
Thay vì phải nhớ một dãy IP khó nhớ và luôn thay đổi, cách tiện nhất là dùng tên miền (ví dụ: lab.anonyviet.com) và cấu hình sao cho bản ghi DNS luôn tự động cập nhật theo IP public hiện tại của modem. Bài viết này hướng dẫn bạn cấu hình Cloudflare + một script bash nhỏ để làm Dynamic DNS, giúp tên miền của bạn luôn trỏ tới đúng IP ở nhà.
1. Mô hình hoạt động

Ý tưởng như sau:
- Bạn có một tên miền được quản lý bởi Cloudflare.
- Trên một máy luôn bật trong mạng nội bộ (Linux, máy ảo, Raspberry Pi…), bạn chạy một script định kỳ.
- Script này:
- Lấy IP public hiện tại (IP WAN của modem).
- So sánh với IP đang cấu hình trong bản ghi A trên Cloudflare.
- Nếu đã thay đổi, script gọi Cloudflare API để cập nhật lại IP cho bản ghi DNS của bạn.
Nhờ vậy, dù IP WAN có thay đổi, chỉ cần vài phút là tên miền sẽ tự trỏ về IP mới, bạn chỉ việc truy cập qua domain như bình thường.
2. Chuẩn bị trước trên Cloudflare
Trước khi đụng tới script, bạn cần chuẩn bị một số thứ trên Cloudflare.
2.1. Tên miền và cấu hình DNS
Bước 1: Mua và trỏ tên miền về Cloudflare (đổi nameserver ở nơi mua domain sang nameserver của Cloudflare).
Bước 2: Trong Cloudflare, vào mục DNS và tạo một bản ghi A cho Lab.
Ví dụ bạn muốn dùng: lab.anonyviet.com
Tạo bản ghi:
Type: A
-
-
- Name:
lab - IPv4 address: có thể tạm điền
123.123.123.123(sau đó script sẽ tự cập nhật lại IP thật). - Proxy status: tùy nhu cầu, có thể bật (Proxied) hoặc tắt (DNS only).
- Name:
-

2.2. Lấy Zone ID và tạo API Token
Bạn cần 2 thứ để cấu hình tự động cho Cloudflare
- Zone ID
- API Token
Cách lấy Zone ID cloudflare
Zone ID của domain (vào domain trong Cloudflare, tab Overview, cuối trang sẽ thấy Zone ID).

Lưu dãy số Zone ID lại nhé
Cách lấy API Toklen Cloudflare
Đây là cách tạo API Token có quyền quản lý DNS: Bạn vào trang https://dash.cloudflare.com/profile/api-tokens
Chọn Create Token.
Chọn template Edit Zone DNS -> Use template

Tại Zone Resources bạn chọn specific zone, ô bên cạnh chọn đúng domain của bạn muốn cập nhật IP động

Tạo xong thì copy API Token và lưu lại ở nơi an toàn.
3. Chuẩn bị máy chạy script (Linux / Raspberry Pi)
Bạn cần một máy luôn bật trong mạng nội bộ, ví dụ:
- Raspberry Pi.
- Máy chủ chạy Ubuntu, Debian, hoặc bất cứ distro Linux nào.
- Có SSH vào được để cấu hình.
Cài thêm các công cụ cần thiết:
sudo apt update
sudo apt install -y curl jq
curl dùng để gọi API, jq dùng để xử lý JSON trả về từ Cloudflare.
4. Viết script cập nhật IP qua Cloudflare
Tạo thư mục và file script:
cd ~
mkdir -p cloudflare
cd cloudflare
nano cloudflare.sh
Dán nội dung sau (tùy chỉnh các biến ở đầu file cho phù hợp):
#!/usr/bin/env bash
# ================== CẤU HÌNH ==================
CF_API_TOKEN="YOUR_API_TOKEN_HERE"
CF_ZONE_ID="YOUR_ZONE_ID_HERE"
CF_RECORD_NAME="lab.anonyviet.com" # Tên đầy đủ của record (FQDN)
IP_FILE="$HOME/cloudflare/current_ip.txt"
LOG_FILE="$HOME/cloudflare/cloudflare.log"
# ================== HÀM HỖ TRỢ ==================
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
mkdir -p "$(dirname "$IP_FILE")"
# ================== LẤY IP PUBLIC ==================
CURRENT_IP=$(curl -s https://ipv4.icanhazip.com | tr -d '\n')
if [[ -z "$CURRENT_IP" ]]; then
log "Không lấy được IP public, dừng."
exit 1
fi
OLD_IP=""
if [[ -f "$IP_FILE" ]]; then
OLD_IP=$(cat "$IP_FILE")
fi
if [[ "$CURRENT_IP" == "$OLD_IP" ]]; then
log "IP không thay đổi ($CURRENT_IP), bỏ qua cập nhật."
exit 0
fi
log "IP thay đổi: $OLD_IP -> $CURRENT_IP, bắt đầu cập nhật Cloudflare."
# ================== LẤY RECORD ID ==================
RESPONSE=$(curl -s -X GET \
"https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records?type=A&name=$CF_RECORD_NAME" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json")
RECORD_ID=$(echo "$RESPONSE" | jq -r '.result[0].id')
if [[ -z "$RECORD_ID" || "$RECORD_ID" == "null" ]]; then
log "Không tìm thấy DNS record cho $CF_RECORD_NAME"
exit 1
fi
# ================== GỬI YÊU CẦU CẬP NHẬT ==================
UPDATE_PAYLOAD=$(jq -n \
--arg type "A" \
--arg name "$CF_RECORD_NAME" \
--arg content "$CURRENT_IP" \
--argjson ttl 120 \
--argjson proxied true \
'{type: $type, name: $name, content: $content, ttl: $ttl, proxied: $proxied}')
UPDATE_RESP=$(curl -s -X PUT \
"https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data "$UPDATE_PAYLOAD")
SUCCESS=$(echo "$UPDATE_RESP" | jq -r '.success')
if [[ "$SUCCESS" == "true" ]]; then
echo "$CURRENT_IP" > "$IP_FILE"
log "Cập nhật thành công bản ghi $CF_RECORD_NAME -> $CURRENT_IP"
exit 0
else
log "Cập nhật thất bại. Phản hồi: $UPDATE_RESP"
exit 1
fi
Lưu file lại, sau đó cấp quyền thực thi:
chmod +x ~/cloudflare/cloudflare.sh
Lưu ý:
- Thay
YOUR_API_TOKEN_HEREbằng API Token thật của bạn. - Thay
YOUR_ZONE_ID_HEREbằng Zone ID thật. - Thay
lab.anonyviet.combằng tên miền/subdomain bạn muốn dùng cho homelab.
5. Chạy thử script lần đầu
Chạy thử bằng tay:
./cloudflare.sh
Nếu mọi thứ ổn:
- File
current_ip.txtsẽ được tạo và chứa IP public hiện tại. - File
cloudflare.logsẽ ghi lại log cập nhật. - Trong Cloudflare → DNS, bản ghi A
lab.anonyviet.comsẽ được cập nhật đúng IP public.
Nếu không thấy cập nhật:
- Kiểm tra lại đúng Zone ID, API Token, tên bản ghi.
- Dùng lệnh sau để xem log:
tail -n 50 ~/cloudflare/cloudflare.log
6. Thiết lập cron để cập nhật tự động
Khi script hoạt động tốt, bạn nên cho nó chạy tự động vài phút một lần bằng cron.
Mở crontab:
crontab -e
Thêm dòng:
*/5 * * * * /bin/bash /home/USERNAME/cloudflare/cloudflare.sh >/dev/null 2>&1
Trong đó:
- Thay
USERNAMEbằng username thật trên hệ thống. - Lịch
*/5 * * * *nghĩa là chạy mỗi 5 phút. Bạn có thể chỉnh 10, 15 phút tùy nhu cầu.
Nhấn lần lược các phím để lưu lại:
Ctrl X
Y
Enter
Từ giờ, cron sẽ tự chạy script, mỗi khi IP WAN thay đổi thì vài phút sau Cloudflare sẽ được cập nhật.
7. NAT Port dịch vụ ra Internet
Bây giờ bạn tiến hành vào Router Internet để Nat Port dịch vụ ra ngoài Internet, sau đó truy cập dịch vụ theo tên miền đã cấu hình ở trên.
Ví dụ bạn muốn SSH vào Server ở nhà, thì NAT Port 22. Thì khai báo truy cập khi ở bên ngoài intenet là: hostname: lab.anonyviet.com, Port 22.
Hình bên dưới là mình NAT Port trên Modem VNPT GW040-NS

Dùng MobaxTerm để SSH từ xa về Lab ở nhà

8. Một vài lưu ý khi dùng cho homelab
- Nên đặt script trên máy luôn bật trong mạng nội bộ (Raspberry Pi, mini PC, NAS…).
- Nên kiểm tra log định kỳ để chắc chắn việc cập nhật không bị lỗi do Token hết hạn, sai quyền, v.v.
- Nếu bạn dùng thêm reverse proxy (Nginx Proxy Manager, Traefik…) hoặc SSL, hãy chắc chắn tên miền trỏ đúng IP trước khi cấu hình HTTPS.
Bạn có thể chỉnh lại tên miền, đường dẫn, screenshots… trong bài viết cho phù hợp với homelab và hệ thống của bạn.














