借助阿里云ESA等CDN,实现更简单的宝塔面板和雷池WAF同机部署
1 概要
虽然雷池的官方文档中提到了一种使得雷池和宝塔得以共存的方法。但是需要修改配置文件,尤其是宝塔自身的Nginx相关参数的获取也是从80端口获取的,因此如果更新了宝塔或者重新安装了Nginx之类,那么将立即因为端口冲突而发生故障。因此本文提出了一种使用阿里云ESA功能或者其他CDN类似,使得不需要对宝塔端口进行变更即可共存的方法。
2 架构与实现
2.2 系统架构

原理非常简单,通过阿里云ESA的回源规则,将客户端发来的流量通过新的其他端口回源,到达雷池最后转发到宝塔的Nginx上,同时配置防火墙或者安全组禁止服务器外部的80和443端口入站。如果其他CDN支持类似能力的话,那么道理是相通的,可以参照这个思路进行配置。
2.3 具体实现
2.3.1 安装宝塔和雷池
安装方法非常简单,就不再赘述,直接看官网的说明吧。
2.3.2 在宝塔面板/服务器/安全组处配置端口
为了防止攻击者万一探测到你的源站IP,从而绕过WAF访问源站,建议放行雷池WAF应用的端口(比如8080/8443)的同时,禁止80/443端口的入站。
2.3.3 在阿里云购买ESA
在https://www.aliyun.com/product/esa购买。
2.3.4 设置回源规则
在站点管理侧栏中的“规则”中找到“回源规则”。然后点击“新增规则”。

然后根据情况,可以选择全部传入请求还是特定的域名,然后在下面设置回源的协议和端口,这里填写的端口是用于等会雷池用的。

2.3.5 配置雷池WAF
访问雷池后台地址(通常是https://你服务器的IP:9443), 然后点“添加应用”。
域名根据实际需要填写,然后http端口和https端口填写你刚才在ESA配置的端口。
源站地址根据需要填写http://127.0.0.1(宝塔Nginx不配置证书)或者https://127.0.0.1(宝塔Nginx配置证书)均可。(虽然http在本机足以满足需要,且不会泄露信息。但是一些设计存在缺陷的应用程序会使用带协议的绝对URL,如果协议不一致反而会导致故障,因此应该视情况合理选择)

由于配置了CDN,因此需要在高级配置处进行一些修改。
首先将IP地址获取方式改为从上一级代理处获取。

然后开启应用不存在时返回内置证书,这能降低因为HTTPS证书从而导致源站暴露的可能性。

2.3.6 测试
如果全部配置正常,访问对应的域名应该能够成功访问。像阿里云ESA的证书配置、缓存策略等各种问题,可以通过阿里云的技术支持人员解决。