ipfw规则

PACKET FLOW(包的流程)
ipfw可以从协议堆里的很多地方被调用,在个别系统参数的控制下,最重要的要明白,何时为了设计固有的规则表才发生 。ipfw被调用的如下表示,一起的还有
控制它的sysctl 变量

^ to upper layers V
| |
----------->-----------
^ V
[ip_input] [ip_output] net.inet.ip.fw.enable=1
| |
^ V
[ether_demux] [ether_output_frame] et.link.ether.ipfw=1
| |
-->--[bdg_forward]-->--net.link.ether.bridge_ipfw=1
^ V
| to devices |


有图所示,数据包穿过防火墙的次数可以在0-4之间变化,这依赖于数据包的源,目的地和系统配置 。在每一个位置里,包只被属于自己所在层区域的配置检验 。也就是说,来访的数据包包含Mac头,当ipfw在
规则表总是在执行的,无论是ipfw的调用的地方,还是包来源的地方 。如果一个规则包含一些匹配模式或对调用地方无效的行为(例如当ipfw在ip_input处被调用,去匹配一个MAC头)匹配模式将不匹配 。无论如何,一个没有操作数的模式将导致,此模式永远匹配那些有歹意的数据包 。这是程序员的责任,如果需要,写一个恰当的规则表,以区分有可能涉及到的地方,skipto(跳转)可以被使用,例如:

# packets from ether_demux or bdg_forward
ipfw add 10 skipto 1000 all from any to any layer2 in
# packets from ip_input
ipfw add 10 skipto 2000 all from any to any not layer2 in
# packets from ip_output
ipfw add 10 skipto 3000 all from any to any not layer2 out
# packets from ether_output_frame
ipfw add 10 skipto 4000 all from any to any layer2 out

此时在ether_demu and bdg_forward 之间没有任何区别 。

规则格式:
ipfw规则的格式如下:
[rule_number] [set set_number] [prob match_probability]
action [log [logamount number]] body
body部分的设置是为了过滤信息包的,有以下几种:

Layer-2 header fIElds 当用到的时候
IPv4 Protocol TCP, UDP, ICMP, etc.
Source and dest. addresses and ports
Direction See Section PACKET FLOW
Transmit and receive interface 由名字或地址决定
Misc. IP header fields 版本,服务器种类,数据包长,度 鉴定,片断标记(非零 IP 抵消),存活时间
IP options:
Misc. TCP header fields TCP flags (SYN, FIN, ACK, RST,
etc.), 序号, 确认号, 窗口
TCP options:
ICMP types 对于ICMP的数据包
User/group ID 当数据包能被联系到本地的计算机上
注意上面的信息,举例来说,源MAC或者是IP地址和TCP/UDP端口,容易受到欺骗,所以当过滤这些领域的数据包时,不能保证可以得到预期的效果 。
rule_number
每一条规则都有一个规则号,范围是1..65535,还有一些近来被保留的默认规则 。规则是按规则号有序的被察看 。多种规则可以有同样的号码,在这种情况下,被察看,或列出,也是依照他们在设置中的顺序 。如果一条加入的规则,没有特殊的号码,内核将自动分配一个号码,排在除默认规则的所有规则的最后面,这个自动的号码是由最后一个非默认的规则号给于赋值的如果这个号码与最后一个冲突,则最后一个号码的规则奖被取代(因为自动的序列号可能会超过最大范围) 。
set set_number
每一条规则都有一个设置号,范围是0..31,和一些最近为默认规则所保留 。这个设置号可以个别的激活或段掉,所以对于子规则的操作,这个是最基本也是最重要的了 。他也可以用在单一的规则的删除里,如果一个输入的规则没有设置号,那么将自动赋值0给它!
prob match_probability
一个匹配只是被公开的和一个指定的概率(浮动点在0-1) 。这个可以用在一个应用的数字上,例如像任意包的丢失,或模拟多路经引导无序的包传输的效果 。

推荐阅读