[Cloudflare] Lưu trữ một trang web với IP động (DNS động)

Giới thiệu

Gần đây, tôi được tặng một Raspberry Pi , không có gì nhiều để sử dụng nó, tôi quyết định thử và lưu trữ trang web của riêng mình bằng Raspberry Pi làm máy chủ web.

Sử dụng dịch vụ proxy của Cloudflare, tôi có thể lưu trữ trang web của riêng mình bằng miền tùy chỉnh mà tôi nhận được từ NameCheap .

Tuy nhiên, chỉ có hai vấn đề …

  1. Tôi có một dynamic public IP
  2. Tôi broke

Dung dịch

Vì tôi đang chạy mọi thứ chỉ trên Raspberry Pi của mình, tôi muốn một thứ gì đó nhẹ có thể giúp giải quyết vấn đề này.

Vì vậy, sau khi xem video rất sâu sắc từ Keld Norman

I came up with a bash script that in conjunction with Crontab, fetches your lastest public IP address and updates it on Cloudflare using their APIs.

#!/bin/bash
auth_email=“” # The email used to login ‘https://dash.cloudflare.com’
auth_key=“” # Top right corner, “My profile” > “Global API Key”
zone_identifier=“” # Can be found in the “Overview” tab of your domain
record_name=“” # Which record you want to be synced
proxy=true # Set the proxy to true or false
###########################################
## Check if we have an public IP
###########################################
ip=$(curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com/)
if [ “${ip}” == “” ]; then
message=“No public IP found.”
>&2 echo -e “${message}” >> ~/log
exit 1
fi
###########################################
## Seek for the A record
###########################################
echo ” Check Initiated” >> ~/log
record=$(curl -s -X GET “https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name” -H “X-Auth-Email: $auth_email” -H “X-Auth-Key: $auth_key” -H “Content-Type: application/json”)
###########################################
## Check if the domain has an A record
###########################################
if [[ $record == *“\”count\”:0″* ]]; then
message=” Record does not exist, perhaps create one first? (${ip} for ${record_name})”
>&2 echo -e “${message}” >> ~/log
exit 1
fi
###########################################
## Get the existing IP
###########################################
old_ip=$(echo “$record” | grep -Po ‘(?<=”content”:”)[^”]*’ | head -1)
# Compare if they’re the same
if [[ $ip == $old_ip ]]; then
message=” IP ($ip) for ${record_name} has not changed.”
echo “${message}” >> ~/log
exit 0
fi
###########################################
## Set the record identifier from result
###########################################
record_identifier=$(echo “$record” | grep -Po ‘(?<=”id”:”)[^”]*’ | head -1)
###########################################
## Change the IP@Cloudflare using the API
###########################################
update=$(curl -s -X PUT “https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier” \
-H “X-Auth-Email: $auth_email” \
-H “X-Auth-Key: $auth_key” \
-H “Content-Type: application/json” \
–data “{\”id\”:\”$zone_identifier\”,\”type\”:\”A\”,\”proxied\”:${proxy},\”name\”:\”$record_name\”,\”content\”:\”$ip\”}”)
###########################################
## Report the status
###########################################
case “$update” in
*“\”success\”:false”*)
message=“$ip $record_name DDNS failed for $record_identifier ($ip). DUMPING RESULTS:\n$update”
>&2 echo -e “${message}” >> ~/log
exit 1;;
*)
message=“$ip $record_name DDNS updated.”
echo “${message}” >> ~/log
exit 0;;
esac

 

Cloudflare Dynamic DNS IP Register

This script is used to update dynamic DNS entries for accounts on Cloudflare.

git clone https://github.com/K0p1-Git/cloudflare-ddns-updater.git

Xem thêm: https://github.com/K0p1-Git/cloudflare-ddns-updater

=======================Cron

Script này lưu lại ở đường dẫn /home/capnhat/capnhat.sh (gán quyền execute – chmod +x /home/capnhat/capnhat.sh nếu là bash script).

# crontab -e  — ( này là chỉnh sửa = vi ) Nếu muốn dùng Editor nano sửa cho dễ thì bạn dùng lệnh sau: EDITOR=nano crontab -e

nhấn chử để nhập 0,30 * * * * /home/capnhat/capnhat.sh dòng này vào (dòng này có nghĩa là 30 phút chạy 1 lần)

nhấn ESC, rồi gõ vào :wq nhấn Enter để lưu lại và thoát.

Cuối cùng, nhớ khởi động lại cron daemon (Đây là lệnh trên Centos7):

# systemctl restart crond.service

*/10 * * * * /home/capnhat/capnhat.sh

*/10: nghĩa là cứ 10 phút chạy 1 lần. Tương tự như vậy ta có thể thực thi 5 phút 1 lần bằng */5

=======================

1. Cron là gì?

