过去几天我一直为此事苦恼不已。
我有一个运行着 Ubuntu 的 EC2 实例,并且设置了我的 AWS 实例,以便允许所有访问端口 8088 和 8090 的流量进入。此链接,我认为只需使用浏览器的 GUI 就很容易了,因为我无法访问 EC2 实例上的 GUI。因此我运行此命令(来自教程):
docker run -u zap -p 8088:8088 -p 8090:8090 -i owasp/zap2docker-stable zap-webswing.sh
它启动时没有任何提示。但是当我使用端口 访问我的公共 EC2 IP 时8088
,我收到一条错误消息,提示“无法访问此站点”。我已成功在不同的端口上在此 EC2 实例上设置了 jenkins,并且可以访问。因此,我不确定为什么在尝试运行 OWASP/ZAP 时无法访问此端口。
当我运行时,sudo iptables -t nat -L -n
我得到以下信息:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:8088
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8088 to:172.17.0.2:8088
我不擅长这种事情。。所以我不知道到底发生了什么,也不知道我需要改变什么?但是,当我转到我的公共 IP 和我指定的端口时,我是否可以启动 OWASP/ZAP 并让它工作?
答案1
抱歉提起这个老问题,但我过去在 Docker 容器中运行 ZAP 时遇到了问题(实际上是 AWS ECS)。就我而言,我并不想提前设置端口(让 Docker 专门管理端口,因为我可能正在运行超过一个在同一主机上创建一个 zap 实例 - 我们需要在 CI 环境中执行此操作,事情变得诡异的如果您将其移至 AWS ECS)。我发现 ZAP+Docker+Random Port 监听器存在两个问题:
- ZAP 将只监听你指定的端口,如果传入的请求是不同的端口,那么 ZAP 就会忽略该流量,结果类似于“无法访问该站点”
- 因此,它只会监听来自同一主机名也是如此。因此 ZAP 认为它正在监听
localhost
,并且它会忽略任何看似发往其他目的地的流量localhost
。
我认为两者其实是一样的。就我而言,我不得不欺骗才能让它工作。我必须向 zap 容器添加一个 nginx 反向代理(我使用 nginx 是因为它很轻量,而且配置起来很容易)。基本上,流程看起来像这样:
我 -> 容器中的 nginx --(将主机头重写为localhost:8080
)--> ZAP 监听器
Nginx 端没有其他处理,只是“监听固定端口上的流量(Docker 管理外部的端口),重写主机头,然后localhost:8080
将流量发送到localhost:8080
(ZAP 正在监听的位置)。这有点黑客,但对我来说很有效。