Nội dung chính
Khi bạn tự host máy chủ tại nhà với IP động từ nhà mạng, việc cập nhật DNS record trên Cloudflare mỗi khi IP thay đổi là điều cần thiết. Bài viết này sẽ hướng dẫn bạn thiết lập hệ thống tự động cập nhật bản ghi DNS thông qua một công cụ do mình tự phát triển.
Tại sao cần công cụ này?
Đối với mạng gia đình, các nhà cung cấp dịch vụ internet như Viettel, FPT hay VNPT sẽ mặc định để mạng nhà bạn ở dạng IP động. Nghĩa là địa chỉ IP công khai của bạn có thể bị thay đổi bất cứ lúc nào, chẳng hạn như:
- Khi bạn bật, tắt router hoặc modem
- Sau một khoảng thời gian ngẫu nhiên nhà mạng tự thay đổi
- khi mất điện
Vậy nên nếu bạn đặt máy chủ tại nhà để chạy website, trong trường hợp nếu IP công khai bị thay đổi mà bạn không cập nhật DNS với địa chỉ IP mới thì website của bạn ngay lập tức sẽ không thể truy cập được. Không lẽ chúng ta cứ phải canh xem lúc nào IP bị thay đổi để vào cập nhật một cách thủ công?
Không ai muốn website gặp vấn đề nghiêm trọng như vậy cả!
Vì vậy, mình đã viết một công cụ chạy trên NodeJS để tự động kiểm tra, phát hiện và cập nhật bản ghi cho tên miền trên Cloudflare nếu có sự thay đổi về địa chỉ IP của đường truyền mạng nhà bạn.
Mình cũng đã tích hợp chức năng gửi thông báo về Telegram cho chúng ta biết mỗi khi tên miền được cập nhật bản ghi mới.
Tại sao lại là Cloudflare?
Mình đang quản lý hàng chục tên miền, được mua ở nhiều nhà đăng ký tên miền, cả trong nước lẫn quốc tế. Nhưng tất cả đều được trỏ Name Server về Cloudflare để quản lý. Khi dùng Cloudflare, bạn sẽ có một nơi quản lý tập trung toàn bộ các tên miền thay vì phải đăng nhập vào nhiều nhà cung cấp dịch vụ đăng ký tên miền khác nhau. Mà nó lại hoàn toàn miễn phí!
Và lý do quan trọng nhất là Cloudflare cung cấp một bộ API hoàn chỉnh để chúng ta có thể thực hiện kiểm tra, cập nhật các bản ghi cho tên miền một cách dễ dàng. Thông qua API chính thống này, mình mới có thể viết ra công cụ chạy tự động trên Nodejs.
Các bước thực hiện
Do đây là một phần thuộc series hướng dẫn làm home server, mà trước đó mình đang hướng dẫn anh em sử dụng aaPanel để quản lý. Cho nên các bước thực hiện đa số sẽ thao tác trên aaPanel. Nhưng bạn hoàn toàn có thể dựa vào đó để tự cấu hình trên server của bạn, miễn là nó chạy linux.
Bước 1: Cài Nodejs
Để tải Nodejs, bạn truy cập vào trang https://nodejs.org/en/download
Chọn phiên bản v22 cho Linux, sử dụng fnm với npm như hình phía dưới

Copy lệnh sau để cài:
curl -o- https://fnm.vercel.app/install | bash
Đăng nhập vào SSH của server với quyền root và paste lệnh trên vào

Tiếp tục nhập lệnh
source /root/.bashrc

Nhập tiếp lệnh sau để cài:
fnm install 22
Quá trình cài hoàn tất thì nhập lệnh
node -v
npm -v

Nếu thực hiện 2 lệnh trên mà thấy có phiên bản xuất hiện (ví dụ trong hình là nodejs chạy bản v22.21.1 và npm chạy bản 10.9.4) là đã hoàn tất quá trình cài đặt Nodejs.
Bước 2: Tải file
Mình đã đăng tải code lên Github ở link này: https://github.com/8technologia/cloudflare-ddns
Truy cập vào link trên, Ấn vào nút “<> Code” màu xanh lá cây, sau đó chọn Download ZIP để tải xuống file cloudflare-ddns-main.zip

Vào lại giao diện của aaPanel, truy cập vào tab Files, chọn đến thư mục wwwroot. Tại đây di chuột vào File Operations -> chọn Upload

Tìm đến file cloudflare-ddns-main.zip trên máy của bạn, chọn nó rồi ấn Confirm Upload

Di chuyển chuột đến file zip vừa tải lên, ấn chuột phải rồi chọn Unzip

Giải nén xong ta được thư mục cloudflare-ddns-main, click chuột để truy cập vào thư mục đó. Tại đây chúng ta sẽ thấy các file code

Bây giờ ấn chuột phải vào file config.example.json và chọn Rename, sau đó đổi tên file thành config.json

Đổi xong thì click vào file config.json sẽ thấy giao diện như hình

Bước 3: Lấy Token của Cloudflare
Mở một tab mới trên trình duyệt, đăng nhập vào tài khoản Cloudflare của bạn tại địa chỉ https://dash.cloudflare.com/
Đăng nhập xong thì truy cập vào https://dash.cloudflare.com/profile/api-tokens rồi chọn Create Token

