Trạm phóng đang hoạt động Giờ VN
HƯỚNG DẪN

Đưa website trên VPS ra Internet bằng Cloudflare Tunnel

Hướng dẫn chạy website trên VPS không cần IP public: cài Nginx, tạo Cloudflare Tunnel, gắn tên miền, HTTPS tự động và lấy đúng IP người truy cập.

VPS tại UHOST ra Internet qua NAT và không có IP public riêng. Để người khác truy cập website trên VPS, bạn dùng Cloudflare Tunnel: một chương trình nhỏ (cloudflared) chạy trong VPS, chủ động kết nối ra Cloudflare và nhận yêu cầu từ khách truy cập qua đường kết nối đó. Không cần mở cổng, không cần IP tĩnh, HTTPS có sẵn và gói Free của Cloudflare là đủ.

Cần chuẩn bị

  • Một VPS Ubuntu đang chạy và quyền sudo.
  • Một tên miền đã thêm vào Cloudflare (đổi nameserver về Cloudflare). Chưa có tên miền thì vẫn thử được bằng địa chỉ tạm miễn phí ở cuối bài.

Bước 1: Chạy website trong VPS

Ví dụ đơn giản nhất với Nginx:

sudo apt update
sudo apt install -y nginx
curl -I http://localhost

Thấy HTTP/1.1 200 OK là web server đã chạy. Ứng dụng Node.js, Python hay container Docker cũng làm tương tự: chỉ cần biết nó đang nghe ở cổng nào trong VPS, ví dụ http://localhost:3000.

Bước 2: Tạo tunnel trên Cloudflare

  1. Vào Cloudflare Zero Trust, mục Networks → Tunnels (tên menu có thể thay đổi theo giao diện Cloudflare), bấm Create a tunnel.
  2. Chọn loại Cloudflared, đặt tên, ví dụ vps-web.
  3. Chọn môi trường Debian, kiến trúc 64-bit. Cloudflare hiện lệnh cài đặt gồm một token riêng.

Bước 3: Cài cloudflared trong VPS

Dán nguyên lệnh Cloudflare cung cấp vào VPS. Lệnh có dạng:

curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
sudo cloudflared service install <TOKEN-CỦA-BẠN>

Lệnh cuối cài cloudflared thành dịch vụ hệ thống, tự chạy lại khi VPS khởi động. Token giống mật khẩu của tunnel: không chia sẻ, không đưa lên GitHub. Trên trang Cloudflare, trạng thái tunnel chuyển sang Healthy là được.

Bước 4: Gắn tên miền

Ở bước Public Hostname (hoặc Route traffic) của tunnel:

ÔĐiền
Subdomain / Domainwww / tenmiencuaban.vn (để trống subdomain nếu dùng tên miền gốc)
Service typeHTTP
URLlocalhost:80 (hoặc localhost:3000, localhost:8080... theo ứng dụng)

Lưu lại. Cloudflare tự tạo bản ghi DNS và chứng chỉ HTTPS. Mở https://www.tenmiencuaban.vn để kiểm tra. Muốn chạy nhiều website trên cùng VPS, thêm nhiều Public Hostname vào cùng một tunnel, mỗi cái trỏ tới một cổng khác nhau.

Bước 5: Lấy đúng IP người truy cập

Qua tunnel, mọi yêu cầu đến từ 127.0.0.1. IP thật của khách nằm trong header CF-Connecting-IP. Với Nginx, tạo file /etc/nginx/conf.d/real-ip.conf:

set_real_ip_from 127.0.0.1;
real_ip_header CF-Connecting-IP;
sudo nginx -t && sudo systemctl reload nginx

Ứng dụng tự viết thì đọc header CF-Connecting-IP khi cần IP khách, ví dụ để giới hạn số lần đăng nhập.

Ghi chú cho WordPress

  • Đặt WordPress Address và Site Address là https://tenmiencuaban.vn.
  • Vì Cloudflare nhận HTTPS rồi chuyển vào VPS bằng HTTP, thêm vào wp-config.php (trước dòng "That's all, stop editing"):
    if (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https') { $_SERVER['HTTPS'] = 'on'; }
    để tránh lỗi chuyển hướng vòng lặp.

Thử nhanh không cần tên miền

Cloudflare có chế độ tunnel tạm, không cần tài khoản:

cloudflared tunnel --url http://localhost:80

Lệnh in ra một địa chỉ dạng https://ten-ngau-nhien.trycloudflare.com. Địa chỉ này đổi mỗi lần chạy và chỉ dùng để thử nghiệm, không dùng cho website thật.

Còn email thì sao?

Cổng 25 bị chặn chiều ra trên VPS. Để website gửi email (đặt lại mật khẩu, thông báo đơn hàng), dùng dịch vụ SMTP bên ngoài như Gmail, Zoho, Brevo, Amazon SES qua cổng 587 hoặc 465.