本文属于「自托管 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 数据目录不保证向下兼容。