Đư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
- 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.
- Chọn loại Cloudflared, đặt tên, ví dụ
vps-web. - 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 / Domain | www / tenmiencuaban.vn (để trống subdomain nếu dùng tên miền gốc) |
| Service type | HTTP |
| URL | localhost: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"):
để tránh lỗi chuyển hướng vòng lặp.if (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https') { $_SERVER['HTTPS'] = 'on'; }
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.