Cron là một tiện ích cho phép thực hiện các tác vụ một cách tự động theo định kỳ, ở chế độ nền của hệ thống. Crontab (CRON TABle) là một file chứa đựng bảng biểu (schedule) của các entries được chạy.

Mình mới bổ sung công cụ tạo Crontab với giao diện trực quan, rất dễ sử dụng. Mời các bạn tham khảo.

2. Cron làm việc thế nào?

Một cron schedule đơn giản là một text file. Mỗi người dùng có một cron schedule riêng, file này thường nằm ở /var/spool/cron. Crontab files không cho phép bạn tạo hoặc chỉnh sửa trực tiếp với bất kỳ trình text editor nào, trừ phi bạn dùng lệnh crontab.

Một số lệnh thường dùng:

crontab -e: tạo hoặc chỉnh sửa file crontab
crontab -l: hiển thị file crontab
crontab -r: xóa file crontab

Hầu hết tất cả VPS đều được cài đặt sẵn crontab, tuy nhiên vẫn có trường hợp VPS không có. Nếu bạn sử dụng lệnh crontab -l mà thấy output trả lại -bash: crontab: command not found thì cần tự cài crontab thủ công.

Cài đặt crontab

Sử dụng lệnh:

yum install cronie

Start crontab và tự động chạy mỗi khi reboot:

service crond start
chkconfig crond on

3. Cấu trúc của crontab

Một crontab file có 5 trường xác định thời gian, cuối cùng là lệnh sẽ được chạy định kỳ, cấu trúc như sau:

*     *     *     *     *     command to be executed
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- day of week (0 - 6) (Sunday=0)
|     |     |     +------- month (1 - 12)
|     |     +--------- day of month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

Nếu một cột được gán ký tự *, nó có nghĩa là tác vụ sau đó sẽ được chạy ở mọi giá trị cho cột đó.

Ví dụ:

– Chạy script 30 phút 1 lần:

0,30 * * * * command

– Chạy script 15 phút 1 lần:

0,15,30,45 * * * * command

– Chạy script vào 3 giờ sáng mỗi ngày:

0 3 * * * command

4. Ví dụ cụ thể

Giả sử mình viết một đoạn script sao lưu toàn bộ thư mục /home/domain.com/public_html/ và chuyển file nén .zip vào thư mục /root/ như sau:

#!/bin/bash
zip -r /root/backup_domain.com_$(date +"%Y-%m-%d").zip /home/domain.com/public_html/ -q

Script này lưu lại ở đường dẫn /etc/backup.sh (gán quyền execute – chmod +x nếu là bash script).

Sau đó mình cho script này chạy định kỳ vào 15h thứ Hai và thứ Năm hàng tuần bằng cách tạo một file crontab như sau:

crontab -e

Nhấn o (chữ o) để thêm dòng mới với nội dung:

0 15 * * 1,4 sh /etc/backup.sh

Để lưu lại và thoát bạn nhấn ESC, rồi gõ vào :wq nhấn Enter.

Cuối cùng, nhớ khởi động lại cron daemon:

/etc/init.d/crond restart

Nếu muốn dùng Editor nano sửa cho dễ thì bạn dùng lệnh sau: EDITOR=nano crontab -e

Ví dụ khác

– Để crontab chạy mỗi phút một lần:

* * * * * sh /etc/backup.sh

– Để crontab chạy 24h một lần (vào nửa đêm):

0 0 * * * sh /etc/backup.sh

– Để crontab chạy file PHP 24h một lần:

0 0 * * * /usr/bin/php /var/www/html/reset.php

5. Disable email

Mặc định cron gửi email cho người thực thi cron job, nếu bạn muốn tắt chức năng gửi email này đi thì hãy thêm đoạn sau vào cuối dòng

>/dev/null 2>&1

Ví dụ:

0 15 * * 1,4 sh /etc/backup.sh >/dev/null 2>&1

6. Tạo log file

Để lưu log vào file:

30 18 * * * rm /home/someuser/tmp/* > /home/someuser/cronlogs/clean_tmp_dir.log

 

Phần kết luận

Đây là một giải pháp DNS động miễn phí và nhẹ .

Nó thực sự dễ dàng để triển khai. Tất cả các hướng dẫn đều có trên Github của tôi. Nếu bạn gặp bất kỳ vấn đề nào, hãy liên hệ với tôi và tôi sẽ cố gắng hết sức để giúp bạn.

Đối với những người quan tâm đến việc lên lịch công việc Cron liên tục kiểm tra các IP mới. Đừng lo lắng, nó không tiêu tốn nhiều tài nguyên như bạn nghĩ.

Hãy dùng thử và cho tôi biết suy nghĩ của bạn!

Cảm ơn vì đã đọc!

Download code: cloudflare-ddns-updater-main

Leave a Reply