Hướng Dẫn Thiết Lập Cloudflare Zero Trust: Truy Cập Server Nội Bộ An Toàn Không Cần VPN

Kiến trúc mạng Cloudflare Zero Trust - Bảo mật server không cần VPN
Bạn đang truy cập server bằng SSH qua internet mở? Đang dùng VPN chậm chạp và khó quản lý? Cloudflare Zero Trust là giải pháp thay thế miễn phí, an toàn hơn, và dễ thiết lập hơn bạn nghĩ. Hãy cùng Tony Nguyen khám phá cách xây dựng mạng nội bộ riêng tư — nơi server của bạn “vô hình” trên internet, nhưng bạn vẫn truy cập được từ bất kỳ đâu.

🔐 Tại Sao Cần Cloudflare Zero Trust?

Hầu hết các developer và sysadmin đều truy cập server bằng cách mở port SSH (22) ra internet. Đây là cách đơn giản nhất — nhưng cũng là nguy hiểm nhất.

⚠️ Thống kê đáng lo ngại: Theo báo cáo của Cloudflare, một server mới được deploy trung bình bị quét port SSH trong vòng 45 giây đầu tiên. Mỗi ngày, một server public nhận hàng nghìn brute-force attempts nhắm vào port 22.

Mô hình bảo mật truyền thống hoạt động theo nguyên tắc “tin tưởng mạng nội bộ” — nếu bạn ở trong VPN, bạn được tin tưởng. Nhưng mô hình này có nhiều lỗ hổng:

  • VPN credentials bị lộ → kẻ tấn công có full access vào mạng nội bộ
  • Lateral movement → từ một máy bị compromise, di chuyển sang các máy khác
  • VPN server là single point of failure → nếu VPN down, mọi người mất access
  • Performance kém → tất cả traffic phải đi qua VPN server trung tâm

Zero Trust đảo ngược hoàn toàn nguyên tắc này: “Không tin tưởng ai, xác thực mọi thứ”. Mỗi kết nối được xác thực riêng biệt, không phụ thuộc vào vị trí mạng.

🏗️ Kiến Trúc Tổng Quan

Trước: Kiến Trúc Truyền Thống (VPN / Port Mở)

Truyền thống

Internet ──→ [Port 22 MỞ] ──→ Server
             ⚠️ Bị quét port       ⚠️ Brute force
             ⚠️ IP bị lộ           ⚠️ DDoS trực tiếp

Hoặc:

Internet ──→ [VPN Server] ──→ Mạng nội bộ ──→ Server
             ⚠️ Single point       ⚠️ Lateral movement
             ⚠️ Performance kém    ⚠️ Credential leak

Sau: Kiến Trúc Zero Trust (Cloudflare Tunnel)

Zero Trust

PC (WARP) ──→ Cloudflare Edge ──→ Encrypted Tunnel ──→ Server
  🔒 Mã hóa      🛡️ WAF/DDoS       🔒 Outbound only     🔒 Không port mở
  ✅ Xác thực     ✅ Global CDN      ✅ IP ẩn              ✅ Private IP
💡 Điểm khác biệt cốt lõi: Cloudflare Tunnel kết nối outbound từ server đến Cloudflare — nghĩa là server KHÔNG cần mở bất kỳ port inbound nào. Kẻ tấn công không thể tìm thấy server của bạn trên internet vì nó đơn giản là không có port nào đang lắng nghe.

So Sánh Chi Tiết: VPN vs Cloudflare Zero Trust

Tiêu chí VPN Truyền Thống Cloudflare Zero Trust
Port mở ❌ Cần mở port VPN (1194, 443) ✅ Không cần mở port nào
IP server ❌ Bị lộ (public IP) ✅ Ẩn hoàn toàn
Quản lý server ❌ Cần maintain VPN server ✅ Không cần (Cloudflare quản lý)
Performance ❌ Bottleneck tại VPN server ✅ Traffic qua CDN toàn cầu
Bảo mật ❌ Trust entire network ✅ Verify every request
Chi phí 💰 Server VPN + license ✅ Miễn phí (≤50 users)
Setup ⏱️ Phức tạp (cert, routing) ✅ ~30 phút
DDoS Protection ❌ Không ✅ Tích hợp sẵn

📋 Yêu Cầu Trước Khi Bắt Đầu

Checklist nhanh:

  • ✅ Tài khoản Cloudflare (đăng ký miễn phí tại dash.cloudflare.com)
  • ✅ Kích hoạt Cloudflare One (Zero Trust) — free plan với 50 seats
  • ✅ Ít nhất một domain đã trỏ DNS về Cloudflare
  • ✅ Server Linux (Ubuntu 20.04+, Debian 11+) cần truy cập từ xa
  • ✅ PC Windows 10+ hoặc macOS 11+ để truy cập

