天存NetFilter产品安装指南

一、Windows版本

1.1 支持平台

支持从Windows2008 R2开始的各主流操作系统平台。

1.2 已知问题

1.3 安装方式

在支持的平台下,双击安装程序如 NetFilter_Setup_yyyymmdd.exe,按提示完成安装。安装过程中需要输入许可证(后续输入也是可以的)。

安装完成后,会在系统服务里增加一个名为【netfiltersvc】的服务。该服务启动时,自动过滤所有流入的HTTP流量;该服务停止时,也停止过滤行为。

如果仅需做监控,不需要拦截和干预,可以修改 C:\Tercel\NetFilter\conf\policy.xml 配置文件,把这一行:

改为:

重启【netfiltersvc】服务即可。

1.4 验证是否生效

在另一台机器上(一定要在另一台机器上执行!),用浏览器访问 http://安装机器ip:http端口/1.log,如http://192.168.100.12/1.log,在C:\Tercel\NetFilter\logs 目录下,能看到 alert-yyyymmdd.log当天日期的报警文件里,写入了一条访问 /1.log 的报警。

1.5 查看模块是否加载

cmd回到命令行状态,执行msinfo32.exe,在“环境驱动程序”分类里,搜索“netfiltertc”,如能找到,则代表我们的模块已加载。

1.6 确定许可证时间

查看 C:\Tercel\NetFilter\logs\sys.log 文件里,最后部分里这一行的时间:

1.7 只过滤特定端口的HTTP流量

如果无需过滤所有的HTTP流量,可以编辑 C:\Tercel\NetFilter\conf\netfiltersvc.conf,把以下这句:

在方括号里,填入所需过滤的端口,如果有多个,以逗号分隔:

修改后需要重启【netfiltersvc】服务。

二、Linux 版本

2.1 支持平台

支持从2.6.18 开始的大部分主流操作系统平台。

2.2 已知问题

2.3 确定操作系统版本

NetFilter的安装程序需要和具体操作系统的内核版本相匹配,不能差异太大。确定内核版本的方式:

得到具体的内核版本:

如上例的结果,可以选用内核 3.10 64位的安装版本。

2.2 安装过程

把适用的安装程序放在系统的任意目录下,如以 /tmp/iwall_2.1_Linux_2.6.32-71.el6.x86_64_x86_64_20171110.tar.gz。执行:

根据提示,把程序默认安装在:/usr/loal/iwall 目录下。以下举例均假设安装在默认目录。

到这一步只是完成了程序自身的安装,还需要根据具体的中间件或Web服务版本,一一加载。由于每种中间件和Web服务的启动方式并不相同,所以我们的加载方式也随之变化。

以下2.3-2.XX为各种Web服务的具体加载方式。

2.3 CentOS/Redhat7系列自带Apache的加载

编辑 /etc/sysconfig/httpd 配置文件,在该文档的最后加入几行:

重新启动Apache,tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。

2.4 编译版Apache的加载

如该编译版Apache目录位于 /usr/local/apache2,则编辑 /usr/local/apache2/bin/envars 环境变量设置文件,在该文档的最后加入几行: export ISHIELD_WORKDIR=/usr/local/iwall export LD_LIBRARY_PATH=/usr/local/iwall/module:$LD_LIBRARY_PATH export LD_PRELOAD=/usr/local/iwall/module/libishield.so

重新启动Apache,tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。 cd /usr/local/apache2 bin/apachectl restart tail /usr/local/iwall/logs/sys.log

2.5 Tomcat的加载

如该Tomcat的安装目录位于 /usr/local/tomcat7,则编辑 /usr/local/tomcat7/bin/setclasspath.sh 脚本文件,在该文档的最后加入几行:

另外,为了不影响Tomcat的启停操作,还需要设置iWall的过滤端口,编辑 /usr/local/iwall/conf/ishield.conf 配置文件(这个文件如果没有,可以自己手工新建),在 allowed_ports=8080,80 这一行,明确地写入需要过滤的端口。非Tomcat HTTP 端口不要加入!这点非常重要,否则会无法用./shundown.sh 脚本停止Tomcat。

重新启动Tomcat,tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。

2.6 JBoss的加载

具体添加位置和启动Jboss的方式有关系,以下描述是以Jboss 4.2.3.GA版本为例,启动的脚本位于:/usr/local/jboss-4.2.3.GA/bin/run.sh

先备份该启动脚本:/usr/local/jboss-4.2.3.GA/bin/run.sh

