跳到主要内容

其他问题

记录不常见的其他问题

雷池获得的请求者的源IP 显示不正确

雷池默认会通过 Socket 连接获取请求者的源 IP,如果请求在到达雷池之前,还经过了其他代理设备(如:反代、LB、CDN、AD 等),这种情况会影响雷池获取正确的源 IP 信息。

通常,代理设备都会将真实源 IP 通过 HTTP Header 的方式传递给下一跳设备。

如下方的 HTTP 请求,在 X-Forwarded-ForX-Real-IP 两个 Header 中都包含了源 IP:

GET /path HTTP/1.1
Host: waf-ce.chaitin.cn
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
X-Forwarded-For: 110.123.66.233, 10.10.3.15
X-Real-IP: 110.123.66.233

X-Forwarded-For 是链式结构,若请求经过了多级代理,这里将会按顺序记录每一跳的客户端 IP。

如果请求中没有包含存在源 IP 的相关 Header,可以通过修改前方代理设备的配置来解决。例如,Nginx 可以增加如下配置来传递 X-Real-IP 给后方设备:

location /xxx {
proxy_pass http://xxx.xxx;
...
proxy_set_header X-Real-IP $remote_addr;
...
}

遇到这种情况,打开雷池控制台的 “通用配置” 页面,将选项 “源 IP 获取方式” 的内容修改为 “从 HTTP Header 中获取”,并在对应的输入框中填入 X-Real-IP 即可。

get_source_ip.png

上游服务器获得请求者的源IP 显示不正确

有可能上游服务器获取到的全都是雷池 WAF 的 IP,如何获取真是的请求者源IP?

雷池默认透传了源 IP,放在 HTTP Header 中的 X-Forwarded-For 里面。

如果上游服务器是 NGINX,添加如下配置就可以。如果不是,需要自行配置解析 XFF

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;

清理数据库中的统计信息和检测日志

注意:该操作会清除所有日志信息,且不可恢复

docker exec safeline-mgt cleanlogs

将雷池的日志导出到 XXX

雷池社区版自发布以来经常有用户询问如何将拦截日志通过 syslog 转发至目标地址,接下来我们将尝试使用 fluentd 来实现这个需求。

首先,我们编写 fluent.conf,我们将读取 mgt_detect_log_basic 中的数据,并通过配置 syslog 转发出去。下面是 input 部分,match 部分可以参考参考文档中的 syslog 部分。

<source>
@type sql

host safeline-pg // 默认数据库地址,如果在 compose.yml 中改过,请使用改后值
port 5432
database safeline-ce // 数据库名
adapter postgresql
username safeline-ce // 默认用户名,如果在 compose.yml 中改过,请使用改后值
password POSTGRES_PASSWORD // 数据库密码,见安装目录下 .env

select_interval 60s # optional
select_limit 500 # optional

state_file /var/run/fluentd/sql_state

<table>
table mgt_detect_log_basic
update_column timestamp
time_column timestamp # optional
</table>

# detects all tables instead of <table> sections
#all_tables
</source>

之后,来编写我们的 fluentd 的 Dockerfile

FROM fluent/fluentd:v1.16-1

# Use root account to use apk
USER root

# below RUN includes plugin as examples elasticsearch is not required
# you may customize including plugins as you wish
RUN apk add --no-cache --update --virtual .build-deps \
sudo build-base ruby-dev \
&& apk add libpq-dev \
&& sudo gem install pg --no-document \
&& sudo gem install fluent-plugin-remote_syslog \
&& sudo gem sources --clear-all \
&& apk del .build-deps libpq-dev \
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

COPY fluent.conf /fluentd/etc/fluent.conf

USER fluent

最后,编译完成后,我们将容器跑起来,参考命令

echo "" > ./sql-state
docker run -d --restart=always --name safeline-fluentd --net safeline-ce -v ./sql-state:/var/run/fluentd/sql_state safeline-flunetd:latest

参考文档 SQL input plugin for Fluentd event collector fluent-plugin-remote_syslog

有多个防护站点监听在同一个端口上,匹配顺序是怎么样的

如果域名处填写的分别为 IP 与域名,那么当使用进行 IP 请求时,则将会命中第一个配置的站点 server_index02.png 以上图为例,如果用户使用 IP 访问,命中 example.com。

