我的openresty占用了80和443,但是搭建雷池waf没有报错(让雷池waf在openresty后面,但个人版无法获取真实ip)

265 次阅读

本文最后更新于 2026年5月18日。

这种情况确实会让不少刚接触“雷池(SafeLine)”的朋友感到困惑。按常理说,两个程序同时抢占同一个端口必然会报错,但雷池的设计逻辑比较特殊。

以下是雷池在占用 443 端口却不报错的几个核心原因:


1. 容器化的“错觉”

雷池是基于 Docker 部署的。当你启动雷池时,它实际上是在容器内部监听端口。

  • 端口映射机制: 如果你在雷池的控制面板里配置了防护站点,雷池会尝试通过 Docker 映射宿主机的端口。

  • 静默失败: 在某些 Docker 版本或特定的网络模式下,如果宿主机的 443 端口已经被 OpenResty 物理占用,Docker 容器虽然在内部启动成功了,但它对外的端口映射可能会失效或者处于挂起状态,而不会直接导致整个容器启动崩溃。

2. 谁先占位,谁拿控制权

在 Linux 网络栈中,端口通常遵循“先到先得”原则:

  • OpenResty 先启动: 它已经牢牢抓住了宿主机的 443 端口。

  • 雷池后启动: 尽管雷池的 Nginx 组件(tengine)也想监听 443,但由于端口已被占用,流量实际上仍然流向 OpenResty

  • 为什么不报错? 雷池的管理后台(通常在 9443 端口)和核心检测引擎是独立的。只要管理后台能起得来,你就能进入界面,看起来一切正常。但实际上,你的流量并没有经过雷池的清洗,而是直接进了 OpenResty。

3. 雷池的“旁路”或“节点”逻辑

雷池作为一款 WAF,其标准接入方式通常有以下两种:

  • 代替模式: 雷池接管 80/443,清洗后再转发给后端的 OpenResty(此时 OpenResty 必须改端口,比如改到 8080)。

  • 联动模式: 如果你还没在雷池里配置具体的防护站点,雷池的 Tengine 容器可能根本还没有真正去 Bind(绑定)443 端口。


如何排查?

你可以通过以下命令验证 443 到底在谁手里:

Bash

# 查看当前占用 443 端口的进程 PID 和名称
sudo lsof -i :443
# 或者使用 netstat
sudo netstat -tunlp | grep 443
  • 如果显示的是 openrestynginx(宿主机路径),说明雷池完全没生效,只是空跑。

  • 如果显示的是 docker-proxy,说明雷池接管成功了(但这会导致你的 OpenResty 报错或失效)。


正确的架构建议

如果你想让 OpenResty 和雷池并存,通常有两种方案:

方案 A:雷池在前(推荐)

这是标准的 WAF 部署方式。

  1. OpenResty: 修改监听端口为非标准端口(如 80808443)。

  2. 雷池: 监听 80443,在上游服务器配置中填写 127.0.0.1:8080

  • 优点: 恶意攻击在到达 OpenResty 前就被雷池拦截了。

方案 B:OpenResty 在前(反向代理)

  1. OpenResty: 依然监听 443,但在配置文件中将流量 proxy_pass 给雷池。

  2. 雷池: 监听其他端口(如 8000)。

  • 缺点: 这样配置比较复杂,且雷池获取到的真实 IP 可能会变成 127.0.0.1,需要额外配置 X-Forwarded-For

总结: 没报错不代表工作正常。建议检查雷池的站点配置,并确认宿主机的端口占用情况。如果 OpenResty 必须用 443,雷池就必须让路,或者两者通过端口偏移进行配合。