解决雷池 WAF 重定向问题

解决雷池 WAF 重定向问题

问题

源站服务器是 HTTP Only 的,通过 8000 端口接入雷池 WAF,然后接入 Cloudflare CDN

这里假设源站为http://192.168.1.1:8000 ,雷池 WAF 为http://20.0.0.1:80 ,CDN 访问为https://example.com

此时假如源站有个接口为http://192.168.1.1:8000/api ,由于未设置伪静态,会跳转到目录http://192.168.1.1:8000/api/ ,此时在外访问https://example.com/api 就会跳转到http://example.com:8000/api/ ,但在外直接访问https://example.com/api/ 却正常

如果源站为http://192.168.1.1:80 ,雷池WAF也为相同的端口号http://20.0.0.1:80 ,CDN 访问为https://example.com ,此时在外访问https://example.com/api 就会跳转到http://example.com:8000/api/

有时即使访问正常,浏览器打开开发者工具会发现要在http和https反复横跳多次后才能跳转到目标网页

解决

要解决这个问题,我们需要修改雷池WAF的Nginx配置文件

本人已经尝试修改 CDN 规则、源站套证书、443端口回源,均无法解决,除非使网站全程 HTTPS Only

如雷池安装到 /data 目录,那么对应Nginx配置文件就在 /data/safeline/resources/nginx/sites-enabled

1
2
3
root@waf-server:~# ls /data/safeline/resources/nginx/sites-enabled   
IF_backend_1 IF_backend_14 IF_backend_4 IF_backend_6 IF_backend_8 generated
IF_backend_10 IF_backend_3 IF_backend_5 IF_backend_7 IF_backend_9

具体是哪个配置文件,可以在WAF的Web后台点击对应站点进行查看,如:

1
https://192.168.1.1:9443/sites/detail?id=10

说明对应配置文件为 10

打开配置文件可以发现有很多设置,可能每次在Web后台修改都会自动重新修改,不过我们发现还有一个目录叫做 custom_params,里面可以直接增加反代相关 location 节的参数

1
2
3
root@waf-server:~# ls /data/safeline/resources/nginx/custom_params
backend_1 backend_100085 backend_12 backend_14 backend_3 backend_5 backend_7 backend_9
backend_10 backend_11 backend_13 backend_2 backend_4 backend_6 backend_8

我们只需要在对应ID的配置内加上重定向语法即可,这个网上一搜一大把,主要靠 rewriteproxy_redirect 实现,可以实现很多效果

处理协议:

1
2
3
proxy_redirect http:// $http_X_Forwarded_Proto://;

# proxy_redirect http:// https://;

当然此处给出的不一定是最完美的,请根据实际需求修改

最后执行命令重启 Nginx 使修改后的配置生效

1
2
root@waf-server:~# docker restart safeline-tengine
safeline-tengine

或者先测试配置后重载:

1
2
3
4
# 测试nginx配置是否正确
docker exec -it safeline-tengine /usr/sbin/nginx -t
# 重新加载配置
docker exec -it safeline-tengine /usr/sbin/nginx -s reload

重启 Nginx 后如果所有站点都无法访问,说明配置有误,请删除或修改错误的配置直到重启 Nginx 后服务正常访问

此时通过 curl 测试访问,就可以得到预期的结果

1
2
curl -v https://example.com/api
< Location: https://example.com/api/

参考

https://www.hyos.top/posts/waf-posts/test-post/

https://www.cnblogs.com/kevingrace/p/8073646.html