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)。这个可以用在一个应用的数字上,例如像任意包的丢失,或模拟多路经引导无序的包传输的效果。
log [logamount number]当一个数据包用关键字匹配一个规则的时候,工具LOG_SECUR99vY 将这个信息保存到syslogd( 8) 里。记录信息只在变量net.inet.ip.fw.verbose设置为1的情况下出现(这个是被默认的当内核被命令IPFIREWALL_VERBOSE 编译的时候)并且迄今为止被记录的包的号码,他们的那些规则没有超出他们记录的变量。如果没有变量被指定,那么这个限定的从变量net.inet.ip.fw.verbose_limit中提取。
一旦限定被延伸,记录将由清除的计算器或那个进入的包的计算器重新激活。看resetlog 命令。
RULE ACTIONS
一个规则可以用以下的某一种行为设置,就是要执行的那部分当数据包匹配规则躯干的时候。
allow | accept | pass | permit
允许包去匹配规则。停止搜索。
check-state
检查包所依靠的规则。如果一个匹配被发现,则执行规则里联带的行为,另外移动倒下一个规则。Check-state 规则没有躯干。如果一个非Check-state 的规则被发现,则动态的规则将在第一或限定的规则里找。
count 更新计算,为了所有的数据包去匹配规则。寻找下一个规则。
deny | drop
匹配这个规则的要丢弃数据包。搜索结束。
divert port
匹配这个规则的要将数据包转向到此规则提到的端口去,搜索停止。
fwd | forward ipaddr[,port]
改变下一跳在被匹配的数据包到一个ip地址去,这个可以是ip也可以是主机名。
如果ip是本地地址,则被匹配的数据包将被转移到一个本地计算记的端口(或是包上的端口数,如果那个没有被说明在规则里)
如果ip地址是外部的,则端口号(如果被指出)被忽略 ,并且发送到远端的地址,用路由器在本地路由表里寻找那个ip。
一个fwd规则不匹配2层包(那些在ether_input, ether_output, or bridged上的包)
fwd行为不根本改变包的内容。详细说,不更改目的地址,所以数据包被发送到另一个系统通常是被系统拒绝的,除非有一个匹配规则在那个系统上来捕捉他们!至于数据包传送到本地,socket上的本地地址将被放置到数据包的最初的目的地址上,这个使进入的netstat看上去更怪异,但是制定成使用透明的代理服务器了。
pipe pipe_nr
通过的包到虚拟pipe(为了宽带限制的延迟)。看TRAFFIC SHAPER CONFIGURATION。搜索结束,不管出口是从管道并且如果net.inet.ip.fw.one_pass 值没有被设置,数据包仍被传递到下一个防火墙规则。
queue queue_nr
传递包到虚拟queue(为了宽带限制的使用WF2Q)。
rejec 被拒绝,跟无法找到主机一样。
reset 被丢弃的包若是一个tcp包,就试图发送一个tcp重组信息。搜索结束。
skipto number
跳读所有后来的规则号,继续搜索第一个号码和更高的那个。
tee port
发送一个匹配这个规则的拷贝到divert socket邦定的端口。搜索结束,最初的包被接受。
unreach code
按规则丢弃的数据包,发送一个ICMP的带编码的不能得到的提示,这个编码是0-255的一个数字,或者以下列的其中一个:网名,主机名,协议,端口,碎片,失败,网络未知,主机未知,独立的,网络禁用的,主机禁用的,到子网,到子机,过滤禁止,主机优先权或者优先权终止。搜索结束。
RULE BODY
规则的躯干包含0或更多的参数(例如,明确的来源和目的地址或端口,协议选项,进出的接口等等。)那些数据包必须匹配除了别的规则。通常,连接模式都是由操作项固定的。也就是所有的匹配都是按顺序的进行匹配,个别的模式可以由非操作项给于相反的匹配结果。例如 :
ipfw add 100 allow ip from not 1.2.3.4 to any
再有,可供选择的匹配模式能由扩号内输入的模式进行建造,例如:
ipfw add 100 allow ip from { x or not y or z } to any
只有扩号内一种模式被允许。要小心,有一些内核对扩号有特殊的含义,所以明智的办法就是放一个斜杠“\”在他们前面来杜绝这种情况。
一个规则的躯干通常必须有来源和目的地址,关键字"any"可用在不同的地方标示,满足的条件是任意的。
规则的躯干有下列格式:
[proto from src to dst] [options]
第一部分(protocol from src(源) to dst(目的))是用ipfw1兼容的。在ipfw2,任何匹配模式(包括MAC地址,IPv4 protocols,,地址和端口)可以在选项部分被指定。
规则部分有以下含义:
proto: protocol | { protocol or ... }
一个IPv4 协议(或一个,或多个)由号码或名字指定(察看/etc/protocols)。ip或所有的关键字意味着将匹配所有的协议。
src and dst: ip-address | { ip-address or ... } [ports]
一个单独的ip地址,一个或包含多个的,由端口设置决定他们的走向。
ip-address:
一个指定的地址(或地址设置)在下列方法的其中一个里由非操作项控制。
any 匹配任何ip。
me 匹配系统接口的任何ip。在数据包被分析的时候,会查询ip列表的。
numeric-ip | hostname
匹配一个单独的ip地址或主机名,主机名也可以添加防火墙列表的。
addr/masklen
匹配所有的ip地址或主机名(带掩玛的ip段)例如,1.2.3.4/25 ,将匹配所有的ip从1.2.3.0到1.2.3.127。
addr/masklen{num,num,...}
还有一种如下例:1.2.3.4/24{128,35,55,89},此规则则匹配以下ip地址:
1.2.3.128 1.