Thêm domain từ Cloudflare vào server

Giới thiệu

Cloudflare là gì

Cloudflare là một dịch vụ nằm giữa khách người dùng và máy chủ web, hoạt động như một Reverse Proxy cho các trang web. Cloudflare cung cấp Content Delivery Network (CDN), cũng như các dịch vụ giảm thiểu DDoS và máy chủ tên miền phân tán.

Cloudflare nằm giữa kết nối giữa domain và hosting. Bình thường domain sẽ được cấu hình Nameservers (NS) hoặc record A trỏ tới IP của host chứa website. Tuy nhiên khi sử dụng Cloudflare thì domain sẽ trỏ tới DNS của Cloudflare. Do đó, mọi truy cập đến website sẽ thông qua Cloudflare này trước, rồi từ Cloudflare mới đến host chứa website.

Tại sao lại dùng Cloudflare

Chúng ta đang xây dựng Server ngay tại nhà, mà hầu hết các nhà cung cấp ở Việt Nam đều chỉ cung cấp cho chúng ta IP động (mỗi lần khởi động lại Router thì IP sẽ bị thay đổi), mình ở Nhật thì dùng qua hai nhà cung cấp là Softbank lẫn JCom cũng đều là IP động. Vì vậy, chúng ta sử dụng DNS của Cloudflare để đảm bảo truy cập đến Server không bị ngắt quãng khi vô tình khởi động lại Router hay ...mất điện đột ngột.

Yêu cầu

→ Ubuntu Server
→ Đã cài đặt Nginx trên Server.
→ Tài khoản Cloudflare.
→ Tên miền, để test thì chúng ta có thể đăng ký dot.tk cho tiện.

Cài đặt

Bước 1: trỏ tên miền về Cloudflare

Mình đã đăng ký để test với tên miền manhhadev.tk, để tránh trường hợp trỏ về Cloudflare bị lỗi thì sau khi đăng ký xong chúng ta chỉnh Nameserver của tên miền về Cloudflare luôn. Nameserver của Cloudflare là

noel.ns.cloudflare.com
oaklyn.ns.cloudflare.com

Lấy Public IP của Server, chạy bất kỳ một trong các lệnh sau để show ra IP của bạn.

curl ifconfig.me
curl icanhazip.com
curl ipinfo.io/ip
curl api.ipify.org
curl checkip.dyndns.org
dig +short myip.opendns.com @resolver1.opendns.com
host myip.opendns.com resolver1.opendns.com
curl ident.me
curl ipecho.net/plain

Bạn sẽ lấy được IP của mình. Tiếp theo vào Cloudflare và thêm domain vào, sau đó đến phần chọn "Select a plan", chọn "Not sure where to start? Get started for free.", Continue để tiếp tục

Nhập sẵn vào Cloudflare các thông tin này (IP thì có thể thay đổi tùy thời điểm). Thay manhhadev.tk là domain của bạn

A(DNS only | auto TTL)
*.manhhadev.tk
points to IP-đã-lấy-ở-trên
A(DNS only | auto TTL)
manhhadev.tk
points to IP-đã-lấy-ở-trên

Chờ một lát để Cloudflare thực hiện các thay đổi, sau đó sẽ có một email gửi đến email của bạn xác nhận thành công.
Vào trang chủ của Cloudflare, kiểm tra tình trạng tên miền, như hình dưới là OK rồi đó

Bước 2: tạo Server Block trên Nginx

Giờ Cloudflare đã trỏ domain về IP của bạn, ping thử có thể thấy đã trả về IP đó. Tuy nhiên khi truy cập thì bạn sẽ không thể truy cập được. Tiếp theo, chúng ta sẽ tạo Server Block cho domain trên Server của mình. Tạo file cấu hình Server Block

sudo nano /etc/nginx/sites-available/manhhadev.tk

Chèn nội dung sau

#/etc/nginx/sites-available/manhhadev.tk
server {
    listen 80;
    listen [::]:80;
    server_name manhhadev.tk www.manhhadev.tk;
	root /var/www/manhhadev.tk;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://192.168.0.16:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }
}

Tạo liên kết, xác nhận cấu hình ok, khởi động lại Nginx

sudo ln -s /etc/nginx/sites-available/manhhadev.tk /etc/nginx/sites-enabled/manhhadev.tk
sudo nginx -t
sudo systemctl restart nginx

Hiện tại thì do trên Server chưa tồn tại thư mục /var/www/manhhadev.tk nên khi truy cập vào domain, sẽ ra trang mặc định của Nginx Server.

Chúng ta sẽ tạo trang riêng để xác nhận cấu hình Nginx cũng như Cloudflare hoạt động chính xác. Tạo thư mục

sudo mkdir /var/www/manhhadev.tk

Tiếp đó, tạo file index

sudo nano /var/www/manhhadev.tk/index.html

Sau đó nhập vào nội dung sau

<h1>ManhHaDev.tk</h1>