Chọn Use template của dòng Edit zone DNS

Trong mục Zone Resources, đổi từ Specific zone thành All zones. Các mục khác để nguyên, kéo xuống dưới cùng chọn Continue to summary rồi chọn Create Token.

Lúc này, token sẽ được tạo ra và hiện lên màn hình. Nó chỉ hiện một lần duy nhất nên các bạn cần copy và lưu lại để sử dụng.

Copy token rồi quay trở lại tab của aaPanel trên trình duyệt, Paste token vào mục apiToken

Quay trở lại tab của Cloudflare, chọn vào tên miền của bạn, kéo xuống dưới cùng phía góc tay phải màn hình sẽ thấy mục Zone ID.

Copy giá trị của nó và paste vào file config.json, tại mục zoneId nằm trong domains. Đồng thời sửa mục “name” thành tên miền của bạn.

Nếu bạn còn domain khác muốn sử dụng thì tiếp tục thêm hoặc sửa. Hệ thống hỗ trợ thêm nhiều domain khác nhau. Hiện tại mình chỉ có 1 tên miền cần tự động nên mình sẽ xoá các block khác trong domains.

Còn một lưu ý khá quan trọng là tên miền của bạn cần phải có bản ghi A. Nếu chưa thêm, bạn vào Cloudflare -> vào tab DNS -> chọn Records. Sau đó tạo bản ghi A với IP bất kì.

Bước 4: Lấy Token của Telegram Bot
Nếu anh em muốn tự động gửi thông báo về telegram mỗi khi hệ thống phát hiện và cập nhật bản ghi cho tên miền trên Cloudflare thì có thể thêm Telegram bot vào.
Để tạo TELEGRAM_BOT_TOKEN thì các bạn vào Telegram, gõ @botfather vào ô tìm kiếm. Ấn Start

Chọn /newbot và đặt tên cho Bot theo ý thích của bạn

Tiếp tục nhập username cho bot, kết thúc bằng “bot”. Ví dụ mình sẽ nhập là ddns_cloudflare_tam_bot
Lúc này nó sẽ hiển thị Token cho chúng ta. Hãy ấn vào dòng chữ màu đỏ để copy.

Quay trở lại file config.json rồi paste vào mục YOUR_TELEGRAM_BOT_TOKEN bằng Token Telegram thực tế của bạn

Còn mục YOUR_TELEGRAM_CHAT_ID, chúng ta sẽ lấy bằng cách gửi một tin nhắn bất kì đến bot mà chúng ta vừa tạo.
Sau đó truy cập vào URL sau trên trình duyệt:
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
Thay <YOUR_BOT_TOKEN> thành token thực tế của bạn, ví dụ ở bước trước, mình đã tạo Bot với Token là 8384145954:AAHR6yllqw_A2-QaFB2Eca18eCutjBTANqM thì mình sẽ thay URL thành:
https://api.telegram.org/bot8384145954:AAHR6yllqw_A2-QaFB2Eca18eCutjBTANqM/getUpdates
Copy toàn bộ URL rồi truy cập trên trình duyệt, bạn sẽ thấy trả về kết quả json như sau

Tìm trường "chat":{"id":5528634931 – đó chính là chat ID. Copy giá trị của id rồi quay lại file config.json và paste vào mục YOUR_TELEGRAM_CHAT_ID. Cuối cùng ấn Save để lưu lại các thay đổi.

Bước 5: Khởi chạy
Bạn nên cài PM2 để chạy dự án bằng cách vào ssh và nhập lệnh sau
npm install pm2 -g
Sau khi cài xong PM2, hãy khởi chạy dự án bằng cách vào ssh và nhập lệnh
pm2 start /www/wwwroot/cloudflare-ddns-main/cloudflare-ddns.js --name cloudflare-ddns --time
Tiếp tục nhập lệnh sau để lưu cấu hình PM2 và tự động khởi chạy khi reboot
pm2 save
pm2 startup

Kiểm tra log bằng lệnh
pm2 log

Log hiện vậy là hệ thống đã hoạt động rồi!
Bước 6: Kiểm thử
Đây là địa chỉ IP đường truyền mạng hiện tại của nhà mình

Bây giờ mình sẽ tắt nguồn Router, đợi khoảng 30 giây rồi bật lại để nó nhận địa chỉ IP công khai mới. Sau khi khởi động xong router, mình load lại trang whoer.net để kiếm tra và thấy ip đã thay đổi.

Và Telegram Bot cũng đã gửi tin nhắn thông báo

Mọi thứ đã hoạt động hoàn hảo. Bây giờ bạn sẽ có trợ lý canh gác 24/7 để cập nhật bản ghi cho tên miền của bạn. Yên tâm ngủ ngon nhé!
Bạn cần bảo mật kĩ các token của Cloudflare và Telegram Bot. Các Token, Key xuất hiện trên hình ảnh minh hoạ trong bài viết này chỉ là các dãy kí tự mình đã chỉnh sửa, không phải token hoặc key thật.
