很多新人不太熟悉反向代理,所以导致配置站点出现问题
配置问题
记录常见的配置问题
配置后攻击测试没有拦截记录
检查访问请求有没有真实经过雷池
有很多新人配置站点后,真实的网站流量还是走的源站,导致雷池这边什么数据都没有
配置后网站无法访问,排查思路
如果按照指引配置了站点,但配置的网站无法访问
优先搜索访问网站时请求对应的错误码,根据错误码提示进行排查
梳理问题可能存在的几个原因:
配置站点错误,ip 错误、端口冲突等
雷池端与配置的站点网络不通
访问雷池配置的站点端口网络不通,对于雷池端已配置的端口没有被开放访问(防火墙、安全组等)
同时存在其他错误的配置可能会导致新的配置一直不生效,检查有没有存在其他错误的配置
雷池本身的状态不正常,使用 docker ps 检查容器状态
雷池本身默认的反向代理配置与源站需求的配置不匹配,需要手动调整雷池的反响代理配置
注:还可以结合safeline-mgt和safeline-tengine两个容器的日志帮助排查
网站无法访问排查步骤
-
明确 “网站无法访问” 的具体表现:
- 如果
502 Bad Gateway tengine
:
大概率是是雷池的上游服务器配置不正确,或者雷池无法访问到上游服务器,请继续按下面步骤排查。
-
如果请求能够返回但是十分缓慢
确认服务器负载是否正常,检查服务器的 CPU、内存、带宽使用情况
在客户端执行命令,检查雷池服务器与上游服务器的网络:
curl -H "Host: <雷池 IP>" -vv -o /dev/null -s -w 'time_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n' http://<上游服务器地址>
如果 time_namelookup 时间过大,请检查 dns server 配置
如果 time_connect 时间过大,请检查雷池与上游服务器之间的网络状态
如果 time_starttransfer 时间过大,请检查上游服务器状态,是否出现资源过载情况
如果不是以上情况,继续下一步
- 如果
-
在客户端执行
curl -v -H "Host: <域名或者IP>" http://<雷池 IP>:<雷池监听端口>
。如能获取到业务网站的响应,如图,并且站点的 “今日访问量” +1,说明雷池配置正确,网络正常如果浏览器无法访问,但这一步正常获取到响应,大概率是因为:
- 网站域名还没有切到雷池,浏览器测试时访问的是
http(s)://<雷池 IP>
,恰好业务服务上有 Host 验证,所以拒绝了该请求。这种情况需要修改本机 host,把域名解析到雷池 IP,再访问http(s)://<域名>
,才能准确测试 - 网站业务做了其他一些特殊处理。例如访问后 301 跳转到了其他地址,需要具体排查网站业务的响应内容
- 如果不能获取到响应,继续下一步
- 网站域名还没有切到雷池,浏览器测试时访问的是
-
在雷池设备上执行
curl -v -H "Host: <域名或者IP>" http://<雷池 IP>:<雷池监听端口>
。如能获取到业务网站的响应,并且站点上 “今日访问量” +1,说明雷池配置正确- 如果步骤 2 失败而这里成功,说明客户端到雷池之间的网络存在问题。请排查网络,保证客户端可访问到雷池,检测防火墙、端口开放等
- 如果不能获取到响应,继续下一步
-
在雷池设备上执行
curl -H "Host: <域名或者IP>" http://127.0.0.1:<雷池监听端口>
。如能获取到业务网站的响应,并且站点的 “今日访问量” +1,说明雷池配置正确- 如果步骤 3 失败而这里成功,且
telnet <雷池 IP> <雷池监听端口>
返回Unable to connect to remote host: Connection refused
,可能是被雷池设备上的防火墙拦截了。 - 排查操作系统本身的防火墙,还有可能是云服务商的防火墙。请根据实际情况逐项排查,开放雷池监听端口的访问
- 如果不能获取到响应,继续下一步
- 如果步骤 3 失败而这里成功,且
-
在雷池设备上执行
netstat -anp | grep <雷池监听端口>
确认端口监听情况。正常情况下,应该有一个 nginx 进程监听在0.0.0.0:<雷池监听端口>
。- 没有的话请通过社群或者 Github issue 提交反馈,附上排查过程。有的话继续下一步
-
在雷池设备上
curl -H "Host: <域名或者IP>" <上游服务器地址>
。如能获取到业务网站的响应,说明雷池设备和站点网络没有问题如果步骤 4 失败而这里成功,可能是配置错误,查看配置站点教程确认配置是否正确,如无法解决,请通过社群或者 Github issue 提交反馈,附上排查过程
如果这步失败,说明雷池和上游服务器之间的网络存在问题。请排查网络,确保雷池可以访问到上游服务器
配置完成后,测试时返回 400 Request Header Or Cookie Too Large
检查是否形成了环路,即:雷池将请求转发给上游服务器后,上游服务器又将请求转发回雷池。
重新修改配置后再次测试
配置完成后,过waf返回404
抓包对比过waf和不过waf的请求区别,是否雷池的反代转发内容出现变化
如果服务器有请求严格校验,可以手动修改雷池的nginx,参考下文的自定义修改nginx、
注意:雷池界面操作可能导致某些自定义被覆盖重置
配置站点报错
报错信息“nginx: [emerg] duplicate listen options for 0.0.0.0:80 in /etc/nginx/sites-enabled/IF_backend_4:10\nnginx: configuration file /etc/nginx/nginx.conf test failed\n: exit status 1” 主要是说明当前的配置与原有的配置冲突了,比如原有的站点使用80端口监听所有的域名 再次配置一个使用80监听所有域名就会报错,这里第二个80监听配置指定域名即可
报错信息 “listen tcp :80: bind: address already in use” 主要是说明配置的端口已经被其他非雷池的程序占用,比如例子中的被其他占用了80端口 找到占用80端口的程序,切换成其他端口,重新配置站点即可
自定义nginx配置
雷池每次修改站点或者重启服务时,都会在waf的安装目录下的 resources/nginx/sites-enabled/ 重新生成 nginx conf 文件。因为没法“智能”合并用户自定义的配置和自动生成的配置。但是也还是有方式能持久化地添加一些 nginx conf,不会被覆盖。
每个 IF_backend_XXX
的 location 中都有 include proxy_params;
这一行配置,且 resources/nginx/proxy_params
这个文件不会被修改站点、重启服务等动作覆盖。2.1.0 版本之后支持 /etc/nginx/custom_params/backend_XXX;
可以自定义站点级的 nginx location 配置。
server {
location ^~ / {
proxy_pass http://backend_1;
include proxy_params;
include /etc/nginx/custom_params/backend_1;
# ...
}
}
所以只需要根据需求修改对应的文件就可以了。比如在 resources/nginx/proxy_params
里面增加如下配置,即可支持 X-Forwarded-Proto
:
proxy_set_header X-Forwarded-Proto $scheme;
修改完成后运行命令检查配置文件
docker exec safeline-tengine nginx -t
检查应显示
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
最后应用配置文件
docker exec safeline-tengine nginx -s reload
不同版本关闭防火墙的命令
默认使用雷池不需要关闭防火墙,配置对应的开放规则即可
配置比较麻烦,也可以直接关闭防火墙
Ubuntu 18.04 LTS 、 Ubuntu 20.04 LTS 、 Ubuntu 22.04 LTS
Debian 9 (Stretch)、Debian 10 (Buster)、Debian 11 (Bullseye)
关闭防火墙命令(UFW):sudo ufw disable
注:Debian 默认可能不安装 UFW,依赖于 iptables。
CentOS 7、CentOS 8、RHEL 7、 RHEL 8、Fedora 32、 Fedora 33、Fedora 34
关闭防火墙命令(Firewalld):sudo systemctl stop firewalld && sudo systemctl disable firewalld
openSUSE Leap 15.2、openSUSE Leap 15.3
关闭防火墙命令(通常是 SuSEfirewall2 或 firewalld):
1.SuSEfirewall2, 使用 sudo SuSEfirewall2 stop
2.firewalld, 使用 sudo systemctl stop firewalld && sudo systemctl disable firewalld
如果问题不能解决,可加入 雷池微信群与社区用户共同讨论,或在 百川论坛 发帖