win下pktfilter防火墙的使用

http://forum.eviloctal.com/thread-5526-1-1.html


/* 这份文档主要是基于PktFilter 所附带的PktFilter.pdf,修正了一些原文的错误,增加了一些我自己的使用经验。

我喜欢这个防火墙主要是因为资源占用比较少,UNIX风格,没有图形界面,没有讨厌的的系统托盘图标

和IP Filter一样,这个防火墙不是为对安全一无所知或者略有所知的人设计的,要打算使用它请确定你了解TCP/IP 协议等基础知识。如果对程序有问题,请写信问程序作者:[email protected]。如果对使用有问题,也请写信问作者。我对这份文档、规则生成脚本、修改过的程序不提供任何支持。
*/
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

附:规则生成脚本:

你可能感兴趣的:(windows,网络,tcp,防火墙,filter,文档)