You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Pipeline集成OWASP ZAP执行DAST时连接被拒绝问题求助

问题排查与解决方案

核心原因分析

  1. 网络隔离问题:Docker容器默认拥有独立网络栈,你在容器中运行ZAP时,localhost:5000指向容器内部而非Jenkins Agent所在的宿主机,因此无法访问到宿主机上启动的Python应用。
  2. 应用启动延迟:启动应用后立即执行ZAP扫描,可能应用尚未完成初始化,导致连接被拒绝。

具体修复步骤

1. 调整Docker网络访问方式

根据运行环境选择以下方案:

  • Docker Desktop(Windows/macOS):使用Docker内置的host.docker.internal替代localhost,该域名会自动解析到宿主机IP:
    docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t http://host.docker.internal:5000
    
  • Linux环境:host.docker.internal默认不生效,可直接使用宿主机真实IP(如192.168.1.100),或设置容器网络为host模式(注意端口冲突风险):
    # 使用宿主机IP
    docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t http://192.168.1.100:5000
    # 或使用host网络模式
    docker run -t --network host ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t http://localhost:5000
    

2. 确保应用绑定所有网卡

检查app.py中应用的监听配置,必须绑定0.0.0.0而非仅127.0.0.1,否则即使Docker能访问宿主机IP,也无法连接应用:

# 错误示例:仅绑定本地回环
app.run(host='127.0.0.1', port=5000)
# 正确示例:绑定所有网卡
app.run(host='0.0.0.0', port=5000)

3. 添加应用启动等待逻辑

启动应用后增加等待检测,确保应用完全初始化再执行扫描,可通过curl循环实现:

# 启动应用到后台
bash -c "source venv/bin/activate && python3 app.py &"
# 最多等待60秒,检测应用是否启动
timeout=60
while ! curl -s http://localhost:5000 > /dev/null; do
  timeout=$((timeout-1))
  if [ $timeout -le 0 ]; then
    echo "应用启动超时"
    exit 1
  fi
  sleep 1
done

4. 优化Pipeline的Deploy阶段

修改后的Deploy阶段代码示例(以Docker Desktop为例):

stage('Deploy') {
    steps {
        sh '''
        # 启动应用到后台
        bash -c "source venv/bin/activate && python3 app.py &"
        
        # 等待应用启动
        timeout=60
        while ! curl -s http://localhost:5000 > /dev/null; do
          timeout=$((timeout-1))
          if [ $timeout -le 0 ]; then
            echo "应用启动超时"
            exit 1
          fi
          sleep 1
        done
        
        # 运行ZAP扫描,挂载当前目录到容器,确保报告能导出到Jenkins工作区
        docker run -t -v \$(pwd):/zap/wrk ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t http://host.docker.internal:5000 -r zap-report.html
        '''
    }
}

额外排查点

  • 检查Jenkins Agent所在机器的防火墙规则,确认5000端口未被拦截;
  • 在Jenkins Agent上手动执行curl http://localhost:5000,验证应用是否正常响应;
  • 若Jenkins Agent本身运行在Docker容器中,需确保Agent容器与ZAP容器处于同一网络,或配置端口映射让外部可访问应用。

内容的提问来源于stack exchange,提问作者Ibon Castro Llorente

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:20:57