1 Tạo Cloudflare Tunnel Trên Server

Cloudflare Tunnel là “cầu nối” mã hóa giữa server của bạn và mạng lưới Cloudflare. Nó chạy dưới dạng một daemon (cloudflared) trên server, tạo kết nối outbound — không cần mở port inbound.

Tạo Tunnel Trên Dashboard

  1. Đăng nhập Cloudflare Zero Trust Dashboard tại https://one.dash.cloudflare.com
  2. Vào NetworksConnectors (hoặc Tunnels)
  3. Click + Create a tunnel
  4. Chọn connector type: Cloudflared
  5. Đặt tên tunnel mô tả (ví dụ: prod-server, dev-server)
  6. Dashboard sẽ cung cấp token và lệnh cài đặt

Cài Đặt Bằng Docker (Khuyến Nghị)

Nếu server của bạn đã chạy Docker, đây là cách đơn giản nhất:

docker-compose.yml

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared-tunnel
    restart: unless-stopped
    command: tunnel run --token YOUR_TUNNEL_TOKEN
    network_mode: host
💡 Tại sao network_mode: host? Vì cloudflared cần truy cập các service chạy trên localhost của server (như SSH port 22, web server port 8080, v.v.). Nếu dùng Docker bridge network, cloudflared sẽ không thể kết nối đến các service này.

Chạy:

Terminal

docker compose up -d
docker logs cloudflared-tunnel
# Output: INF Connection established connIndex=0

Cài Đặt Native (Systemd) — Cho Server Không Có Docker

Terminal

# Tải và cài đặt cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \
  -o cloudflared.deb
sudo dpkg -i cloudflared.deb

# Cài đặt service với token từ dashboard
sudo cloudflared service install YOUR_TUNNEL_TOKEN

# Kiểm tra service
sudo systemctl status cloudflared
# Output: Active: active (running)

Windows (Cho PC/Homelab)

Command Prompt (Admin)

# Tải cloudflared từ GitHub releases
# Hoặc dùng lệnh cài đặt service từ dashboard:
cloudflared.exe service install YOUR_TUNNEL_TOKEN
✅ Kiểm tra: Quay lại dashboard Cloudflare → tunnel bạn vừa tạo sẽ hiện trạng thái HEALTHY và hiển thị uptime.

2 Gán Private IP Cho VPS

Đây là bước quan trọng mà nhiều hướng dẫn bỏ qua. VPS trên cloud (DigitalOcean, Vultr, Linode, v.v.) thường chỉ có public IP — không có private network interface.

Để routing qua Cloudflare Tunnel hoạt động, ta cần tạo virtual private IP trên mỗi server:

Terminal – Trên mỗi server

# Gán private IP cho server (chọn dải 10.100.0.x)
sudo ip addr add 10.100.0.1/32 dev lo

# Kiểm tra
ip addr show lo | grep 10.100
# Output: inet 10.100.0.1/32 scope global lo
⚠️ Quan trọng: Lệnh ip addr add chỉ tồn tại trong phiên hiện tại. Khi server reboot, IP sẽ mất. Bạn phải cấu hình persistent.

Cấu Hình Persistent (Tồn Tại Sau Reboot)

Trên Ubuntu/Debian sử dụng Netplan:

/etc/netplan/99-tunnel-private.yaml

network:
  version: 2
  ethernets:
    lo:
      addresses:
        - 10.100.0.1/32
Terminal

sudo netplan apply
# Verify
ip addr show lo | grep 10.100

Quy Hoạch IP Đề Xuất

Lập kế hoạch IP từ đầu giúp bạn mở rộng dễ dàng sau này:

Server Private IP Mục đích Tunnel Name
Production 10.100.0.1 Web server chính prod-server
Development 10.100.0.2 Server phát triển/staging dev-server
Database 10.100.0.3 PostgreSQL / MySQL db-server
Monitoring 10.100.0.4 Grafana, Prometheus monitoring
CI/CD Runner 10.100.0.5 GitHub Actions runner ci-runner
💡 Tại sao dùng dải 10.100.0.x? Đây là dải IP private (RFC 1918) không xung đột với Docker bridge (172.17.x.x) hay mạng LAN nhà bạn (192.168.x.x). Dùng /32 vì mỗi server chỉ cần đúng 1 IP.

3 Cấu Hình CIDR Routes Trên Dashboard

Bước này cho Cloudflare biết: “Khi ai đó truy cập IP 10.100.0.1, hãy gửi traffic đến tunnel prod-server”.

  1. Vào NetworksTunnels trên Cloudflare dashboard
  2. Click vào tunnel cần cấu hình (ví dụ: prod-server)
  3. Chọn tab CIDR routes
  4. Click + Add CIDR route
  5. Nhập CIDR: 10.100.0.1/32
  6. Save

