UUWAF 南墙:Docker 部署 Web 应用防火墙
本文属于「自托管 Docker 部署实战」系列(共 35 篇),第 5 篇。 示例中的 IP(192.0.2.10)、域名(example.com)、密码均为占位符,请按实际环境替换。
它是什么
UUWAF(南墙)是开源的 Web 应用防火墙:支持 CC 防护、SQL 注入/XSS 规则、人机验证、IP 黑白名单,带管理后台。
它由两个容器组成:uusec/waf 本体 + mysql:5.7.44 存配置和日志。
前置条件
- 一台 Linux 服务器(2C2G 起);
- 已安装 Docker 与 Compose v2;
- 需要一个 Docker 网络
uuwaf_default(安装脚本会创建,手工部署时自己建)。
curl -fsSL https://get.docker.com | sh
docker network create uuwaf_default
mkdir -p /srv/docker/active/uuwaf && cd /srv/docker/active/uuwaf
镜像地址
uusec/waf
mysql:5.7.44
目录结构
/srv/docker/active/uuwaf/
├── docker-compose.yml
├── .env
├── waf_config/ # WAF 配置
├── waf_acme/ # ACME 证书
├── waf_data/ # MySQL 数据
└── waf_logs/ # WAF 日志
部署步骤
cat > .env <<'EOF'
UUWAF_MYSQL_PASSWORD=<强密码>
MYSQL_ROOT_PASSWORD=<强密码>
EOF
chmod 600 .env
# docker-compose.yml
services:
uuwaf:
image: uusec/waf
container_name: uuwaf
restart: unless-stopped
ulimits:
nproc: 65535
nofile:
soft: 102400
hard: 102400
networks:
- uuwaf_default
ports:
- "880:80"
- "666:443"
- "4443:4443"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./waf_config:/uuwaf/web/conf
- ./waf_acme:/uuwaf/acme
- ./waf_logs:/uuwaf/logs
environment:
- TZ=Asia/Shanghai
- UUWAF_MYSQL_PASSWORD=${UUWAF_MYSQL_PASSWORD}
- UUWAF_RESOLVER=resolver 127.0.0.11 valid=30s ipv6=off;
depends_on:
wafdb:
condition: service_healthy
wafdb:
image: mysql:5.7.44
container_name: uuwaf-db
restart: unless-stopped
networks:
- uuwaf_default
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./waf_data:/var/lib/mysql
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
command: ["--max_connections=512"]
healthcheck:
test: ["CMD", "mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping", "-h", "127.0.0.1", "--silent"]
start_period: 3s
interval: 5s
timeout: 3s
retries: 10
networks:
uuwaf_default:
external: true
docker compose up -d
docker compose ps
管理后台:http://<SERVER_IP>:4443(或按版本提示的端口)。
关键配置
| 项 | 说明 |
|---|---|
880:80 / 666:443 |
WAF 对外代理端口,避开宿主 80/443 |
4443 |
管理后台 |
uuwaf_default |
外部网络,必须提前存在 |
| MySQL 5.7 | 只做配置/日志存储,已 EOL,注意隔离 |
./waf_data |
数据库目录,必须备份 |
注意事项
- 80/443 被 Nginx/雷池占用时,用 880/666 接流量,前面再加一层反代;
- MySQL 5.7 已停止维护,仅在内网运行,不要暴露 3306;
- 管理后台默认账号密码首次登录后立刻改;
- 数据库密码不要像示例那样同时出现在 compose 与健康检查里,改用环境变量;
- WAF 规则误杀很常见,先开观察模式再切拦截;
- 数据都在
waf_data与waf_config,升级前停服备份。
备份与升级
docker compose stop
tar czf "uuwaf-$(date +%F).tar.gz" .env waf_config waf_data waf_acme
docker compose start
docker compose pull
docker compose up -d
- 升级跨版本时先看官方说明,MySQL 数据目录不保证向下兼容。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果