Ẩn IP máy chủ với Nginx Proxy Manager và Cloudflare

P P T P Chung

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/tcp443/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/letsencrypt

Sau khi chạy:

docker compose up -d

Truy 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: Proxied

Biể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: Proxied

Với wildcard:

Type: CNAME
Name: *
Target: example.com
Proxy status: Proxied

Lư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 CertificatesAdd SSL CertificateLet’s Encrypt.

Nhập:

Domain Names: app.example.com
Email: [email protected]
Use DNS Challenge: tùy chọn

Nế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.com

Copy 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ần

Nếu app chạy ngoài Docker:

Forward Hostname/IP: 127.0.0.1
Forward Port: 3000

Tab 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-v6

Ví 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_IP

Kế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_IP

Mở:

http://127.0.0.1:8081

Nế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ạn

Khi 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/auth

Ví 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 Mode

Như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_IP

Bạ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.com

Thườ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.

Tác giả

P T P

Chia sẻ

Bài viết liên quan

Bình luận (0)

Email của bạn sẽ không được hiển thị công khai.

Chưa có bình luận. Hãy là người đầu tiên!