从零搭建本地 AI 安全测试平台(二):Ubuntu 26.04 + Ollama + Qwen3:14B + Nmap 实战
本文是上一篇《Ubuntu 26.04 Docker 四大漏洞靶场部署实战》的续篇,记录 AI 分析主机部署、SSH 隧道、自动化扫描和本地大模型报告生成的过程。仅针对自建授权实验环境。
一、目标与整体架构
传统扫描工具负责获取事实证据,本地大模型负责分析和生成报告。先实现最小闭环:HTTP/Nmap 采集 → JSON 证据 → Ollama/Qwen3:14B 分析 → Markdown 报告。
| 组件 | A:AI 分析主机 | B:漏洞靶场主机 |
|---|---|---|
| 系统 | Ubuntu 26.04.1 | Ubuntu 26.04.1 |
| 主机 | javen03-ub2604 | yj2-Ubuntu2 |
| 地址 | A 主机局域网 IP | 192.168.18.237 |
| 配置 | i7-1165G7、约 30 GiB 内存、CPU 推理 | Docker 运行四套靶场 |
| 软件 | Ollama、Qwen3:14B、Python、Nmap | Juice Shop、DVWA、WebGoat、crAPI |
B 主机的靶场服务绑定 127.0.0.1,不直接开放给局域网。A 主机通过 SSH 本地端口转发访问。B 主机的 443/8443 等原有服务不受本实验影响。
A:Ubuntu + Python/Nmap + Ollama/Qwen3:14B
|
SSH 隧道
|
B:Ubuntu + Docker(仅本地回环端口)
├── Juice Shop 127.0.0.1:3000
├── DVWA 127.0.0.1:8081
├── WebGoat 127.0.0.1:8082
└── crAPI 127.0.0.1:8888
二、A 主机部署 Ollama
2.1 安装服务
curl -fsSL https://ollama.com/install.sh | sh
ollama --version
systemctl status ollama --no-pager
如果服务未运行:
sudo systemctl enable --now ollama
ss -lntp | grep 11434
默认本地 API 监听 127.0.0.1:11434。不要为了方便将未经认证的 Ollama API 直接暴露到公网。
2.2 下载千问模型
ollama pull qwen3:14b
ollama list
ollama run qwen3:14b '请简要介绍 OWASP Top 10。'
本次使用 i7-1165G7 CPU 推理,无独立 GPU。14B 模型可以运行,但首次加载及长报告生成可能需要数分钟。ollama run 测试完成后无需一直保持交互窗口,Python Agent 会通过 Ollama API 自动加载模型。
2.3 验证 API
curl --noproxy '*' http://127.0.0.1:11434/api/tags
应能看到已安装模型列表。如果访问失败,先检查 systemd 服务和 11434 监听状态。
三、安装 Python 和 Nmap
sudo apt update
sudo apt install -y python3 python3-venv nmap curl openssh-client
python3 --version
nmap --version
mkdir -p ~/ai-pentest
cd ~/ai-pentest
python3 -m venv .venv
source .venv/bin/activate
本次实际环境为 Python 3.14.4、Nmap 7.98。V1/V2 扫描器主要使用 Python 标准库,虚拟环境便于后续扩展依赖。
四、建立 A → B 的 SSH 隧道
4.1 映射关系
| 靶场 | B 端口 | A 本地端口 |
|---|---|---|
| Juice Shop | 3000 | 13000 |
| DVWA | 8081 | 18081 |
| WebGoat | 8082 | 18082 |
| crAPI | 8888 | 18888 |
4.2 手动启动
在 A 主机运行:
ssh -o ExitOnForwardFailure=yes -N \
-L 127.0.0.1:13000:127.0.0.1:3000 \
-L 127.0.0.1:18081:127.0.0.1:8081 \
-L 127.0.0.1:18082:127.0.0.1:8082 \
-L 127.0.0.1:18888:127.0.0.1:8888 \
yj2@192.168.18.237
命令保持运行是正常现象。另开终端验证:
ss -lntp | grep -E ':(13000|18081|18082|18888)\b'
curl --noproxy '*' -o /dev/null -s -w 'Juice Shop: %{http_code}\n' http://127.0.0.1:13000/
curl --noproxy '*' -o /dev/null -s -w 'DVWA: %{http_code}\n' http://127.0.0.1:18081/
curl --noproxy '*' -o /dev/null -s -w 'WebGoat: %{http_code}\n' http://127.0.0.1:18082/WebGoat
curl --noproxy '*' -o /dev/null -s -w 'crAPI: %{http_code}\n' http://127.0.0.1:18888/
根据靶场行为,200 或合理的 302 跳转均可能正常。
4.3 可选:systemd 用户服务自动维护隧道
首先确认免密 SSH 登录。已有密钥时不要覆盖:
ls -l ~/.ssh/id_ed25519.pub
# 没有密钥时才运行:ssh-keygen -t ed25519
ssh-copy-id yj2@192.168.18.237
ssh -o BatchMode=yes yj2@192.168.18.237 'echo SSH_OK'
在 ~/.config/systemd/user/ai-pentest-tunnel.service 中写入:
[Unit]
Description=AI Pentest SSH Tunnel
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/ssh -N -T -o BatchMode=yes -o ExitOnForwardFailure=yes -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -L 127.0.0.1:13000:127.0.0.1:3000 -L 127.0.0.1:18081:127.0.0.1:8081 -L 127.0.0.1:18082:127.0.0.1:8082 -L 127.0.0.1:18888:127.0.0.1:8888 yj2@192.168.18.237
Restart=always
RestartSec=10
[Install]
WantedBy=default.target
退出手动隧道后启动:
systemctl --user daemon-reload
systemctl --user enable --now ai-pentest-tunnel.service
systemctl --user status ai-pentest-tunnel.service --no-pager
如需未登录时也运行用户服务,可在验证成功后执行 sudo loginctl enable-linger javen03。本次尚未完成断线重连和重启后的全面验收,故此部分属于可选增强。
五、V1:最小可运行扫描与 AI 分析
项目结构:
ai-pentest-v1/
├── scanner.py
├── agent.py
├── README.md
└── reports/
├── scan-latest.json
└── report-latest.md
scanner.py 访问四个固定的本地 SSH 转发地址,采集 HTTP 状态和 Nmap 服务识别结果并保存 JSON;agent.py 调用 Ollama 的 qwen3:14b 生成 Markdown 分析报告。
cd ~/ai-pentest/ai-pentest-v1
python3 scanner.py
python3 agent.py
less reports/report-latest.md
本次 V1 的实际扫描输出:
Juice Shop: HTTP 200; nmap exit 0
DVWA: HTTP 200; nmap exit 0
WebGoat: HTTP 200; nmap exit 0
crAPI: HTTP 200; nmap exit 0
注意:nmap exit 0 只代表命令正常结束,不代表端口开放或存在漏洞。应进一步读取 Nmap 结果中的 open、closed、filtered 状态。
六、V2:增强 HTTP 安全证据采集
V2 在 V1 基础上增加 scanner_v2.py、agent_v2.py,主要采集:
| 类别 | 内容 |
|---|---|
| HTTP | 状态码、标题、响应头、重定向链 |
| 安全响应头 | CSP、HSTS、X-Frame-Options、X-Content-Type-Options、Referrer-Policy 等 |
| Cookie | Secure、HttpOnly、SameSite |
| CORS | 测试 Origin、OPTIONS 预检响应 |
| 服务识别 | Nmap TCP 端口和版本信息 |
| 证据保存 | reports/scan-v2-latest.json |
| AI 报告 | reports/report-v2-latest.md |
运行方式:
cd ~/ai-pentest/ai-pentest-v2
python3 scanner_v2.py
python3 -m json.tool reports/scan-v2-latest.json
python3 agent_v2.py
less reports/report-v2-latest.md
agent_v2.py 通过本地 Ollama API 调用模型,无需先手动运行 ollama run。建议保持 Ollama 服务常驻、靶场 SSH 隧道正常。
6.1 如何解读 AI 结果
V2 的目标是形成证据驱动的风险线索,而不是自动确认漏洞。例如:
Access-Control-Allow-Origin: *是可观察到的响应头,但不单独证明敏感信息跨域泄露。- 缺少 CSP、HSTS 等安全响应头,需要结合协议、页面用途、威胁模型判断风险。
Server版本披露通常是信息收集线索,不等于已证实存在可利用漏洞。
报告应明确区分“事实”“推测”“待验证事项”和“修复建议”,并能回溯到原始 JSON 证据。
七、故障排查记录
7.1 四个靶场同时 Connection refused
V2 曾出现:
Juice Shop: HTTP <urlopen error [Errno 111] Connection refused>
DVWA: HTTP <urlopen error [Errno 111] Connection refused>
WebGoat: HTTP <urlopen error [Errno 111] Connection refused>
crAPI: HTTP <urlopen error [Errno 111] Connection refused>
四个目标同时失败时,先检查共同依赖的 SSH 隧道:
ss -lntp | grep -E ':(13000|18081|18082|18888)\b'
若无监听,重新建立 SSH 隧道,再执行 scanner_v2.py。不要一开始就重启 B 主机的 Docker 或清空防火墙规则,以免影响其他服务。
7.2 模型速度较慢
CPU 推理 14B 模型需要一定时间,特别是上下文较长时。建议原始 HTML 保存在本地文件,只将关键响应头、Nmap 结果和短证据摘要送入模型;控制上下文长度、生成 token 数量,避免不必要的内存与交换分区压力。
7.3 WebGoat 容器显示 unhealthy
曾发现健康检查命令依赖容器内不存在的 curl,而 WebGoat 实际 HTTP /WebGoat 可访问。健康检查失败不必然代表应用不可用,需要同时检查健康检查日志和真实 HTTP 响应。
八、安全边界与当前局限
- 固定授权目标范围,扫描器不得擅自扩展到互联网目标。
- V2 的重定向跟随逻辑仍需进一步增加严格的本地目标白名单校验。
- Docker 的出口限制已做部分验证,但不能据此宣称 IPv4/IPv6、容器到宿主机、重启持久化等隔离均已全面审计。
- 当前未接入 ZAP、认证扫描、漏洞利用或业务逻辑验证,不能将 AI 报告视为确认漏洞清单。
- 网页响应内容属于不可信输入,后续应防止页面文本对 AI Agent 发出越权指令。
九、下一步计划
- V2.1:修复跨范围重定向、缩减模型输入、结构化风险项、关联证据编号。
- V3:接入 OWASP ZAP 被动扫描和 SQLite 历史数据库。
- V4:实现任务编排、审批机制、授权范围检查、扫描差异分析。
规划中的 Agent 工作流:
授权目标 → 范围校验 → HTTP/Nmap/ZAP 采集
↓
JSON/SQLite 证据
↓
Qwen3 本地分析
↓
人工复核与报告输出
十、总结
本次已基本完成:Ubuntu 26.04 部署 Ollama、Qwen3:14B CPU 推理、SSH 隧道访问四套 Docker 靶场、Python/Nmap 扫描、JSON 证据保存和 AI Markdown 报告生成。
从 V1 到 V2 的变化,是从简单端口/HTTP 状态检测,升级到较丰富的 Web 安全响应证据采集。系统仍处于实验阶段,后续重点不是盲目增加扫描命令,而是提升证据可信度、授权控制、稳定性和可复现性。
免责声明:本文仅用于自建授权靶场的技术研究与安全测试。任何测试均应在明确授权的目标和网络范围内进行。

浙公网安备 33010602011771号