编辑该启动脚本文件,如:vi /usr/local/jboss-4.2.3.GA/bin/run.sh ,在“# Display our environment” 这一行的上面,加入以下三行:

另外,为了不影响Jboss的其他端口,还需要明确设置iWall的过滤端口,编辑 /usr/local/iwall/conf/ishield.conf 配置文件,在 allowed_ports=8080,80 这一行,明确地写入需要过滤的端口。非JBoss HTTP 端口不要加入。

最后重新启动 Jboss,tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。

2.7 Nginx 的加载

Nginx 默认没有启动脚本,没有启动脚本我们就没有办法设定环境变量,所以我们得自己写一个专门给Nginx的启动脚本。方法如下:在Nginx安装目录下,如/usr/local/nginx 目录下,创建一个新的文本文件nginxctrl,其中包含以下内容:

保存退出后,执行chmod +x nginxctrl 给这个脚本加上执行的权限。以后启停Nginx只用这个脚本执行。方法是:

原来Nginx 支持的那些参数,也可以跟在其后使用,如:

最后执行./nginxctrl stop 和 ./nginxctrl start,完整重启一次Nginx。同样再通过 tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。

三、常见问题

3.1 为什么没有拦截效果

需要检查以下几个关键要素:

A. 许可证是否到期。执行: tail /usr/local/iwall/logs/sys.log ,查看最后是否出现以下内容:

看到有“evaluation license expired,”信息,代表许可证已过期,产品回退到只记录不拦截模式。这时候需要申请新的许可证,获得新许可证后,根据里面的用户名和序列号,更新iwall/conf/control.xml许可证文件。

查看sys.log时,最值得关注的是【error】报错级别的信息,这些信息对应的原因,是会对产品的使用有直接影响的。

B. 查看/usr/local/iwall/conf/policy.xml 文件,查看<Response action= 开头的这句,是否为:<Response action="redirect" num="302" text="/" />。【action】的部分必须等于【"redirect" 】

C.是否在本机上直接测试。在本机上直接测试是没有效果的,必须在除本机外的另一台机器上验证。

D.如果为Linux,检查 /usr/local/iwall/conf/ishield.conf,看自己测试的端口,是否在allowed_ports设置里;如果为Windows,检查 C:\Tercel\NetFilter\conf\netfiltersvc.conf ,看"tcp_port_filter":[] 的部分,是否做了设置但没有包含实际在用的端口。比如实际上在测试8080端口,但"tcp_port_filter":[80],这样确实不会过滤8080端口。

E.如果在Windows平台下,上面的每一条原因都检查和排除过了,依然没有拦截效果。可以修改C:\Tercel\NetFilter\conf\netfiltersvc.conf ,把其中 "level":"error", 这一行,改为 "level":"debug",,最后效果如下:

在【管理工具】-【服务】里,再重启netfiltersvc服务。用常规验证方式访问确认,再查看 C:\Tercel\NetFilter\logs\netfiltersvc-yyyymmdd.log 调试日志文件。要特别留意记录下来的的触发进程。如果一个Java类型的中间件,记录下的进程是这样的: 2017-12-12 17:44:30,debug,[HttpFilter]tcpConnected() - nf_getProcessNameA success. pid = 3180, pname = C:\Program Files (x86)\kingsoft\kingsoft antivirus\KANSvr.EXE.

可以看到记录下来的进程是“kingsoft\kingsoft antivirus\KANSvr.EXE.”,隶属于金山杀毒软件。如果碰到这种情况,就是防病毒软件对网络层的控制优先级更高,要排除这种可能性需要完整地停掉防病毒软件,必要时可能需要重启机器。

还原后,记得要把C:\Tercel\NetFilter\conf\netfiltersvc.conf 里的日志级别再改回“error”。

3.2 Linux下按上述步骤正确设置了运行环境,但启动Web服务时报以下错误:

这时候可以执行 ldd /usr/local/iwall/module/libishield.so 命令,查看依赖库关系,如果看到以下直接结果:

问题显然出在最后一行的 libiwx.so 库文件找不到上:“libiwx.so => not found”。这个文件实际位于 /usr/local/iwall/module/libiwx.so,但 /usr/local/iwall/module 目录不是系统的默认库路径,所以没找到 libiwx.so 库文件。这时可以在系统库目录(如/lib64)下做一个软链接,完成后再执行一次ldd,确认依赖库关系没有问题。

3.3 Linux下已经解决依赖库问题,也已按手册要求部署,为什么启动的时候还是出错:

出错的提示如下:

这种提示就是Netfilter和SELinux有冲突的表现,SELinux 禁用了通过PRELOAD加载模块的“危险”做法。为确认,可以再执行:

临时关闭SELinux:执行:setenforce 0

永久关闭SELinux,编辑 /etc/sysconfig/selinux,把其中 SELINUX=enforcing 改为 SELINUX=disabled 。

3.4 一台物理机上有多个Web服务,分属不同端口,有些需要防护,有些不需要防护,应该怎么处理?

假设一台机器上有多个HTTP Web服务,涉及80、88、8080等几个端口,只有80和88需要防护,8080不需要。可以通过Netfilter服务对应的配置文件,指定具体需要过滤的端口。

Windows下,如下编辑: C:\Tercel\NetFilter\conf\netfiltersvc.conf,把tcp_port_filter里,写入“80,88”,重启Netfiltersvc即可。 "tcp_port_filter":[80,88], Linux 下,如下编辑: /usr/local/iwall/conf/ishield.conf ,在allowed_ports里,,写入“80,88”,重启Web服务即可。 [System] loglevel=warn allowed_ports=80,88

3.5 一台物理机上有多个Web服务,属于同一端口,通过不同的域名区分,有些需要防护,有些不需要防护,应该怎么处理?

假设一台机器上绑定了2个域名,分别为 www.safesite.comwww.unsafesite.com 都使用了80端口。但www.safesite.com 需要Netfilter的防护,而 www.unsafesite.com 不需要防护。

编辑Netfilter安装目录下的conf/policy.xml文件(Windows/Linux均相同),把以下这段内容(可能和实际情况略有出入,请以开头和结尾的两个tag<Suites> ... </Sites>为标志位)

修改为以下内容: <Load_rule_set name="pre_check.xml" /> <Load_rule_set name="core.xml" /> <Ignore_variable rule_id="10107" variables="REQUEST_COOKIES:cnzz_eid" /> <Ignore_rule rule_id="16103" /> <Ignore_rule rule_id="11202" /> <Ignore_rule rule_id="70001" > <Ignore_rule_url url="/webwall/" /> <Ignore_rule_remote ip="10." /> </Ignore_rule> <Site id="1" host="www.safesite.com" port="80" suite_id="0" /> <Site id="2" host="www.unsafesite.com" port="80" suite_id="1" />

新增的部分为 <Suite id="1" >...</Suite>和 <Site id="2" ...>,在这个站点2对应的规则套1中,使用的action为nothing,也就是不拦截。同时,这个规则套1里,没有加载任何的规则文件,所以不会有任何动作和拦截。

只需要以此为模板,分别把www.safesite.comwww.unsafesite.com的部分,修改为【需要防护的域名】和【不需要防护的域名】即可。

而其他不属于 www.safesite.comwww.unsafesite.com 域名的HTTP访问,都会落到编号为<Suite id="0">的规则套里。对应上面这个例子,也就是依然会被拦截。

3.6 如果发现上传大文件影响Web程序正常使用怎么办?

在某些较为极端的场景下,大文件的正常上传可能会受到Netfilter的影响。这种场景的表现往往如下:

此时,需要在pre_check比较靠前的位置,加入以下规则:

其中,Item编号2000001里的pattern,对应的是文件上传的Post目标URL,这个务必要准确。如果实在不确定 Post的目标 URL,可以把 Item2000001 整个删除,只保留 Item2000002的部分,这样所有的上传动作就不再检查了。

3.7 Netfilter 是否支持以前的动态版模式?

是支持的。但需要用这个帖子 http://app.tcxa.com.cn/bbs/viewtopic.php?f=5&t=1444&p=4825#p4825 里的 webwall_netfilter.zip。把这个压缩包里的文件,解压到Netfilter安装目录的conf目录下即可。

但是:这个做法是非常非常不推荐的。这个规则集里只有少量的规则,很久没更新了,无论从商务还是技术角度,都尽量不要使用,还是应该尽量使用完整版的iWall/NetFilter。

3.8 日志里出现“HPE_INVALID_METHOD,invalid HTTP method”提示?

如果在安装了Netfilter Linux 版的 logs目录下ishield-yyyymmdd.log 文件里,发现这样的信息:

可以修改iwall/conf/ishield.conf 配置文件(需要20181105只有的iWall版本),加上一行:

重启服务即可。


Last updated:2020/08/14,Author:danzhu