Nếu bạn đang muốn cài BunkerWeb để đứng trước Laravel/WordPress/Nginx như một WAF + reverse proxy, mình khuyên đi theo Docker Compose trước. Cách này dễ rollback, dễ nâng cấp và không làm rối Nginx hiện tại.
BunkerWeb về bản chất sẽ đứng ở phía trước:
Internet │ ▼ BunkerWeb (WAF / Rate limit / Bot protection / TLS) │ ▼ Nginx / Laravel / WordPress / App
BunkerWeb được thiết kế để bảo vệ các web application thông qua reverse proxy và có các integration cho Docker, Kubernetes, Linux..
1. Cài Docker
Nếu server Ubuntu/Debian đã có Docker thì kiểm tra:
docker --version docker compose version
Ví dụ:
Docker version 28.x Docker Compose version v2.x
Nếu chưa có Docker, có thể cài Docker trước.
2. Mô hình mình khuyên dùng
Ví dụ bạn có Laravel:
Internet ↓ :80 / :443 ↓ BunkerWeb ↓ Laravel container ↓ PHP-FPM ↓ MySQL
Ta tạo một network riêng:
docker network create bw-services
BunkerWeb và app Laravel cùng nằm trong network này.
Điểm quan trọng là không expose port của Laravel ra Internet.
Ví dụ:
ports: - "127.0.0.1:8000:80"
thậm chí tốt hơn là không ports luôn, chỉ:
networks: - bw-services
BunkerWeb sẽ truy cập app bằng tên container.
3. Cài BunkerWeb bằng Docker Compose
Tạo thư mục:
mkdir -p ~/bunkerweb cd ~/bunkerweb
Tạo:
nano docker-compose.yml
Bản đơn giản:
services: bunkerweb: image: bunkerity/bunkerweb:1.6.15 container_name: bunkerweb restart: unless-stopped ports: - "80:8080" - "443:8443" - "443:8443/udp" volumes: - bw-data:/data networks: - bw-services environment: SERVER_NAME: example.com USE_REVERSE_PROXY: "yes" REVERSE_PROXY_URL: / REVERSE_PROXY_HOST: http://app volumes: bw-data: networks: bw-services: external: true
BunkerWeb hiện có image Docker chính thức và tài liệu quickstart cũng sử dụng mô hình container + Docker network + reverse proxy như trên
Lưu ý: tag 1.6.15 là phiên bản stable được trang tài liệu hiện tại hiển thị trong ví dụ AIO. Nếu triển khai production, mình sẽ kiểm tra release stable hiện tại rồi pin đúng version thay vì dùng latest.
4. App Laravel
Ví dụ app của bạn tên:
app
và app chạy port:
80
Compose có thể là:
services: app: image: nginx:alpine container_name: app networks: - bw-services bunkerweb: image: bunkerity/bunkerweb:1.6.15 container_name: bunkerweb restart: unless-stopped ports: - "80:8080" - "443:8443" - "443:8443/udp" volumes: - bw-data:/data networks: - bw-services environment: SERVER_NAME: example.com USE_REVERSE_PROXY: "yes" REVERSE_PROXY_URL: / REVERSE_PROXY_HOST: http://app volumes: bw-data: networks: bw-services: external: true
Sau đó:
docker compose up -d
Kiểm tra:
docker ps
và:
docker logs bunkerweb5. DNS
Giả sử domain:
example.comDNS:
example.com ↓ SERVER_IPVí dụ:
A example.com 123.123.123.123Lúc này:
https://example.com ↓ Server :443 ↓ BunkerWeb :8443 ↓ appBunkerWeb mặc định trong Docker nhận HTTP ở
8080và HTTPS ở8443,vì vậy ta map ra
80/443của host
6. HTTPS / SSL
Đây là một phần rất đáng dùng BunkerWeb.
BunkerWeb có thể quản lý HTTPS/Let's Encrypt thay vì bạn phải tự cấu hình certificate thủ công trong Nginx.
Ví dụ cấu hình HTTPS/Let's Encrypt sẽ dựa trên các setting của BunkerWeb.
Bạn có thể cấu hình:
SERVER_NAME=example.com
và bật Let's Encrypt.
Khi đó flow sẽ là:
Client │ │ HTTPS ▼ BunkerWeb │ │ HTTP nội bộ ▼ Laravel
Certificate nằm ở tầng BunkerWeb.
7. BunkerWeb bảo vệ được những gì?
Đây mới là phần đáng quan tâm.
BunkerWeb không chỉ là reverse proxy.
Nó có thể dùng để:
WAF
Ví dụ request:
GET /index.php?id=' OR 1=1 --
BunkerWeb có thể phát hiện request có dấu hiệu SQL injection.
XSS
Ví dụ:
<script>alert(1)</script>
request có thể bị WAF kiểm tra.
Rate limiting
Ví dụ API:
/api/login
Bạn có thể giới hạn:
100 requests / phút / IP
để giảm brute-force.
Bot protection
Có thể thiết lập các cơ chế kiểm soát bot/request đáng ngờ.
IP restrictions
Ví dụ:
/admin
chỉ cho phép:
1.2.3.4 5.6.7.8
Security headers
Có thể cấu hình những header như:
X-Frame-Options X-Content-Type-Options Content-Security-Policy Strict-Transport-Security8. Một cấu hình rất đáng dùng cho Laravel
Ví dụ:
example.comWebsite:
/API:
/api/*Admin:
/admin/*Mình sẽ chia bảo vệ:
BunkerWeb │ ┌──────────┼──────────┐ │ │ │ ▼ ▼ ▼ / /api /admin │ │ │ Laravel Laravel LaravelVí dụ
/login:Internet ↓ BunkerWeb ↓ WAF ↓ Rate limit ↓ LaravelNhư vậy nếu bot spam:
POST /login POST /login POST /login ...thì BunkerWeb có thể chặn/giới hạn trước khi request đến PHP/Laravel.
9. Nếu bạn có nhiều website
Đây là chỗ BunkerWeb rất tiện.
Ví dụ server có:
site1.com site2.com api.example.com admin.example.comCó thể:
BunkerWeb │ ┌───────────────┼────────────────┐ │ │ │ ▼ ▼ ▼ site1.com site2.com api.example.com │ │ │ app1 app2 api
BunkerWeb hỗ trợ multisite, với
SERVER_NAMEcó thể khai báo nhiều virtual hosts10. Có Web UI
BunkerWeb cũng có Web UI để quản lý cấu hình.
Tài liệu hiện tại có hướng dẫn Web UI riêng; với Docker,
UI và các service có thể được triển khai trong stack của BunkerWeb
Điều này tiện hơn việc phải nhớ hàng đống environment variable.
11. Một điểm rất quan trọng: đừng expose app
Ví dụ không nên:
app: ports: - "80:80"nếu BunkerWeb đã đứng trước. Vì lúc đó attacker có thể:
Internet │ ├────────→ BunkerWeb ──→ Laravel │ └────────→ Laravel trực tiếp ❌
WAF bị bypass.
Nên:
app: networks: - bw-servicesvà:
bunkerweb: ports: - "80:8080" - "443:8443"Flow sẽ thành:
Internet │ ▼ BunkerWeb │ ▼ Docker network │ ▼ Laravel12. Với hệ thống của bạn
Nếu bạn đang làm Laravel/PHP, mình nghĩ cách học BunkerWeb hiệu quả nhất
không phải cài một đống tính năng ngay.
Nên đi theo 4 bước:
Bước 1 BunkerWeb ↓ LaravelSau khi chạy được:
Bước 2 HTTPS + Let's EncryptSau đó:
Bước 3 WAF + ModSecurity / CRSCuối cùng:
Bước 4 Rate limit + Bot protection + IP rules + Security headersĐặc biệt nếu hệ thống của bạn có API/login/admin thì bước 4 rất đáng làm.
BunkerWeb cũng khuyến nghị bật global CRS trong một số môi trường production/ít
RAM để giảm footprint của CRS rules