部署教程
架构
- WebTDS 系统由三个子系统组成
- WebTDS 控制台
- WebTDS 节点
- WebTDS 日志系统
部署
环境要求
服务器系统 Debian 12.x
服务器最低配置 4 核 8G
WebTDS控制台账号注册
访问 https://webtds.jxwaf.com 进行账号注册
账号需要使用动态口令进行二次验证,可以在微信上使用小程序 腾讯身份验证器 扫描页面上的二维码获取动态口令
完成注册并登录控制台后,点击 系统管理 -> 基础信息 页面,查看 wtds_auth,后续节点配置需要
WebTDS节点部署
系统部署
# 1. 安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 2. 克隆仓库(国内可以换成 https://gitclone.com/github.com/jx-sec/jxwaf.git)
git clone https://github.com/jx-sec/webtds.git
# 3. 启动容器
cd webtds/webtds_node
vim docker-compose.yml
修改文件中的 WTDS_AUTH , WTDS_AUTH 为 系统管理 -> 基础信息 中 wtds_auth 的值
docker compose up -d
启动后,可以在 运营中心 -> 节点状态 查看节点是否上线
系统升级
# 1. 进入节点部署目录
cd webtds/webtds_node
# 2. 更新github
git pull
# 3. 重启服务(镜像或配置未更新则保持原状)
docker compose up -d
卸载系统
# 1. 进入节点部署目录
cd webtds/webtds_node
# 2. 停止并删除容器
docker compose down
Docker Compose文件说明
services:
# Web威胁检测服务 (WebTDS)
wtds:
image: "ccr.ccs.tencentyun.com/jxwaf/wtds:v1.12"
# 使用主机网络模式(直接使用宿主机网络,绕过 Docker 的网络隔离)
network_mode: host
# 设置文件描述符限制(用于处理高并发连接)
ulimits:
nofile:
soft: 602400 # 软限制(进程可以自己提升到此值)
hard: 602400 # 硬限制(最大允许值)
# 环境变量配置
environment:
WTDS_SERVER: https://webtds.jxwaf.com # WebTDS 控制台地址
WTDS_AUTH: you_auth_key # WebTDS 认证密钥
CONF_DATA: 100m # 配置数据内存分配
INNER_DICT: 100m # 内部字典内存分配
GLOBAL_DICT: 100m # 全局字典内存分配
SYS_DATA: 100m # 系统数据内存分配
USER_DATA: 100m # 用户数据内存分配
SUPPRESS: 100m # 抑制规则内存分配
TZ: Asia/Shanghai # 时区设置为上海(北京时间)
# 重启策略:除非手动停止,否则始终重启
restart: unless-stopped
# TCP 端口转发服务
tcp-forwarder:
image: ccr.ccs.tencentyun.com/jxwaf/tcp-forwarder:v1
container_name: tcp-forwarder
# 环境变量配置
environment:
LISTEN_ADDR: 0.0.0.0:9988 # 监听地址(所有网卡的9988端口)
TARGET_ADDR: 127.0.0.1:9977 # 目标地址(转发到本地的9977端口)
# 使用主机网络模式
network_mode: host
# 重启策略:除非手动停止,否则始终重启
restart: unless-stopped
WebTDS日志服务部署
系统部署
# 1. 安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 2. 克隆仓库(国内可以换成 https://gitclone.com/github.com/jx-sec/jxwaf.git)
git clone https://github.com/jx-sec/webtds.git
# 3. 启动容器
cd webtds/webtds_jxlog
docker compose up -d
部署完成后,在控制台中 系统配置 -> 日志传输配置 完成如下配置
在 控制台 系统配置 -> 日志查询配置 完成如下配置,其中 ClickHouse 数据库的帐号密码可以在 docker-compose.yml 文件中修改
系统升级
# 1. 进入节点部署目录
cd webtds/webtds_jxlog
# 2. 更新github
git pull
# 3. 重启服务(镜像或配置未更新则保持原状)
docker compose up -d
卸载系统
# 1. 进入节点部署目录
cd webtds/webtds_jxlog
# 2. 停止并删除容器
docker compose down
# 3. 删除数据库文件(可选)
rm -rf /opt/wtds_data/clickhouse
Docker Compose文件说明
# 网络配置部分
networks:
clickhouse_network: # 自定义网络名称
driver: bridge # 使用桥接模式(默认Docker网络模式)
ipam: # IP地址管理配置
config:
- subnet: 172.60.0.0/24 # 指定子网范围(172.60.0.1-172.60.0.254)
# 服务定义部分
services:
# ClickHouse数据库服务
webtds_clickhouse:
container_name: webtds_clickhouse # 指定容器名称
image: "ccr.ccs.tencentyun.com/jxwaf/clickhouse-server:22.8.5-alpine" # 使用Alpine精简版镜像
ports: # 端口映射(宿主机端口:容器端口)
- "9000:9000" # ClickHouse原生TCP协议端口
- "9004:9004" # ClickHouse MYSQL兼容协议端口
environment: # 环境变量配置
CLICKHOUSE_DB: wtds # 默认数据库名称
CLICKHOUSE_USER: jxlog_user # 默认用户名
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 # 启用访问控制
CLICKHOUSE_PASSWORD: jxlog_password # 数据库密码
TZ: Asia/Shanghai # 时区设置(北京时间)
volumes: # 数据卷挂载(持久化存储)
- /opt/wtds_data/clickhouse:/var/lib/clickhouse # 将数据库文件保存在宿主机
restart: unless-stopped # 自动重启策略
networks: # 网络配置
clickhouse_network: # 使用自定义网络
ipv4_address: 172.60.0.10 # 指定固定IP地址
# JXLog日志收集服务
webtds_jxlog:
container_name: webtds_jxlog # 指定容器名称
image: "ccr.ccs.tencentyun.com/jxwaf/webtds-jxlog:v1.0" # 日志服务镜像
ports:
- "8866:8866" # 暴露日志收集端口
environment:
CLICKHOUSE: 172.60.0.10:9000 # 连接的ClickHouse地址(使用自定义网络内部IP)
DATABASE: wtds # 使用的数据库名称
USERNAME: jxlog_user # 数据库用户名
PASSWORD: jxlog_password # 数据库密码
TABLE: wtds_log # 默认写入的数据表
TCPSERVER: 0.0.0.0 # 监听所有网络接口
TZ: Asia/Shanghai # 时区设置(北京时间)
depends_on: # 依赖关系
- webtds_clickhouse # 确保ClickHouse服务先启动
restart: unless-stopped # 自动重启策略
networks:
clickhouse_network: # 使用相同的自定义网络
ipv4_address: 172.60.0.11 # 指定固定IP地址
效果验证
环境说明
JXWAF节点
外网地址: 47.120.34.247
内网地址: 172.29.198.240
WebTDS节点
外网地址: 47.120.67.55
内网地址: 172.29.198.242
开启WebTDS检测
在JXWAF控制台 系统管理 -> WebTDS检测配置 ,参考如下进行配置
配置WebTDS检测策略
目标: 简单的爬虫检测
检测逻辑: 在10分钟内,同一个IP地址,访问不同的HTML页面,且接口返回为200,访问的页面数量超过100即告警
检测策略配置:
检测策略 -> 内部字典配置:
检测策略 -> 策略规则配置:
- ip_diff_html_count
匹配条件1: 访问的是HTML页面
匹配条件2: 返回为200
匹配条件3: 当前IP在10分钟内(内部字典过期时间),未曾访问过当前HTML页面
匹配成功执行: 当前IP的HTML访问页面数量 +1
- ip_diff_html_check
匹配条件1: 访问的是HTML页面
匹配条件2: 返回为200
匹配条件3: 当前IP在10分钟内(内部字典过期时间),访问的HTML页面数量大于100
匹配成功执行: 策略检测成功
- html_log
匹配条件1: 访问的是HTML页面
匹配条件2: 返回为200
匹配成功执行: 记录当前IP访问的HTML页面,记录周期为10分钟(内部字典过期时间)
策略告警配置:
加载检测策略:
在 线上环境 -> 检测策略 中,点击 加载 ,选择 bot_check
验证检测策略效果
为方便验证效果,在JXWAF控制台中,设置WAF防护规则为匹配html后缀即阻断请求,同时将拦截页面的HTTP响应码设置为200
运行下面Python脚本进行测试:
import requests
base_url = "http://47.120.34.247/"
for i in range(1, 111): # 从1到110
url = f"{base_url}a{i}.html"
try:
response = requests.get(url)
print(f"访问 {url} - 状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"访问 {url} 时出错: {e}")
print("所有页面访问完成")
运行完成后,即可在运营中心查看检测结果
在 运营中心 -> 事件运营 查看
在 运营中心 -> 行为轨迹 查看