如果域名处填写的分别为域名与泛域名,除非准确命中域名,否则会命中泛域名,不论泛域名第几个配置。 server_index01.png 以上图为例,如果用户使用 a.example.com 访问,命中 a.example.com。 如果用户使用 b.example.com,命中 *.example.com。

自定义站点 nginx conf

雷池每次修改站点或者重启服务时,都会在waf的安装目录下的 resources/nginx/sites-enabled/ 重新生成 nginx conf 文件。因为没法“智能”合并用户自定义的配置和自动生成的配置。但是也还是有方式能持久化地添加一些 nginx conf,不会被覆盖。

每个 IF_backend_XXX 的 location 中都有 include proxy_params; 这一行配置,且 resources/nginx/proxy_params 这个文件不会被修改站点、重启服务等动作覆盖。2.1.0 版本之后支持 include custom_params/backend_XXX; 可以自定义站点级的 nginx location 配置。

server {
location ^~ / {
proxy_pass http://backend_1;
include proxy_params;
include custom_params/IF_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

攻击日志中的域名不是我的网站

攻击日志中显示的域名字段是取的 HTTP Header 中的 Host,如果这个字段不存在,则默认使用目的 IP 作为域名。如果客户端修改了 HTTP Header 的 Host,那么这里显示的就是修改之后的。

放一张截图更容易理解,注意下面「请求报文」中的 Host 字段:

fake_host.jpg

查看容器日志根据错误日志进行排查(通用)

  1. 查看容器状态
docker ps
  1. 查看tengine日志
 docker logs -f safeline-tengine
  1. 查看mgt日志
 docker logs -f safeline-mgt

根据错误日志的信息进行排查

紧急恢复 tengine

问题表现:重启或升级后编辑任何站点配置都报错,后台 tengine 一直在重启。

一般原因是 tengine 配置在当前设备环境上不合法,导致 tengine 无法以原配置启动,例如重启过程中网站端口被其他进程所占用、网站 dns 配置异常导致解析不到 IP 等。

解决方案:可以通过查看 tengine 容器的日志,排查问题,也可以使用安装目录下的 reset_tengine.sh 脚本重置 tengine 容器配置。

# 执行时间根据网站数量和配置情况而定, 请耐心等待
cd /data/safeline && bash reset_tengine.sh

执行成功后会有如下输出,此时可以尝试重新编辑站点配置,观察是否正常。

[SafeLine] 是否重新生成 tengine 的所有配置 (Y/n)

重新生成 tengine 配置完成

是否支持 WebSocket ?

默认支持

内网需要加白哪些公网地址?

地址端口说明
waf-ce.chaitin.cn443搜索引擎爬虫白名单、左下角的更新提示
challenge.rivers.chaitin.cn443恶意 IP 情报
safeline-cloud.chaitin.com50052专业版授权
acme-v02.api.letsencrypt.org443acme 证书申请
rivers.chaitin.cn443百川推荐工具(浏览器使用)

是否可以给客户/朋友推荐或安装社区版?

欢迎推荐雷池社区版给客户、公司和朋友!

但是,请注意,我们不允许以下行为:

  1. 对软件进行破解、逆向工程、二次包装、篡改版权信息等操作

  2. 在未获得长亭授权的情况下,出售雷池社区版或提供商业化的技术服务

  3. 其他任何侵犯雷池社区版知识产权的行为,查看授权协议

感谢您的理解和支持!

雷池社区版和企业版有什么区别

企业版功能完善、部署模式灵活,能满足合规等保的需要。另外,企业版提供完善、一对一的支持服务,包括方案咨询、售后支持、漏洞应急服务等。企业版还有完善的开发管理流程和事故响应机制,能够对稳定性做承诺。

企业体量较大的客户可以使用社区版/专业版,但社区版功能有限,可以在边缘的小网站、内部网站上试用一下。

如对企业版有预算,可以联系销售申请企业版试用,官网留电话即可。

问题无法解决

  1. 通过右上角搜索检索其他页面

  2. 通过社群(官网首页加入微信讨论组)寻求帮助或者 Github issue 提交反馈,并附上排查的过程和截图