支持从Windows2008 R2开始的各主流操作系统平台。
在支持的平台下,双击安装程序如 NetFilter_Setup_yyyymmdd.exe,按提示完成安装。安装过程中需要输入许可证(后续输入也是可以的)。
安装完成后,会在系统服务里增加一个名为【netfiltersvc】的服务。该服务启动时,自动过滤所有流入的HTTP流量;该服务停止时,也停止过滤行为。
如果仅需做监控,不需要拦截和干预,可以修改 C:\Tercel\NetFilter\conf\policy.xml 配置文件,把这一行:
<Response action="redirect" num="302" text="/" />
改为:
xxxxxxxxxx
<Response action="nothing" num="302" text="/" />
重启【netfiltersvc】服务即可。
在另一台机器上(一定要在另一台机器上执行!),用浏览器访问 http://安装机器ip:http端口/1.log,如http://192.168.100.12/1.log,在C:\Tercel\NetFilter\logs 目录下,能看到 alert-yyyymmdd.log当天日期的报警文件里,写入了一条访问 /1.log 的报警。
cmd回到命令行状态,执行msinfo32.exe,在“环境驱动程序”分类里,搜索“netfiltertc”,如能找到,则代表我们的模块已加载。
查看 C:\Tercel\NetFilter\logs\sys.log 文件里,最后部分里这一行的时间:
xxxxxxxxxx
2017-11-23 14:38:31 notice 'evaluation license (2017-12-4).'
如果无需过滤所有的HTTP流量,可以编辑 C:\Tercel\NetFilter\conf\netfiltersvc.conf,把以下这句:
xxxxxxxxxx
"tcp_port_filter":[],
在方括号里,填入所需过滤的端口,如果有多个,以逗号分隔:
xxxxxxxxxx
"tcp_port_filter":[80,8080],
修改后需要重启【netfiltersvc】服务。
支持从2.6.18 开始的大部分主流操作系统平台。
NetFilter的安装程序需要和具体操作系统的内核版本相匹配,不能差异太大。确定内核版本的方式:
xxxxxxxxxx
uname -an
得到具体的内核版本:
xxxxxxxxxx
Linux 64.rhel73.test 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linu
如上例的结果,可以选用内核 3.10 64位的安装版本。
把适用的安装程序放在系统的任意目录下,如以 /tmp/iwall_2.1_Linux_2.6.32-71.el6.x86_64_x86_64_20171110.tar.gz。执行:
xxxxxxxxxx
cd /tmp
tar xzvf iwall\_2.1\_Linux\_2.6.32-71.el6.x86\_64\_x86\_64\_20171110.tar.gz
cd iwall\_2.1
./install.sh
根据提示,把程序默认安装在:/usr/loal/iwall 目录下。以下举例均假设安装在默认目录。
到这一步只是完成了程序自身的安装,还需要根据具体的中间件或Web服务版本,一一加载。由于每种中间件和Web服务的启动方式并不相同,所以我们的加载方式也随之变化。
以下2.3-2.XX为各种Web服务的具体加载方式。
编辑 /etc/sysconfig/httpd 配置文件,在该文档的最后加入几行:
xxxxxxxxxx
ISHIELD_WORKDIR=/usr/local/iwall
LD_LIBRARY_PATH=/usr/local/iwall/module:$LD_LIBRARY_PATH
LD_PRELOAD=/usr/local/iwall/module/libishield.so
重新启动Apache,tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。
xxxxxxxxxx
apachectl restart
tail /usr/local/iwall/logs/sys.log
如该编译版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
如该Tomcat的安装目录位于 /usr/local/tomcat7,则编辑 /usr/local/tomcat7/bin/setclasspath.sh 脚本文件,在该文档的最后加入几行:
xxxxxxxxxx
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
另外,为了不影响Tomcat的启停操作,还需要设置iWall的过滤端口,编辑 /usr/local/iwall/conf/ishield.conf 配置文件(这个文件如果没有,可以自己手工新建),在 allowed_ports=8080,80 这一行,明确地写入需要过滤的端口。非Tomcat HTTP 端口不要加入!这点非常重要,否则会无法用./shundown.sh 脚本停止Tomcat。
x[System]
loglevel=warn
allowed_ports=8080,80
重新启动Tomcat,tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。
具体添加位置和启动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
xxxxxxxxxx
cd /usr/local/jboss-4.2.3.GA/bin/
cp run.sh run.sh.bak
编辑该启动脚本文件,如:vi /usr/local/jboss-4.2.3.GA/bin/run.sh ,在“# Display our environment” 这一行的上面,加入以下三行:
xxxxxxxxxx
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
# Display our environment**
echo "===================================================
另外,为了不影响Jboss的其他端口,还需要明确设置iWall的过滤端口,编辑 /usr/local/iwall/conf/ishield.conf 配置文件,在 allowed_ports=8080,80 这一行,明确地写入需要过滤的端口。非JBoss HTTP 端口不要加入。
xxxxxxxxxx
[System]
loglevel=warn
allowed_ports=8080,80
最后重新启动 Jboss,tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。
Nginx 默认没有启动脚本,没有启动脚本我们就没有办法设定环境变量,所以我们得自己写一个专门给Nginx的启动脚本。方法如下:在Nginx安装目录下,如/usr/local/nginx 目录下,创建一个新的文本文件nginxctrl,其中包含以下内容:
xxxxxxxxxx
#!/bin/bash
# filename: nginxctrl
DIRNAME=`dirname $0`
NGINX=${DIRNAME}/sbin/nginx
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
case $1 in
start)
$NGINX
;;
stop)
$NGINX -s stop
;;
reload)
$NGINX -s reload
;;
*)
$NGINX "$@"
esac
保存退出后,执行chmod +x nginxctrl 给这个脚本加上执行的权限。以后启停Nginx只用这个脚本执行。方法是:
xxxxxxxxxx
./nginxctrl start #启动
./nginxctrl stop #停止
./nginxctrl reload #重载
原来Nginx 支持的那些参数,也可以跟在其后使用,如:
xxxxxxxxxx
./nginxctrl -v #简单版本显示
./nginxctrl -V #详细编译参数显示
./nginxctrl -t #配置文件语法校验
./nginxctrl -s quit #
最后执行./nginxctrl stop 和 ./nginxctrl start,完整重启一次Nginx。同样再通过 tail -f /usr/local/iwall/logs/sys.log 查看iWall启动日志,确认是否正常。
需要检查以下几个关键要素:
A. 许可证是否到期。执行: tail /usr/local/iwall/logs/sys.log ,查看最后是否出现以下内容:
xxxxxxxxxx
2017-11-27 18:01:06 info 'check configuration.'
2017-11-27 18:01:06 notice 'evaluation license (2010-12-31).'
2017-11-27 18:01:06 error 'evaluation license expired, change to log mode.'
2017-11-27 18:01:06 warning 'service expired, visit <www.tcxa.com.cn> please.'
2017-11-27 18:01:06 info 'all configuration ok.'
看到有“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",,最后效果如下:
xxxxxxxxxx
{
"log":
{
"dir":"logs",
"level":"debug",
"mode":"day"
}
......
}
在【管理工具】-【服务】里,再重启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”。
xxxxxxxxxx
[root@64 http]# apachectl start
ERROR: ld.so: object '/usr/local/iwall/module/libishield.so' from LD_PRELOAD cannot be preloaded: ignored.
这时候可以执行 ldd /usr/local/iwall/module/libishield.so 命令,查看依赖库关系,如果看到以下直接结果:
xxxxxxxxxx
[root@64 http]# ldd /usr/local/iwall/module/libishield.so
linux-vdso.so.1 => (0x00007ffe33ee4000)
libc.so.6 => /lib64/libc.so.6 (0x00007f75bc649000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f75bc42d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f75bc228000)
/lib64/ld-linux-x86-64.so.2 (0x00005621d2e97000)
libiwx.so => not found
问题显然出在最后一行的 libiwx.so 库文件找不到上:“libiwx.so => not found”。这个文件实际位于 /usr/local/iwall/module/libiwx.so,但 /usr/local/iwall/module 目录不是系统的默认库路径,所以没找到 libiwx.so 库文件。这时可以在系统库目录(如/lib64)下做一个软链接,完成后再执行一次ldd,确认依赖库关系没有问题。
xxxxxxxxxx
#把libiwx.so通过软链接放到系统库目录/lib64下
[root@64 module]# ln -sf /usr/local/iwall/module/libiwx.so /lib64/libiwx.so
#再执行一次ldd依赖库关系检查,确保不再出现“not found”的提示
[root@64 module]# ldd /usr/local/iwall/module/libishield.so
linux-vdso.so.1 => (0x00007ffe11df5000)
libc.so.6 => /lib64/libc.so.6 (0x00007feadc306000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007feadc0ea000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007feadbee5000)
libiwx.so => /lib64/libiwx.so (0x00007feadbc4b000)
/lib64/ld-linux-x86-64.so.2 (0x00005558e6191000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007feadba14000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007feadb810000)
出错的提示如下:
xxxxxxxxxx
[root@64 module]# apachectl stop
ERROR: ld.so: object '/usr/local/iwall/module/libishield.so' from LD_PRELOAD cannot be preloaded: ignored.
这种提示就是Netfilter和SELinux有冲突的表现,SELinux 禁用了通过PRELOAD加载模块的“危险”做法。为确认,可以再执行:
xxxxxxxxxx
[root@64 audit]# grep -i iwall /var/log/audit/audit.log
## 看到以下内容即为SELinux的拦截:
type=AVC msg=audit(1511837991.849:3874): avc: denied { execute } for pid=8089 comm="systemd-tty-ask" path="/usr/local/iwall/module/libishield.so" dev="dm-0" ino=51338680 scontext=unconfined_u:system_r:systemd_passwd_agent_t:s0 tcontext=unconfined_u:object_r:usr_t:s0 tclass=file
临时关闭SELinux:执行:setenforce 0
xxxxxxxxxx
[root@64 audit]# setenforce 0
永久关闭SELinux,编辑 /etc/sysconfig/selinux,把其中 SELINUX=enforcing 改为 SELINUX=disabled 。
xxxxxxxxxx
[root@64 audit]# cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
假设一台机器上有多个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
假设一台机器上绑定了2个域名,分别为 www.safesite.com 和www.unsafesite.com 都使用了80端口。但www.safesite.com 需要Netfilter的防护,而 www.unsafesite.com 不需要防护。
编辑Netfilter安装目录下的conf/policy.xml文件(Windows/Linux均相同),把以下这段内容(可能和实际情况略有出入,请以开头和结尾的两个tag<Suites> ... </Sites>为标志位)
xxxxxxxxxx
<Suites>
<Suite id="0" description="default site">
<Load_rule_set name="pre_check.xml" />
<Load_rule_set name="core.xml" />
<Response action="redirect" num="302" text="/" />
<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>
</Suite>
</Suites>
<Sites>
<Site id="1" host="" port="80" suite_id="0" />
</Sites>
修改为以下内容:
新增的部分为 <Suite id="1" >...</Suite>和 <Site id="2" ...>,在这个站点2对应的规则套1中,使用的action为nothing,也就是不拦截。同时,这个规则套1里,没有加载任何的规则文件,所以不会有任何动作和拦截。
只需要以此为模板,分别把www.safesite.com 和 www.unsafesite.com的部分,修改为【需要防护的域名】和【不需要防护的域名】即可。
而其他不属于 www.safesite.com 和 www.unsafesite.com 域名的HTTP访问,都会落到编号为<Suite id="0">的规则套里。对应上面这个例子,也就是依然会被拦截。
在某些较为极端的场景下,大文件的正常上传可能会受到Netfilter的影响。这种场景的表现往往如下:
此时,需要在pre_check比较靠前的位置,加入以下规则:
xxxxxxxxxx
<Rule id="20000" name="bypass file upload check" severity="error" phase="1" log="bypass file upload check">
<Item id="2000001" variables="REQUEST_FILENAME" transforms="lowercase" method="streq" pattern="/cms/login/upload/upload.do" action="next,pass" />
<Item id="2000002" variables="REQUEST_HEADERS:Content-Type" transforms="none" method="contain" pattern="multipart/form-data" action="pass_all,pass" />
</Rule>
其中,Item编号2000001
里的pattern,对应的是文件上传的Post目标URL,这个务必要准确。如果实在不确定 Post的目标 URL,可以把 Item2000001
整个删除,只保留 Item2000002
的部分,这样所有的上传动作就不再检查了。
是支持的。但需要用这个帖子 http://app.tcxa.com.cn/bbs/viewtopic.php?f=5&t=1444&p=4825#p4825 里的 webwall_netfilter.zip。把这个压缩包里的文件,解压到Netfilter安装目录的conf目录下即可。
但是:这个做法是非常非常不推荐的。这个规则集里只有少量的规则,很久没更新了,无论从商务还是技术角度,都尽量不要使用,还是应该尽量使用完整版的iWall/NetFilter。
如果在安装了Netfilter Linux 版的 logs目录下ishield-yyyymmdd.log
文件里,发现这样的信息:
xxxxxxxxxx
2018-11-02 00:00:19, warn, bad request from ::ffff:127.0.0.1, to ::ffff:127.0.0.1:8080;HPE_INVALID_METHOD,invalid HTTP method
可以修改iwall/conf/ishield.conf 配置文件(需要20181105只有的iWall版本),加上一行:
xxxxxxxxxx
ignore_unknown_proto=1
重启服务即可。
Last updated:2020/08/14,Author:danzhu