Cấu hình Nginx Proxy Manager với Cloudflare để tăng bảo mật và ẩn IP máy chủ
Bạn tự host website, app nội bộ, dashboard, API cá nhân? Rất tiện. Nhưng nếu cấu hình hở, IP thật của máy chủ có thể bị lộ, bot quét port liên tục, brute-force admin panel, DDoS nhỏ cũng đủ làm nghẽn mạng nhà/VPS. Combo Cloudflare + Nginx Proxy Manager giúp giảm mạnh rủi ro: Cloudflare đứng trước nhận traffic, Nginx Proxy Manager reverse proxy vào dịch vụ phía sau, IP origin được che, TLS dễ quản lý, rule bảo mật dễ bật.
Mục tiêu bài này: cấu hình thực tế để ẩn IP máy chủ, chỉ cho Cloudflare truy cập origin, bật SSL đúng cách, giảm bề mặt tấn công.
Tổng quan mô hình
Luồng chuẩn:
User → Cloudflare → Nginx Proxy Manager → App nội bộVí dụ:
– Domain: app.example.com
– Cloudflare quản lý DNS
– Nginx Proxy Manager chạy trên VPS/home server
– App thật chạy ở 127.0.0.1:3000 hoặc container Docker nội bộ
Cloudflare sẽ public IP của họ. Người dùng không thấy IP origin nếu DNS bật proxy cam.
Nginx Proxy Manager xử lý:
– Reverse proxy nhiều domain/subdomain – Cấp/chọn SSL – Forward vào service nội bộ – Thêm access list, basic auth, header, redirect
Điều kiện cần trước khi bắt đầu
Bạn cần:
– Domain đã trỏ nameserver về Cloudflare
– Server có Docker hoặc Nginx Proxy Manager đã chạy
– Port public tối thiểu:
– 80/tcp
– 443/tcp
– Quyền chỉnh firewall server
– App backend đang chạy ổn trong LAN/container
Ví dụ docker-compose.yml tối giản cho Nginx Proxy Manager:
services:
npm:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencryptSau khi chạy:
docker compose up -dTruy cập admin:
http://SERVER_IP:81Đăng nhập lần đầu, đổi email/mật khẩu ngay.
Cấu hình DNS Cloudflare đúng cách
Trong Cloudflare → DNS → thêm record:
Type: A
Name: app
IPv4: SERVER_IP
Proxy status: ProxiedBiểu tượng phải là mây cam. Nếu mây xám, Cloudflare chỉ làm DNS, IP origin vẫn lộ trực tiếp.
Với root domain:
Type: A
Name: @
IPv4: SERVER_IP
Proxy status: ProxiedVới wildcard:
Type: CNAME
Name: *
Target: example.com
Proxy status: ProxiedLưu ý: Cloudflare proxy chỉ áp dụng tốt cho HTTP/HTTPS. Nếu bạn expose SSH, game server, database trực tiếp qua DNS thường, IP vẫn có thể lộ.
Thiết lập SSL/TLS trên Cloudflare
Vào SSL/TLS → Overview.
Chọn:
Full (strict)Không dùng Flexible. Flexible nghĩa là user đến Cloudflare có HTTPS, nhưng Cloudflare về origin bằng HTTP. Dễ gây redirect loop, giảm bảo mật, sai mô hình.
Các lựa chọn:
– Flexible: tránh. – Full: mã hóa origin nhưng không xác thực cert nghiêm. – Full (strict): tốt nhất, yêu cầu cert hợp lệ ở origin.
Bạn có 2 cách cấp cert origin:
Cách 1: Let’s Encrypt trong Nginx Proxy Manager
Trong NPM → SSL Certificates → Add SSL Certificate → Let’s Encrypt.
Nhập:
Domain Names: app.example.com
Email: [email protected]
Use DNS Challenge: tùy chọnNếu port 80 mở và Cloudflare proxy hoạt động, HTTP challenge có thể dùng được. Nhưng với Cloudflare, DNS challenge thường ổn định hơn.
Cách 2: Cloudflare Origin Certificate
Cloudflare → SSL/TLS → Origin Server → Create Certificate.
Chọn hostname:
*.example.com
example.comCopy certificate và private key. Trong NPM, thêm custom certificate.
Ưu điểm: sống lâu, hợp với Full strict. Nhược: chỉ được Cloudflare tin, trình duyệt truy cập thẳng IP/domain bypass sẽ báo lỗi. Đây lại là điểm tốt nếu mục tiêu là bắt traffic đi qua Cloudflare.
Tạo Proxy Host trong Nginx Proxy Manager
Vào NPM → Hosts → Proxy Hosts → Add Proxy Host.
Tab Details:
Domain Names: app.example.com
Scheme: http
Forward Hostname/IP: app
Forward Port: 3000
Cache Assets: tùy
Block Common Exploits: bật
Websockets Support: bật nếu app cầnNếu app chạy ngoài Docker:
Forward Hostname/IP: 127.0.0.1
Forward Port: 3000Tab SSL:
– Chọn certificate – Bật Force SSL – Bật HTTP/2 Support – Bật HSTS nếu chắc chắn site luôn HTTPS
Cẩn thận với HSTS. Nếu bật sai trên domain đang cần HTTP cho service khác, trình duyệt sẽ ép HTTPS, khó debug.
Chặn truy cập trực tiếp, chỉ cho Cloudflare vào origin
Đây là bước quan trọng nhất để ẩn IP thật. Nếu port 80/443 vẫn nhận từ mọi nơi, ai biết IP origin vẫn bypass Cloudflare được.
Cần firewall: chỉ allow IP Cloudflare vào port 80/443.
Cloudflare public IP list:
https://www.cloudflare.com/ips-v4
https://www.cloudflare.com/ips-v6Ví dụ với UFW:
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow from 173.245.48.0/20 to any port 80 proto tcp
ufw allow from 173.245.48.0/20 to any port 443 proto tcp
Bạn phải thêm đủ toàn bộ dải IPv4/IPv6 của Cloudflare. Không chỉ một dòng mẫu trên.
Nếu dùng script, nên tự động cập nhật định kỳ vì IP Cloudflare có thể thay đổi.
Sau khi cấu hình, test:
curl -I https://app.example.com
curl -I http://SERVER_IPKết quả mong muốn:
– Domain qua Cloudflare: trả 200, 301, hoặc response app.
– Truy cập trực tiếp IP: bị timeout/refused/forbidden.
Nếu dùng IPv6 trên VPS, đừng quên chặn cả IPv6. Rất nhiều máy “ẩn IPv4” nhưng lộ IPv6 origin.
Bảo vệ dashboard Nginx Proxy Manager
Port 81 là admin UI. Không public nó ra Internet nếu không cần.
Tốt nhất:
– Không expose port 81 public – Chỉ access qua VPN/Tailscale/WireGuard – Hoặc bind local/private network
Ví dụ trong Docker Compose, chỉ bind localhost:
ports:
- "80:80"
- "443:443"
- "127.0.0.1:81:81"Khi cần truy cập từ máy cá nhân:
ssh -L 8081:127.0.0.1:81 user@SERVER_IPMở:
http://127.0.0.1:8081Nếu buộc phải public admin UI, ít nhất:
– Dùng subdomain riêng
– Bật Cloudflare Access
– Bật 2FA nếu app hỗ trợ
– Dùng mật khẩu mạnh
– Giới hạn IP
– Không dùng path dễ đoán như /admin để thay thế bảo mật thật
Dùng Cloudflare Access cho app nhạy cảm
Với dashboard nội bộ như Portainer, Grafana, Uptime Kuma, Home Assistant, nên đặt thêm lớp xác thực trước app.
Cloudflare → Zero Trust → Access → Applications → Add application.
Chọn:
Self-hosted
Domain: grafana.example.com
Policy: Allow email của bạnKhi user truy cập, Cloudflare yêu cầu login Google/GitHub/OTP trước, rồi mới forward về origin.
Lợi ích:
– App chưa nhận traffic nếu chưa auth – Giảm brute-force – Không cần tự viết auth – Log truy cập rõ hơn
NPM vẫn proxy như thường. Cloudflare Access nằm trước NPM.
Hardening thêm trong Cloudflare
Một số thiết lập nên bật:
WAF Managed Rules
Cloudflare → Security → WAF.
Bật managed rules nếu plan hỗ trợ. Chặn nhiều payload phổ biến: SQLi, XSS, scanner pattern.
Bot Fight Mode
Cloudflare → Security → Bots.
Bật để giảm bot rác cơ bản. Với site có API nhạy, cần rule riêng để tránh chặn nhầm client hợp lệ.
Rate Limiting
Tạo rule giới hạn endpoint nhạy cảm:
/login
/wp-login.php
/api/authVí dụ: quá nhiều request/phút → challenge/block.
Page Rules hoặc Redirect Rules
Ép HTTPS, redirect www ↔ non-www, chặn path không dùng.
DDoS Protection
Cloudflare tự có lớp chống DDoS L3/L4/L7 cơ bản. Khi bị tấn công, có thể bật:
Under Attack ModeNhưng không nên bật thường trực nếu ảnh hưởng UX.
Tránh làm lộ IP origin
Các lỗi phổ biến:
– DNS record mây xám
– Subdomain cũ vẫn trỏ thẳng IP
– Mail server cùng IP với web server
– App gửi email để lộ header IP
– Expose SSH/database/game server cùng IP
– IPv6 không qua Cloudflare
– Certificate Transparency log gợi ý subdomain origin
– Backup domain như direct.example.com trỏ thẳng server
Cách giảm rủi ro:
– Kiểm tra toàn bộ DNS record
– Dùng IP riêng cho mail nếu cần
– Chặn 80/443 ngoài Cloudflare
– Không đặt subdomain origin, direct, server
– Tắt IPv6 nếu không dùng hoặc firewall đúng
– Không public service không cần public
Kiểm tra sau cấu hình
Dùng các lệnh:
dig app.example.com
curl -I https://app.example.com
curl -I http://SERVER_IP
nmap -Pn SERVER_IPBạn muốn thấy domain trả IP Cloudflare, không phải IP server.
Có thể kiểm tra header:
curl -I https://app.example.comThường thấy:
server: cloudflare
cf-cache-status: ...
cf-ray: ...Nếu dig trả IP thật, DNS chưa proxy hoặc record sai.
Kết luận thực tế
Cloudflare + Nginx Proxy Manager là bộ đôi rất mạnh cho self-hosting: dễ quản lý domain, SSL, reverse proxy, đồng thời tăng bảo mật đáng kể. Nhưng “bật mây cam” chưa đủ. Điểm quyết định là origin firewall: chỉ cho Cloudflare truy cập port 80/443.
Checklist ngắn:
– DNS Cloudflare bật proxy – SSL dùng Full (strict) – NPM có cert hợp lệ – Proxy Host bật Force SSL – Firewall chỉ allow IP Cloudflare – Admin NPM không public – App nhạy cảm dùng Cloudflare Access – Kiểm tra IPv4/IPv6, DNS cũ, service phụ
Làm đúng các bước này, IP máy chủ khó bị lộ hơn, bot bị chặn từ lớp ngoài, hệ thống gọn hơn, an toàn hơn, dễ vận hành hơn.
Bình luận (0)
Chưa có bình luận. Hãy là người đầu tiên!