Lặp lại cho mỗi server:

Tunnel CIDR Route
prod-server 10.100.0.1/32
dev-server 10.100.0.2/32

4 Thiết Lập Device Enrollment

Mặc định, Cloudflare Zero Trust chặn tất cả device enrollment. Bạn cần tạo policy cho phép device của mình đăng ký vào hệ thống.

⚠️ Nếu bỏ qua bước này: Khi đăng nhập WARP client, bạn sẽ gặp lỗi “Enrollment request is invalid”. Đây là lỗi phổ biến nhất khi setup Cloudflare Zero Trust.

Tạo Device Enrollment Policy

  1. Vào Team & ResourcesDevices
  2. Click tab Management
  3. Tìm section Device enrollment permissions
  4. Click Manage hoặc Add a rule
  5. Click + Create new policy
  6. Cấu hình:
  7. Save
💡 Mẹo bảo mật: Thay vì dùng “Everyone”, hãy chỉ cho phép email cụ thể. Nếu team có nhiều người, dùng selector “Emails ending in” với domain công ty (ví dụ: @tonytechlab.com).

5 Cài Đặt WARP Client Trên PC

WARP client biến PC của bạn thành một phần của mạng Zero Trust. Nó tạo một encrypted tunnel từ PC đến Cloudflare, cho phép bạn truy cập private IP của các server.

Phân Biệt: cloudflared vs WARP Client

Component Chức năng Ví dụ
cloudflared Tạo tunnel từ server đến Cloudflare Server expose service qua tunnel
WARP Client Kết nối PC đến Cloudflare để truy cập private network PC truy cập server qua private IP

Cả hai có thể chạy song song trên cùng một máy mà không xung đột.

Cài Đặt Trên Windows

  1. Tải Cloudflare WARP từ https://1.1.1.1/
  2. Cài đặt và mở ứng dụng
  3. Click vào icon WARP ở system tray → Settings (⚙️)
  4. Vào tab Account
  5. Click Login to Cloudflare Zero Trust
  6. Nhập Team name (tên tổ chức bạn đã tạo, ví dụ: tonytechlab)
  7. Xác thực qua email OTP hoặc SSO
  8. WARP sẽ hiển thị: “Zero Trust — Connected”
✅ Xác nhận: Trong WARP Preferences → General, bạn sẽ thấy:

  • Connection: WARP+
  • Account Type: Zero Trust
  • Team Name: tonytechlab

6 Cấu Hình Split Tunnel

Split Tunnel quyết định traffic nào đi qua Cloudflare và traffic nào đi trực tiếp ra internet. Đây là cấu hình then chốt để private IP routing hoạt động.

Cấu Hình Trên Dashboard

  1. Vào Team & ResourcesDevicesDevice profiles
  2. Click vào profile DefaultConfigure
  3. Cuộn xuống tìm section Split Tunnels
  4. Chọn mode: Include IPs and domains
  5. Click Manage
  6. Thêm entry:
    • Selector: IP Address
    • Value: 10.100.0.0/24
    • Description: Internal Tunnel Subnet
  7. Save destination
💡 Giải thích: Bằng cách dùng 10.100.0.0/24, bạn bao phủ toàn bộ 254 IP (10.100.0.1 → 10.100.0.254). Khi thêm server mới trong tương lai, bạn không cần chỉnh lại Split Tunnel.

7 Bật Proxy Cho ICMP/TCP/UDP

Mặc định, Cloudflare Gateway chỉ proxy TCP. Để ping và các diagnostic tools hoạt động, cần bật thêm ICMP và UDP.

  1. Vào Traffic policiesTraffic settings
  2. Chọn tab Proxy and inspection
  3. Bật “Allow Secure Web Gateway to proxy traffic”
  4. Đảm bảo check:
    • ☑️ TCP (required — luôn bật)
    • ☑️ UDP (recommended — cho DNS, VoIP)
    • ☑️ ICMP (recommended — cho ping, traceroute)
💡 Tại sao cần ICMP? Nếu không bật ICMP proxy, khi ping bạn sẽ thấy “TTL expired in transit” — traffic đến được Cloudflare nhưng không được forward đến server.

8 Kiểm Tra & Xác Nhận Kết Nối

Sau khi hoàn thành tất cả các bước trên, toggle WARP off rồi on trên PC để reload cấu hình mới.

Test Ping

Command Prompt / Terminal

C:\> ping 10.100.0.1

