http://forum.eviloctal.com/thread-5526-1-1.html
/* 这份文档主要是基于PktFilter 所附带的PktFilter.pdf,修正了一些原文的错误,增加了一些我自己的使用经验。
我喜欢这个防火墙主要是因为资源占用比较少,UNIX风格,没有图形界面,没有讨厌的的系统托盘图标。
和IP Filter一样,这个防火墙不是为对安全一无所知或者略有所知的人设计的,要打算使用它请确定你了解TCP/IP 协议等基础知识。如果对程序有问题,请写信问程序作者:Jean-Baptiste.Marchand@hsc.fr。如果对使用有问题,也请写信问作者。我对这份文档、规则生成脚本、修改过的程序不提供任何支持。
*/
PktFilter是一个运行在Windows 2000/XP/2003上的包过滤防火墙。
PktFilter自己并没有实现网络过滤驱动,事实上它是系统本身包过滤机制的一个配置界面。Windows 2000以上的操作系统都有一个IpFilterDriver 服务,但是系统本身却没有提供好用的配置界面。
因为是调用系统自身的机制,所以PktFilter工作得很稳定,占用资源也较少,但也正因为如此,PktFilter的功能实现也受限于系统。
PktFilter的规则语法其实是IP Filter4的一个子集。可以参考http://www.ipfilter.org/。
----------
安装使用:
----------
为PktFilter创建一个目录,将pktfltsrv.exe和pktctl.exe拷贝进来。
创建规则文件。大家可以根据下面介绍的语法自己编写规则。如果把PktFilter安装在一台作为网关的机器上,并编写相应的规则,那么PktFilter 可以很好地作为一个网络防火墙工作。
如果只是用来保护个人计算机,不需要设置太复杂的规则,那么你可以使用我写的脚本rulesbuild.cmd。只需设置文件开头的一些变量,就可以迅速地生成一个规则。
安装启动服务:
C:\PktFilter> pktfltsrv -i "C:\PktFilter\PktFilter.conf" "C:\PktFilter\PktFilter.log"
C:\PktFilter> net start pktfilter
-------------
过滤规则介绍:
-------------
全局选项
option
small_frags, 拒绝太小的的分片包,默认small_frags是指小于16 bytes的
分片包。这个值可以通过建立注册表
HKLM\SYSTEM\CurrentControlSet\Services\IpFilterDriver\FragmentThreshold
来设定。
strong_host, 这个文档里面没说,但是程序支持,MSDN的解释是
“Causes a check of the destination address of incoming packets.”
check_frags,这个文档里面没说,但是程序支持,MSDN的解释是
“Causes a check of the fragments from the cache.”
过滤动作
pass, 允许
block, 阻塞
方向
in, 进来的
out, 出去的
协议
proto, 包括:
tcp, TCP 协议
udp, UDP 协议
icmp, ICMP 协议
[number], 指定其他的IP协议号
[empty], 所有协议
源地址
from [addr], 指定一个IPv4地址
from [subnet/mask],指定一个网络
源端口(仅限TCP/UDP协议)
port [表达式] [端口号]
表达式包括:
=
>=
>
<=
<
>< 端口范围
目标地址
to [addr], 指定一个IPv4地址
to [subnet/mask],指定一个网络
目标端口(仅限TCP/UDP协议)
port [表达式] [端口号]
表达式包括:
=
>=
>
<=
<
>< 端口范围
ICMP类型和代码
icmp-type [type]
icmp-code [code]
TCP连接建立
established, 阻塞只有SYN标志位而没有ACK标志位的TCP包,放在规则末尾表示
只允许连接建立后的TCP包通过。
-----
例子:
-----
# drop packets composed of small fragments
option small_frags on eth0
# default behavior = deny everything
block in on eth0 all
block out on eth0 all
# allow DNS resolution to our nameserver
pass out on eth0 proto udp from 192.168.1.1 port > 1023 to 192.168.1.254 port = 53
pass in on eth0 proto udp from 192.168.1.254 port = 53 to 192.168.1.1 port > 1023
# allow inbound ICMP traffic (ping)
pass in on eth0 proto icmp from any to 192.168.1.1 icmp-type echo
pass out on eth0 proto icmp from 192.168.1.1 type echo-rep to any
# allow RDP (Terminal Services) administration from our administration subnet
pass in on eth0 proto tcp from 10.42.42.0/24 port > 1024 to 192.168.1.1 port = 3389
pass out on eth0 proto tcp from 192.168.1.1 port = 3389 to 10.42.42.0/24 port > 1024 established
-------------
过滤规则参考:
-------------
过滤规则由全局选项(global-option)和普通规则(normal-rule)组成。
全局选项的语法:
"option" global_option iface
现在支持的global-option只有"small_frags"。
普通规则的语法:
action [in-out] iface [proto_spec] ip [proto-options]
action = "pass" | "block"
in-out = "in" | "out"
iface = "on" ifname digit
ifname = "eth*" | "ppp" | "sl" | "lo" | "tr" | "fd"
proto_spec = "proto" [proto]
proto = "tcp" | "udp" | "icmp" | "any" | ip_proto
ip_proto = decnumber
decnumber = digit [decnumber]
ip = "all" | "from" ip-addr [port-comp | port-range] "to" ip-addr
[port-comp | port-range]
ip-addr = "any" | ip-dotted-addr [ip-mask]
ip-dotted-addr = host-num "." host-num "." host-num "." host-num
host-num = digit [digit [digit]]
ip-mask = "/" ip-addr | decnumber
port-comp = "port" comparator decnumber
comparator = ">" | ">=" | "<" | "<=" | "="
port-range = "port" decnumber "><" decnumber
proto-options = "icmp-type" icmp-type ["code" icmp-code] | "established"
icmp-type = "echorep" | "unreach" | "squench" | "redir" | "echo" | "router_adv"|
"router_sol" | "timex" | "paramprob" | "timest" | "timestrep" |
"inforeq" | "inforep" | "maskreq" | "maskrep"
icmp-code = decnumber
-----------------
pktctl命令的用法:
-----------------
pktctl有两种用法:命令行模式和交互模式。pktctl -i进入交互模式。
列出网络接口:
C:\> pktctl -I
eth0: (3Com EtherLink PCI): 192.168.0.1
加载规则文件:
C:\> pktctl -f rules.txt
pktctl> source rules.txt
先清除所有已加载的规则再加载规则文件:
C:\> pktctl -F rules.txt
pktctl> reload rules.txt
手工临时添加一条规则:
C:\> pktctl -a "pass in on eth0 from 10.0.0.42 to any"
pktctl> pass in on eth0 proto udp from 10.0.0.42 to any
列出指定接口上的规则:
C:\> pktcl -l eth0
pktcl> list on eth0
列出指定接口上的规则和规则号:
option:
C:\> pktcl -L eth0
pktcl> List on eth0
在删除规则的时候需要指定规则号。
删除规则:
C:\> pktctl -d 2 eth0
删除指定接口上的所有规则:
C:\> pktctl -Fa eth0
pktctl> flush on eth0
删除所有接口上的所有规则:
C:\> pktctl -Fa all
C:\> pktctl -Fa
pktctl> flush on all
显示过滤情况的统计数据:
C:\> pktctl -s eth0
pktctl> stats on eth0
显示过滤情况的详细统计数据:
C:\> pktctl -S eth0
pktctl> Stats on eth0
----------------------
pktfltsrv的命令行选项:
----------------------
-i "path_to_rules_file" "path_to_log_file"
-u: uninstalls the service.
一些问题:
1、在Windows XP + SP1 上不能记录日志。
这是XP的问题,SP1 iphlpapi.dll的PfSetLogBuffer函数工作不正常。(这个问题是PktFilter邮件列表上的)
2、添加某些格式不正确的规则时可导致服务崩溃。
3、因为只有SDK的WinBase.h才定义了INVALID_SET_FILE_POINTER。所以编译pktfltsrv的时候需要在VS的tools--options里面把SDK的include目录放到最前面。我现在的机器没有安装SDK,是把以前的安装目录copy过来用的,所以需要手工设。我不记得直接安装SDK后是否会直接用SDK的文件覆盖VC的文件,如果那样的话,可能就不需要多此一举了。
4、在Windows 2000 Pro版本上未必能够运行,我没试验,只是MSND谈到那些函数的时候总是说:
“Included in Windows 2000 Server and Windows .NET Server.”
5、pktctl.exe -l命令列规则的时候适配器和协议两个字段之间没有空格,我给加了一个。filter_stats.c/70行。
可能作者没留神少了一句,所以ICMP类型和状态码不能记录下来,加上了。logging.c/187行。
不能记录ttl,tcp窗口值等信息,加上了。
有些记录格式我看着不习惯,改了。
6、程序实现原理可以参考:
http://msdn.microsoft.com/librar ... ering_reference.asp
附:规则生成脚本: