Tự host thích tự do. Internet thích quét cổng.
Bạn dựng Jellyfin, Home Assistant, Nextcloud, Grafana, Gitea trong nhà/lab vì muốn kiểm soát dữ liệu, tối ưu chi phí, học hạ tầng thật. Vấn đề: app nội bộ muốn truy cập từ ngoài → phải mở cửa ra Internet. Cửa mở sai cách → bot quét, brute-force, lộ IP nhà, lỗi TLS, cấu hình reverse proxy hớ hênh, 1 CVE nhỏ → thành sự cố lớn.
Tin tốt: không cần chọn giữa tiện và an toàn. Mô hình đúng thường là:
– Cloudflare → che IP, DNS, WAF/CDN, TLS ngoài biên
– VPN → khóa app nhạy cảm, chỉ người có tunnel mới vào
– HTTPS → mã hóa đầu-cuối, tránh đăng nhập/plaintext, tăng tin cậy
Bài này đi thẳng vào cách ghép 3 lớp đó thành kiến trúc thực dụng cho self-hosted app.
Tư duy nền: không phải app nào cũng nên public
Sai lầm phổ biến: có domain → public mọi thứ qua reverse proxy. Thực tế nên chia 3 nhóm:
1. App công khai
Ví dụ: blog cá nhân, trang giới thiệu, status page public.
– Có thể public qua Cloudflare
– Bắt buộc HTTPS
– Nên thêm rate limit, WAF rule, cập nhật định kỳ
2. App có tài khoản nhưng vẫn cần truy cập từ mọi nơi
Ví dụ: Nextcloud, Vaultwarden, Immich.
– Public qua Cloudflare
– HTTPS end-to-end
– Nên thêm SSO, MFA, Access policy, fail2ban/ratelimit phía origin
3. App chỉ nên private
Ví dụ: Proxmox, Portainer, NAS admin, router UI, database admin, Home Assistant admin panel.
– Không public trực tiếp
– Chỉ cho vào qua VPN
– Nếu cần web đẹp, dùng Cloudflare Access hoặc tunnel + policy, nhưng mặc định vẫn nên private-first
Nguyên tắc ngắn: user app có thể public; admin app gần như luôn nên qua VPN.
Kiến trúc khuyến nghị: public tối thiểu, private mặc định
Mô hình an toàn, dễ vận hành:
– Cloudflare DNS + Proxy cho app public
– Reverse proxy tại nhà/VPS: Nginx Proxy Manager, Caddy, Traefik, Nginx
– HTTPS giữa client ↔ Cloudflare, tốt hơn nữa cả Cloudflare ↔ origin
– VPN như Tailscale, WireGuard, ZeroTier cho app quản trị
– Firewall chỉ mở cổng cần thiết
– Tách subnet/container nếu có thể
Luồng chuẩn:
1. User mở https://app.example.com
2. DNS trỏ qua Cloudflare
3. Cloudflare xử lý TLS, lọc bớt request xấu
4. Request đi về reverse proxy/origin của bạn
5. Reverse proxy chuyển tiếp vào app nội bộ
Luồng private:
1. User bật VPN
2. Thiết bị vào mạng riêng ảo
3. Truy cập https://homeassistant.tailnet hoặc IP nội bộ
4. Không ai ngoài VPN nhìn thấy app
Kết quả: dịch vụ cần public thì public đúng cách; phần quản trị vẫn kín.
Vai trò thật sự của Cloudflare: lá chắn ngoài biên, không phải “bùa miễn nhiễm”
Cloudflare hữu ích vì 4 lý do:
Ẩn IP gốc
Nếu DNS bật proxy, client thấy IP Cloudflare, không thấy trực tiếp IP nhà/VPS của bạn. Điều này giảm quét trực diện, giảm lộ bề mặt tấn công.
TLS dễ hơn
Cloudflare hỗ trợ chứng chỉ phía edge rất tiện. User luôn thấy HTTPS hợp lệ.
WAF, rate limiting, bot mitigation
Không thay thế hardening app, nhưng chặn được lượng lớn traffic rác.
Cloudflare Tunnel / Access
Hữu ích khi:
– Không muốn mở port trên router
– ISP dùng CGNAT
– Muốn public app mà không lộ origin trực tiếp
– Muốn thêm lớp xác thực trước khi tới app
Nhưng cần nhớ: Cloudflare không vá hộ app lỗi thời. Origin yếu → vẫn nguy hiểm. Nếu kẻ tấn công tìm ra IP gốc, bypass Cloudflare → bạn mất một lớp bảo vệ.
Fix quan trọng:
– Chỉ cho phép traffic từ Cloudflare IP vào reverse proxy nếu public qua proxy
– Chặn truy cập trực tiếp vào origin
– Không publish cổng admin riêng lẻ
VPN: lớp bảo vệ đáng giá nhất cho app nhạy cảm
Nếu chỉ chọn 1 thứ để bảo vệ self-hosted admin services, chọn VPN.
Vì sao?
Giảm bề mặt tấn công gần về 0
Không có login page public → bot không brute-force được.
Đơn giản hơn SSO/public hardening
Thay vì bảo vệ 10 app admin riêng, bạn bảo vệ 1 cổng vào: VPN.
Trải nghiệm tốt
WireGuard/Tailscale hiện rất nhanh, ổn định, chạy tốt trên điện thoại/laptop.
Khuyến nghị thực dụng:
– Tailscale → dễ nhất, hợp homelab, NAT traversal tốt
– WireGuard tự host → kiểm soát tối đa, nhẹ, nhanh
– ZeroTier → linh hoạt, nhưng thường mình ưu tiên Tailscale/WireGuard hơn
App nên để sau VPN:
– Proxmox
– TrueNAS/Unraid admin
– Portainer
– Home Assistant admin
– SSH
– Router/switch/AP dashboard
– Grafana/Loki/Prometheus admin
– phpMyAdmin, pgAdmin, Redis UI
Mẫu quyết định ngắn:
– Gia đình dùng media/photos/files → public có kiểm soát
– Hạ tầng/quản trị → VPN only
HTTPS: không chỉ “ổ khóa xanh”, mà là nền tảng tin cậy
Nhiều người thấy có Cloudflare rồi nghĩ origin HTTP cũng được. Sai ở mức vận hành dài hạn.
HTTPS giúp gì?
– Mã hóa đăng nhập, cookie, API traffic
– Chống MITM
– Bật secure cookie
– Ổn định redirect/callback OAuth
– Giảm lỗi mixed content
– Tạo chuẩn thống nhất cho reverse proxy/app
Chế độ TLS với Cloudflare
Nếu dùng Cloudflare proxy, ưu tiên:
– Full (Strict) → tốt nhất
Cloudflare ↔ origin cũng xác thực chứng chỉ hợp lệ.
Tránh:
– Flexible → Cloudflare ↔ origin là HTTP. Dễ sinh loop, sai mô hình bảo mật.
Bạn có thể dùng:
– Let’s Encrypt tại origin
– Hoặc Cloudflare Origin Certificate nếu chỉ cần Cloudflare tin origin đó
Nguyên tắc: HTTPS cả ngoài biên lẫn nội bộ reverse path nếu có thể.
Cấu hình tối thiểu nên có
Dù stack nào, checklist nên gồm:
Reverse proxy
– Host theo domain riêng: app.example.com
– Force HTTPS
– Bật WebSocket nếu app cần
– Giới hạn upload/timeout đúng nhu cầu
– Ghi log đầy đủ
DNS
– Public app → record proxied qua Cloudflare
– Private app → không public DNS, hoặc chỉ split-DNS/VPN DNS
Firewall/NAT
– Chỉ mở 443
– 80 chỉ dùng redirect/ACME nếu cần
– Không mở 22, 8080, 8123, 9000, 9443 ra Internet trừ khi thật sự hiểu rủi ro
Auth
– Mật khẩu mạnh
– MFA nếu app hỗ trợ
– Tách tài khoản admin/user
– Vô hiệu default account
Update
– Vá OS, container image, app
– Theo dõi CVE của app chính
– Backup trước update lớn
Backup
– Config reverse proxy
– DB/app data
– Secrets/keys
– Kiểm tra restore thật, không chỉ “có file backup”
Mô hình triển khai gợi ý theo mức độ an toàn
Mức 1: Đủ tốt cho đa số homelab
– Cloudflare DNS + proxy
– Reverse proxy
– HTTPS Full (Strict)
– Tất cả app admin qua Tailscale/WireGuard
– Chỉ app người dùng mới public
Đây là điểm cân bằng tốt nhất giữa dễ dùng và an toàn.
Mức 2: An toàn hơn
– Tách máy/VM cho reverse proxy
– Firewall chỉ nhận IP Cloudflare với public service
– Cloudflare Access cho một số app web
– IDS/logging cơ bản
– VLAN/subnet riêng cho server
Mức 3: Khắt khe
– Cloudflare Tunnel thay port-forward
– mTLS hoặc device posture check
– SSO trung tâm
– Secret manager
– Giám sát, cảnh báo, immutable backup
Đa số cá nhân không cần tới mức 3 ngay. Quan trọng hơn: làm đúng mức 1 trước.
Sai lầm phổ biến
– Public dashboard quản trị vì “đã có mật khẩu”
– Dùng Flexible SSL
– Mở quá nhiều cổng trên router
– Để app lỗi thời nhiều tháng
– Dùng 1 domain/subdomain bừa bãi, không phân loại public/private
– Không chặn truy cập origin trực tiếp
– Không có backup restore-tested
– Tin rằng Cloudflare = an toàn tuyệt đối
Kết luận: an toàn không đến từ 1 công cụ, mà từ phân lớp đúng
Cách đưa self-hosted app lên Internet an toàn không phải “bật Cloudflare là xong”. Mô hình bền vững là:
– Cloudflare cho lớp ngoài biên: DNS, TLS, che IP, lọc request
– VPN cho app nhạy cảm: giảm bề mặt tấn công mạnh nhất
– HTTPS cho toàn bộ đường đi: mã hóa, tin cậy, vận hành chuẩn hóa
Nếu cần một nguyên tắc để nhớ lâu:
– Public ít nhất có thể
– Admin luôn qua VPN
– HTTPS ở mọi nơi
– Cloudflare là lá chắn, không phải giấy miễn trừ cấu hình kém
Làm đúng 4 ý đó, self-hosted của bạn sẽ vừa tiện truy cập từ xa, vừa khó trở thành “mồi ngon” cho Internet.