Pinging 10.100.0.1 with 32 bytes of data:
Reply from 10.100.0.1: bytes=32 time=33ms TTL=253
Reply from 10.100.0.1: bytes=32 time=34ms TTL=253
Reply from 10.100.0.1: bytes=32 time=33ms TTL=253

Ping statistics for 10.100.0.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)
    Average = 33ms
✅ Nếu bạn thấy “Reply from 10.100.0.x” — Chúc mừng! Traffic đang đi qua Cloudflare Tunnel thành công.

Test SSH

Terminal

# SSH đến Production server
ssh [email protected]

# SSH đến Development server
ssh [email protected]

# Test HTTP service (nếu có)
curl http://10.100.0.1:8088

🛡️ Bảo Mật Nâng Cao

Sau khi xác nhận mọi thứ hoạt động ổn định qua tunnel, hãy tăng cường bảo mật:

Đóng Port SSH Trên Firewall

Vì SSH đã hoạt động qua private IP (tunnel), bạn không cần mở port 22 ra internet nữa:

Terminal – Trên server

# Chỉ cho phép SSH từ tunnel subnet
sudo ufw default deny incoming
sudo ufw allow from 10.100.0.0/24 to any port 22
sudo ufw allow 80/tcp    # Nếu cần web traffic
sudo ufw allow 443/tcp   # Nếu cần HTTPS
sudo ufw enable
⚠️ Cẩn thận! Test SSH qua tunnel (ssh [email protected]) hoạt động ổn định ít nhất 2-3 lần trước khi đóng port 22. Nếu tunnel gặp sự cố và bạn đã đóng port, bạn sẽ bị lock out khỏi server. Giữ một console session mở từ cloud provider (VNC/KVM) như phương án backup.

Sơ Đồ Mạng Hoàn Chỉnh

Network Architecture

                    ┌──── Public Internet ────┐
                    │   tonytechlab.com        │
                    │   (chỉ web traffic)      │
                    └──────────────────────────┘
                               │
                          Cloudflare CDN/WAF
                          (DDoS Protection)
                               │
  ┌─────────── Cloudflare Tunnel Network (Encrypted) ──────────────┐
  │                                                                 │
  │   🖥️ PC (WARP)      🖧 Prod Server      🖧 Dev Server          │
  │   10.100.0.x    ←→   10.100.0.1    ←→   10.100.0.2            │
  │                                                                 │
  │   SSH ✅  HTTP ✅  Ping ✅  — tất cả qua encrypted tunnel      │
  │   Port 22 đóng │  Port 22 đóng │  Không port nào mở ra internet│
  └─────────────────────────────────────────────────────────────────┘

🔧 Xử Lý Sự Cố Thường Gặp

Vấn đề Nguyên nhân Giải pháp
“Enrollment request is invalid” Chưa tạo Device Enrollment policy Tạo policy ở Bước 4 — đây là lỗi phổ biến nhất
Ping: “Request timed out” ICMP proxy chưa bật Bật ICMP ở Bước 7
Ping: “TTL expired in transit” Split Tunnel chưa cấu hình hoặc Proxy chưa bật Kiểm tra Bước 6Bước 7
Ping: “could not find host” Split Tunnel chưa include dải IP Thêm 10.100.0.0/24 vào Split Tunnel Include list
SSH: “Connection refused” SSH không listen trên loopback interface Kiểm tra /etc/ssh/sshd_config — đảm bảo ListenAddress bao gồm 0.0.0.0 hoặc 10.100.0.x
Tunnel status: DOWN cloudflared service không chạy systemctl restart cloudflared hoặc docker restart cloudflared-tunnel
WARP: không kết nối Firewall trên PC chặn WARP Cho phép Cloudflare WARP trong Windows Firewall
Private IP mất sau reboot Chưa cấu hình netplan persistent Tạo file /etc/netplan/99-tunnel-private.yaml theo Bước 2

Kết Luận

Cloudflare Zero Trust biến mọi server của bạn thành “invisible servers” — không thể tìm thấy trên internet, nhưng bạn vẫn truy cập được từ bất kỳ đâu trên thế giới.

  • Zero open ports — server không lắng nghe bất kỳ kết nối inbound nào
  • End-to-end encryption — traffic mã hóa từ PC đến server
  • Centralized management — quản lý access qua dashboard trực quan
  • Full protocol support — SSH, HTTP, ping, TCP/UDP đều hoạt động
  • Free for small teams — miễn phí cho team dưới 50 người
  • Setup 30 phút — không cần kiến thức networking chuyên sâu

Hãy bắt đầu bảo vệ infrastructure của bạn ngay hôm nay! 🚀

Cloudflare
Zero Trust
Network Security
DevOps
VPN Alternative
Cloudflare Tunnel
WARP
Infrastructure