Truy cập lại lần nữa, xóa cache trình duyệt đi nếu cần thiết. Nếu ra như hình dưới là được rồi đó.

Bước 3: Tạo script để tự động cập nhập IP mới

Truy cập vào https://dash.cloudflare.com/profile/api-tokens để lấy "Global API Key".

Về thư mục home, tạo thư mục cloudflare (cho dễ quản lý và hẹn giờ chạy tự động sau), trong thư mục đó tạo file cloudflare-auto-change-ip.sh

cd ~
sudo mkdir cloudflare
nano cloudflare-auto-change-ip.sh

Chèn vào nội dung sau

#!/bin/bash

#CHEN THONG TIN VAO DAY
DomainName=your-domain-name.com
## THONG TIN TAI KHOAN CLOUDFLARE ##
## GIU BI MAT CHI MINH BAN BIET ##
#EMAIL
cloudflare_auth_email=your-email@domain.com
#Global API Key
cloudflare_auth_key=123456789qwertyuiopasdfghjklzxcvbnm00
#LAY DIA CHI IP HIEN TAI CUA SERVER
ip=$(curl -s -X GET https://checkip.amazonaws.com)

echo "IP hien tai cua SERVER la $ip"
#KIEM TRA IP HIEN TAI CUA SERVER VOI A RECORD TREN CLOUDFLARE CO TRUNG NHAU KHONG
#NEU TRUNG THI KHONG CAN CAP NHAP
if host $DomainName 1.1.1.1 | grep "has address" | grep "$ip"; then
  echo "tren SERVER $DomainName hien tai co IP la $ip; khong can thay doi"
  exit
fi
#NEU KHONG TRUNG TIEN HANH CAP NHAP
#LAY Zoneid CUA DOMAIN
zoneid=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$DomainName&status=active" \
  -H "X-Auth-Email: $cloudflare_auth_email" \
  -H "X-Auth-Key: $cloudflare_auth_key" \
  -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1)
#HIEN THI LEN DE DEBUG, HOAT DONG TOT COMMENT LAI
echo "Zoneid cua $DomainName la $zoneid"
#LAY DNS A RECORD HIEN TAI
dnsrecordid=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records?type=A&name=$DomainName" \
  -H "X-Auth-Email: $cloudflare_auth_email" \
  -H "X-Auth-Key: $cloudflare_auth_key" \
  -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1)
#HIEN THI LEN DE DEBUG, HOAT DONG TOT COMMENT LAI
echo "DNSrecordid cua $dnsrecord la $dnsrecordid"
#CAP NHAP DNS A RECORD MOI
echo "Dia chi IP moi da duoc cap nhap!"
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dnsrecordid" \
  -H "X-Auth-Email: $cloudflare_auth_email" \
  -H "X-Auth-Key: $cloudflare_auth_key" \
  -H "Content-Type: application/json" \
  --data "{\"type\":\"A\",\"name\":\"$dnsrecord\",\"content\":\"$ip\",\"ttl\":1,\"proxied\":false}" | grep -Po '(?<="content":")[^"]*' | head -1

Trong đó DomainName là tên miền của bạn, cloudflare_auth_email là email đăng ký ở cloudflare, cloudflare_auth_key là Global API Key đã lấy ở trên. Chmod lại file

chmod u+x cloudflare-auto-change-ip.sh

Để test thử, bạn thay đổi IP trên trang web của cloudflare, sau đó chạy script. Chạy script bằng lệnh

./cloudflare-auto-change-ip.sh

Bạn cũng có thể tải script trên Github của mình https://github.com/haconbk/cloudflare-auto-change-IP/

Bước 4: Thiết lập cron để script chạy tự động

Nếu như bạn ra ngoài và không có ở nhà, bất chợt mất điện thì bạn không thể nào remote để chạy script được → máy chủ sẽ không thể truy cập cho đến khi bạn về. Vì vậy, chúng ta sẽ cho script tự động chạy sau một khoảng thời gian nhất định để đảm bảo Server vận hành ổn định.
Ở đây, mình thiết lập để script tự động chạy 30 phút một lần. Thường thì với Server có lượng truy cập lớn thì thiết lập thời gian ngắn hơn tránh gián đoạn quá lâu.

crontab -e

và chèn vào nội dung sau

*/30 * * * * /bin/bash /home/luffy/cloudflare/cloudflare-auto-change-ip.sh

Thay "/home/luffy/cloudflare/cloudflare-auto-change-ip.sh" đến file của bạn. Và đừng xóa nhầm nhé.

Kết luận

Như vậy chúng ta đã hoàn thành việc thêm domain vào Cloudflare, trỏ IP về Server và tạo script để tự động update IP từ Server lên Cloudflare.
Có một lưu ý nhỏ là với domain .tk ...đăng ký ở freenom thì bắt buộc phải chỉnh IP trên Cloudflare, không thể chạy bash script trên được.
Nếu có khó khăn hay có câu hỏi gì hãy đừng ngại ngần mà viết comment ở phần bên dưới nhé.