ipfw中文man(1)
时间:2010-04-19 来源:38699678
翻译人:chinaunix的lsstarboy
ipfw是FreeBSD下的一个用户界面,它用来控制ipfw防火墙和流量整形。BSD爱好者乐园 `$F(Yne)k
BSD爱好者乐园LV3`d&KLf
BSD爱好者乐园#`u7Y8z!A r.tQ
ipfw的配置,也叫做规则集,它是由一系列的规则组成的,这些规则的编号是从1到65535。通过ipfw的数据包可以来自协议栈的许多各个的地方(这主要依赖于数据包的来源和目的,某些数据包很可多次经过防火墙)。数据包在通过防火墙的时候,要和防火墙规则集逐条对比。如果发现匹配的规则,则执行相应规则的动作。BSD爱好者乐园h8S'G&TYE@w/H&h,p'pB
BSD爱好者乐园+^T7T0T7xIW"x qM
在特定的规则动作和系统设置下,数据包在匹配完一个规则后,可能在某些规则之后重新进入防火墙。
j(T"F]~4PuE/KYIN
@,Vi)TR 一个ipfw规则集总是包含一个默认的规则(编号为65535),这个默认规则匹配所有的数据包,不能修改或删除。根据内核配置的不同,这个默认规则或者是拒绝所以数据包通过,或者是允许所有数据包通过。BSD爱好者乐园3WW^;rh;e#p
BSD爱好者乐园M1tQDlP
如果规则集中存在一个或多个包含有keep-state(状态保持)或limit(限制)的规则,那么ipfw就表现为状态保持。例如:当这种规则匹配 了一个数据包时,ipfw将创建一个动态规则,让后来的,同这个数据包的地址和端口参数严格一致的数据包,与这个动态规则相匹配。
@U"f~dT8A}kBSD爱好者乐园d;~4B4P3zL
这些动态规则,都有一个有限的生存期。生存期在第一次遇到check-state、keep-state或者是limit规则时被检查。这些动态规则的 典型应用,是用来保证合法的数据包在通过时开启防火墙。查看下面的“状态防火墙”和“示例”章节,获取更多关于状态保持的信息。
[_@T8rq%O[BSD爱好者乐园2edO3rE9E
包括动态规则在内的所有规则,都有几个相关的计数器:一个包计数器,一个字节计数器,一个记录计数器和一个用来提示最后匹配时间的时间戳。这些计数器都可以被ipfw命令显示和清零。BSD爱好者乐园@M,caY)Hr Z
#^v@M~0\L#Ja 可以用add命令来添加规则;可以用delete命令来删除单个或一组规则;可以用flush命令来删除所有的规则(set 31除外);可以用show和list命令来显示包括计数器在内的信息。最后,计数器可以被zero和resetlog命令清零。BSD爱好者乐园v&CoM7Jh$|
BSD爱好者乐园Av+e:R)R
并且,每个规则隶属于32个不同的规则集中的一个。有一些ipfw的命令可以独立地操作这些规则集,例如:启动、禁止、交换规则集;把一个规则集中的所有规则移动到另一个规则集;删除一个规则集中的所有规则。这对于安装临时配置,或者是测试配置是非常有用的。查看“规则的规则集”一节,获取更多关于set的信息。 BSD爱好者乐园8ww5T6f{!}s
BSD爱好者乐园6uT$LA9@TIWUN
以下是ipfw命令可以利用的选项:
8u9eK'rI0TDeBSD爱好者乐园%mn1S1r@\
-a 使用 list 时,列出数据包的计数器,show命令包含这个选项。BSD爱好者乐园7D+}lg L6h
BSD爱好者乐园:S+lQCtw9R
-b 只显示动作和注释,不显示规则体。包含-c选项。BSD爱好者乐园,e;x;Qy-wpYe
BSD爱好者乐园+_(U2m{;D"QD0q
-c 进入或显示规则时,用紧凑格式输出。例如:在没有任何附加意义的情况下,不显示“ip from any to any”字符串。BSD爱好者乐园is0j#yY
BSD爱好者乐园0q_6R\#g`N
-d 在list时,在显示静态规则的同时,显示动态规则。BSD爱好者乐园;|3p"f/lG&Z6W*S+uX9G
BSD爱好者乐园9Q3y0h{5nnV
-e 在list时,如果指定了-d选项,则显示过期的动态规则。
2c Lp sO1fBSD爱好者乐园 }lwU'K
-f 对于有些会导致问题的命令,不要提出确认的询问。例如:flush命令。哪果一个进程没有相关的tty,这个是默认被包含的选项。(译注:没看懂这句话的意思,好像是如果不是在tty中输入的命令,比如在scripts中,默认是有-f的。)
?;Pn5W1](Y%i0|6wvBSD爱好者乐园AnPK f
-n 只检查命令的语法,不真正执行命令。
3s.qdL5A
6I%Gwl2`JU-N 尝试在输出中,解析地址和服务名。
Cq l:jDU8q c
@wV4?;RacO*C{D-q 当新增 (add)、归零(zero)、重置日志(resetlog)或清除(flush) 时,不要显示任何回应信息(就像使用-f选项一样)。这对于在脚本里 利用ipfw命令来调整防火墙规则(例如执行“sh /etc/rc.firewall”脚本)、或者是处理与一个远程登录相关的有多条ipfw命令的,是非常有用的。同时,它防止无意间,在规则中加入或删 除一个列表而导致的错误。(译注:没看懂,好像下面是一个例子。)在正常的模式,默认内核配置下,一个flush命令会输出一个信息。因为所有的规则都被 清除掉,这个消息又不能传送到登录的进程中,脚本后面的规则将无法执行,所以将导致远程连接中断。这时,只好回到计算机前去工作了。BSD爱好者乐园e*gxtrn
BSD爱好者乐园+[9pa4`Y
-S 当列出一个规则的时候,显示每条规则的规则集号。如果没有指定这个标识,则被禁止的规则不再显示。
s3r4B'DI7|9Y"fr
bn&s)W^[;p-s [field]BSD爱好者乐园5u$q.q4xmgFG
当显示pipe时,按照四个计数器之一排序显示。(对于所有的数据包、当前数据包或者是字节数)
0Z B2pH)X\
$`D-` T6xsD ?g-dv)C-t 当列出时,显示最后匹配的时间戳。(显示用ctime()转化后的时间)BSD爱好者乐园6CwW]-B6G
BSD爱好者乐园f~'G5B,cY/wYE
-T 当列出时,显示最后匹配的时间戳。(从新纪元到现在的秒数)。这个格式更容易被脚本处理。
1a!V0G"_+b@
5]$z bZ(~I 为了使配置更容易,规则可以写到一个文件里 供ipfw处理,语法规则参照大纲栏最后一行(译注:指本文最前面的语法部分最后一行,即:“ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname”)。注意必须是绝对路径。这个文件会被逐行读取并且将作为ipfw工具的参数处理。 BSD爱好者乐园[#dd!EO q2k/r
\3e bWr5U+`4u 作为选择,你还可以使用-p preproc参数来使用预处理程序,其中路径是用管道来传入的。可以使用的预处理程序包括cpp和m4。如果preproc不是以"/"开头,那么将搜 索PATH里的路径。在使用它的时候,要谨慎,因为在很多时候,ipfw启动时,系统文件可能没有挂接(比如:文件系统是通过NFS挂接的)。一旦使用了 -p参数,所有其它的参数,都被传送到预处理程序去等待处理。
U2x(O3Jq(PBSD爱好者乐园1\xM9dL H}
3^[x,e{H8XZ/N ipfw的pipe和queue命令用来配置流量整形,你可以下面的“TRAFFIC SHAPER (DUMMYNET) CONFIGURATION”节看到看到相关内容。
C&x!r,kmu.oBSD爱好者乐园:XX4M%]V&~
如果系统的world和内核不能保持一致,ipfw的ABI将失效,以防你加入任何规则。这样能保证你的顺利地完成启动过程。你可以利用ipfw临时禁止的机会登录你的网络,来修复你的问题。
2S"|ro E/dl]`CBSD爱好者乐园NdW7N `P
BSD爱好者乐园R7{qf:|e
PACKET FLOW(数据包流程)
U^"?h1Z;gBSD爱好者乐园$_!u+K*Fs$[fm
一个数据包在几个内核变量的控制下,在协议栈的多个地方被防火墙检查。这些地方和变量如下图所示,要在头脑中保持下图,它对于规划一下正确的规则集是非常重要的。
"JTLySFS?GBSD爱好者乐园,vmze8Q'Zp
BSD爱好者乐园J#qGu.IH
^ 到上层 V
r2Y!e1AD"D0L | |
:]b3AuW;gAE4p9C9q$Lj +----------->-----------+BSD爱好者乐园E"we@,DUj
^ VBSD爱好者乐园dK}a|
[ip(6)_input] [ip(6)_output] net.inet(6).ip(6).fw.enable=1BSD爱好者乐园5u%t3Q"d%W!d I0FC+w
| |
$K'W/F3u2b*]1s4|)M\ ^ V
7ml\$ZbJ] [ether_demux] [ether_output_frame] net.link.ether.ipfw=1
T"bA*q-JOQFYn | |
#j^r0IT9j +-->--[bdg_forward]-->--+ net.link.bridge.ipfw=1BSD爱好者乐园8PRM7je6{[&_jJA
^ V
SmMso0sW,b1t | 到设备 |BSD爱好者乐园ffMequ
BSD爱好者乐园 fXZ8OVg
BSD爱好者乐园+p.A*S(Jc.u pu a+m4x[
"f"J*By+R^ 如图所示,根据数据包的源和目的,以及系统配置的不同,同一个数据包穿过防火墙的次数在0和4之间变化。
"usU:^-a(Yr
pb%|'t(h4Tw-b/i?h;o 需要注意的是,在包通过不同栈的时候,头会被加上或剥离,可能会导致这些包被检查不到。例如:当ipfw被ether_demux()调用的时候,进入 的包将包括MAC头;而当ipfw被ip_input()或者ip6_input()调用的时候,同一个数据包的MAC头将被剥离。
0]!xyw*c6]fv
&y-X?-Z5O(}!t 还需要注意的是:不论检查发生在什么地方,也不论数据包源自哪里,每个数据包也整个规则进行对照。(译注:是整个规则集吗?有时候只对照一部分的时候就 中止检查)。如果一个规则包含的一些匹配模型或动作不符合某处的要求(比如:在ip_input或ip6_input处匹配MAC头),那么匹配模型将不 会被匹配。然而,带有not前缀操作符的匹配模型,总是可以和这些数据包相匹配。所以,如果有必要,在有很多地方可以选择的时候,有能力的程序员可以为写 出的规则集选择一个合适的位置。skipto规则在这儿是非常有用的。例如:BSD爱好者乐园 Z(G3dF+i$D-b
tR S#Ls7D6z%ZX # packets from ether_demux or bdg_forwardBSD爱好者乐园7Y;?X7D8ZmC
ipfw add 10 skipto 1000 all from any to any layer2 inBSD爱好者乐园bs;tH;u6S
# packets from ip_input
#u\/_)swQOp7pL ipfw add 10 skipto 2000 all from any to any not layer2 in
'jN)d[K # packets from ip_outputBSD爱好者乐园1n iuNW jZ
ipfw add 10 skipto 3000 all from any to any not layer2 out
d n:T v9Q)s:|? # packets from ether_output_frame
jD[4h7ej ipfw add 10 skipto 4000 all from any to any layer2 outBSD爱好者乐园.rd5uf"SV
BSD爱好者乐园&I2M's!v:V%z0f+NF
(对,在这儿,没有办法区别ether_demux和bdg_forward)BSD爱好者乐园G9O,S*pB&p
qB,r-O\3\Zg.cV)S
I$G3aa,{.t3W(I[_SYNTAX(语法规则)BSD爱好者乐园P_py W6w
-LD2i5o6_Q&R 通常,每个关键字或者参数都是作为独立的命令行参数来提供的,前后都不能有空格。关键字是区分大小写的,而参数按照它们本身的含义,可以是,也可以不是区分大小写的。(例如,udi要区分大小写,而hostname没有必要区分大小写)
X;j;gN_flwBSD爱好者乐园B"yq6Y0mK
在ipfw2中,为了提高可读性,可以在逗号后面加上一个空格。当然,你也可以把整个命令(包括参数)当作一个参数来处理(译注:就是加上双引号,作为一个字符串放到某个命令中)。例如,以下几种格式效果相同:
lJ+?o9`5nk2h
'I-VZ;Mh u:?0O ipfw -q add deny src-ip 10.0.0.0/24,127.0.0.1/8
$fl6F H7H)Tke)W5~w ipfw -q add deny src-ip 10.0.0.0/24, 127.0.0.1/8 (译注:127前面有个空格)
Oh3elNBSD爱好者乐园9i%U;?$yW8|eU0_y
BSD爱好者乐园eT'C2a M j
&K `Gs$^%fRULE FORMAT(规则格式)
gTp |Y'sl
5qe*LyD3K%PLO{8q ipfw的规则格式如下:BSD爱好者乐园:e _M%}ML t'T
BSD爱好者乐园:[-k1FV8E.KPx,{
[rule_number] [set set_number] [prob match_probability] action
m"?*xf6V7n!I R,?$@ [log [logamount number]] [altq queue] [{tag | untag} number] bodyBSD爱好者乐园VP"A*m8c1F,Nb
BSD爱好者乐园i0e:Q,c1Q v
规则的 body 部分用来设定包过滤的信息,具体细节如下:
q6Z+a8p ?%N SR%KZBSD爱好者乐园!v(Ul q%h:h/K#z@U
Layer-2 header fields 第二层头段,什么时候可用
M N*I5PC#I7D
bq+ZcGo0H'iV:n IPv4 and IPv6 Protocol TCP, UDP, ICMP, 协议等BSD爱好者乐园x4Oz6B1rpF%I7r
[ _~ _zifX&u Source and dest. addresses and ports 源和目的。地址和端口
il.z"^7[&W
k*O#_:ej Direction 数据包的流向,见“流量整形”一节BSD爱好者乐园AC"iq4FJ
L`;DQ,gc Transmit and receive interface 传输和接收界面,用名字或地址表示BSD爱好者乐园xP;` f6pWTphe
(G-h]]?2_ Misc. IP header fields 组合IP头字段,包括版本、服务类型、报文长度、唯一标识、分段标志、生存期BSD爱好者乐园wi'b)?b:ct:u
5X*}haB3F0q8^3_o IP options IP选项字段
6?x{8CH*@.svsg1x
gZ2`^,B%ch IPv6 Extension headers IPv6扩展头,包括分片报头、中继选项报头、路由报头、路路由选择报头、IP层安全服务选项、Source routing rthdr0, Mobile IPv6 rthdr2(译注:最后两项不知道怎么翻译)BSD爱好者乐园Y ?/K'~Vkk!YJ
tC\/g\EB3g IPv6 Flow-ID IPv6的流量标识BSD爱好者乐园c7|WQ+W;fN/J
|+r qc X^[u Misc. TCP header fields 组合tcp头字段,有TCP标志(syn,fin,ack,rst等)、序列号、回复号,窗口等。BSD爱好者乐园E*z0H2I~DZ.irg I
BSD爱好者乐园RjsH9l
TCP options TCP的选项
|;De[U`
h.HU:[G D5LG/R(T6z ICMP types ICMP包BSD爱好者乐园Vs4Oj+{"v#Z
BSD爱好者乐园)^F?$tFK
ICMP6 types ICMP6包
mV3dOd9z*d BSD爱好者乐园Y-}w:F'e0]4m
User/group ID 本地栈所归属的用户和组BSD爱好者乐园~*i"eXO
a&O&o*?+KO3X] Divert status 是不是源自一个divert接口(例如:natd(8))BSD爱好者乐园 _!XkCR6mo
\Z|*\/y)iR"\ 需要注意,上面的很多信息中,比如源MAC和IP地址、TCP/UDP端口等,是比较容易伪造的,所以只对这些信息进行过滤不能保证达到预期的效果。
V,~ Sp2n;K,O6ABSD爱好者乐园 J p7f8n0D tcv
J;l7u-m6T rule_numberBSD爱好者乐园v h$z$K}
每个规则都有规则号,规则号从1-65535。65535是保留的默认规则。ipfw将按规则号的顺序依次检查这些规则。可以有多个规则用同一个规则 号,在这种情况下,将按照它们的添加顺序依次检查或列出。如果一个规则没有指定规则号,内核将自动赋于一个规则号,使它成为默认规则前的最后一个规则(即 小于65535)。自动添加的规则号有个步进值,在不大于65535的情况下,每次添加规则时,都自动加上这一步进值。它默认是100,对应于 net.inet.ip.fw.autoinc_step这个内核变量。BSD爱好者乐园d~rm/{
BSD爱好者乐园/s0{C_ `z#C/c&k
set set_number
1_6kL"?^g| ^
z4NYHe7J%XI 每个规则都对应于一个规则集编号,规则集编号取值为:0-31。规则集可以单独地被禁止或启用,所以,它对于规则集的原子操作是
A `(hV"j | Y至 关重要的。它还可以轻松地删除掉一组规则。如果一个规则没有指定规则集编号,它默认的规则集编号就是0。规则集编号31是个特殊的规则集,它不能被禁止, 也不能用ipfw的flush命令删除,它是默认规则的规则集。规则集编号31可以用ipfw delete set 31命令删除。(译注:这在远程调试排斥式防火墙时特别有用,防止把自己锁在外面。)BSD爱好者乐园| l\/ALX#xzI4Qju
BSD爱好者乐园(rW;U"Z6^M0h2A
}#B IE*_5S5^ prob match_probabilityBSD爱好者乐园Yeg/kUD~8Z
rw!jNc,lLx@ 这个语句只用来指定可能性(从0到1之间浮点值)。这在很多随机丢包的应用中,或者(在同dummynet联用的情况下)模拟多路径条件下无序包传递的效果中,是非常有用的。BSD爱好者乐园*d2V9Pay
BSD爱好者乐园9J+Qr ho IM$d
注意:在检查时,这个条件比其它所有条件都先被检查,包括会有副作用的keep-state或者check-state。
yU(W$bg2Y
&L
ipfw是FreeBSD下的一个用户界面,它用来控制ipfw防火墙和流量整形。BSD爱好者乐园 `$F(Yne)k
BSD爱好者乐园LV3`d&KLf
BSD爱好者乐园#`u7Y8z!A r.tQ
ipfw的配置,也叫做规则集,它是由一系列的规则组成的,这些规则的编号是从1到65535。通过ipfw的数据包可以来自协议栈的许多各个的地方(这主要依赖于数据包的来源和目的,某些数据包很可多次经过防火墙)。数据包在通过防火墙的时候,要和防火墙规则集逐条对比。如果发现匹配的规则,则执行相应规则的动作。BSD爱好者乐园h8S'G&TYE@w/H&h,p'pB
BSD爱好者乐园+^T7T0T7xIW"x qM
在特定的规则动作和系统设置下,数据包在匹配完一个规则后,可能在某些规则之后重新进入防火墙。
j(T"F]~4PuE/KYIN
@,Vi)TR 一个ipfw规则集总是包含一个默认的规则(编号为65535),这个默认规则匹配所有的数据包,不能修改或删除。根据内核配置的不同,这个默认规则或者是拒绝所以数据包通过,或者是允许所有数据包通过。BSD爱好者乐园3WW^;rh;e#p
BSD爱好者乐园M1tQDlP
如果规则集中存在一个或多个包含有keep-state(状态保持)或limit(限制)的规则,那么ipfw就表现为状态保持。例如:当这种规则匹配 了一个数据包时,ipfw将创建一个动态规则,让后来的,同这个数据包的地址和端口参数严格一致的数据包,与这个动态规则相匹配。
@U"f~dT8A}kBSD爱好者乐园d;~4B4P3zL
这些动态规则,都有一个有限的生存期。生存期在第一次遇到check-state、keep-state或者是limit规则时被检查。这些动态规则的 典型应用,是用来保证合法的数据包在通过时开启防火墙。查看下面的“状态防火墙”和“示例”章节,获取更多关于状态保持的信息。
[_@T8rq%O[BSD爱好者乐园2edO3rE9E
包括动态规则在内的所有规则,都有几个相关的计数器:一个包计数器,一个字节计数器,一个记录计数器和一个用来提示最后匹配时间的时间戳。这些计数器都可以被ipfw命令显示和清零。BSD爱好者乐园@M,caY)Hr Z
#^v@M~0\L#Ja 可以用add命令来添加规则;可以用delete命令来删除单个或一组规则;可以用flush命令来删除所有的规则(set 31除外);可以用show和list命令来显示包括计数器在内的信息。最后,计数器可以被zero和resetlog命令清零。BSD爱好者乐园v&CoM7Jh$|
BSD爱好者乐园Av+e:R)R
并且,每个规则隶属于32个不同的规则集中的一个。有一些ipfw的命令可以独立地操作这些规则集,例如:启动、禁止、交换规则集;把一个规则集中的所有规则移动到另一个规则集;删除一个规则集中的所有规则。这对于安装临时配置,或者是测试配置是非常有用的。查看“规则的规则集”一节,获取更多关于set的信息。 BSD爱好者乐园8ww5T6f{!}s
BSD爱好者乐园6uT$LA9@TIWUN
以下是ipfw命令可以利用的选项:
8u9eK'rI0TDeBSD爱好者乐园%mn1S1r@\
-a 使用 list 时,列出数据包的计数器,show命令包含这个选项。BSD爱好者乐园7D+}lg L6h
BSD爱好者乐园:S+lQCtw9R
-b 只显示动作和注释,不显示规则体。包含-c选项。BSD爱好者乐园,e;x;Qy-wpYe
BSD爱好者乐园+_(U2m{;D"QD0q
-c 进入或显示规则时,用紧凑格式输出。例如:在没有任何附加意义的情况下,不显示“ip from any to any”字符串。BSD爱好者乐园is0j#yY
BSD爱好者乐园0q_6R\#g`N
-d 在list时,在显示静态规则的同时,显示动态规则。BSD爱好者乐园;|3p"f/lG&Z6W*S+uX9G
BSD爱好者乐园9Q3y0h{5nnV
-e 在list时,如果指定了-d选项,则显示过期的动态规则。
2c Lp sO1fBSD爱好者乐园 }lwU'K
-f 对于有些会导致问题的命令,不要提出确认的询问。例如:flush命令。哪果一个进程没有相关的tty,这个是默认被包含的选项。(译注:没看懂这句话的意思,好像是如果不是在tty中输入的命令,比如在scripts中,默认是有-f的。)
?;Pn5W1](Y%i0|6wvBSD爱好者乐园AnPK f
-n 只检查命令的语法,不真正执行命令。
3s.qdL5A
6I%Gwl2`JU-N 尝试在输出中,解析地址和服务名。
Cq l:jDU8q c
@wV4?;RacO*C{D-q 当新增 (add)、归零(zero)、重置日志(resetlog)或清除(flush) 时,不要显示任何回应信息(就像使用-f选项一样)。这对于在脚本里 利用ipfw命令来调整防火墙规则(例如执行“sh /etc/rc.firewall”脚本)、或者是处理与一个远程登录相关的有多条ipfw命令的,是非常有用的。同时,它防止无意间,在规则中加入或删 除一个列表而导致的错误。(译注:没看懂,好像下面是一个例子。)在正常的模式,默认内核配置下,一个flush命令会输出一个信息。因为所有的规则都被 清除掉,这个消息又不能传送到登录的进程中,脚本后面的规则将无法执行,所以将导致远程连接中断。这时,只好回到计算机前去工作了。BSD爱好者乐园e*gxtrn
BSD爱好者乐园+[9pa4`Y
-S 当列出一个规则的时候,显示每条规则的规则集号。如果没有指定这个标识,则被禁止的规则不再显示。
s3r4B'DI7|9Y"fr
bn&s)W^[;p-s [field]BSD爱好者乐园5u$q.q4xmgFG
当显示pipe时,按照四个计数器之一排序显示。(对于所有的数据包、当前数据包或者是字节数)
0Z B2pH)X\
$`D-` T6xsD ?g-dv)C-t 当列出时,显示最后匹配的时间戳。(显示用ctime()转化后的时间)BSD爱好者乐园6CwW]-B6G
BSD爱好者乐园f~'G5B,cY/wYE
-T 当列出时,显示最后匹配的时间戳。(从新纪元到现在的秒数)。这个格式更容易被脚本处理。
1a!V0G"_+b@
5]$z bZ(~I 为了使配置更容易,规则可以写到一个文件里 供ipfw处理,语法规则参照大纲栏最后一行(译注:指本文最前面的语法部分最后一行,即:“ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname”)。注意必须是绝对路径。这个文件会被逐行读取并且将作为ipfw工具的参数处理。 BSD爱好者乐园[#dd!EO q2k/r
\3e bWr5U+`4u 作为选择,你还可以使用-p preproc参数来使用预处理程序,其中路径是用管道来传入的。可以使用的预处理程序包括cpp和m4。如果preproc不是以"/"开头,那么将搜 索PATH里的路径。在使用它的时候,要谨慎,因为在很多时候,ipfw启动时,系统文件可能没有挂接(比如:文件系统是通过NFS挂接的)。一旦使用了 -p参数,所有其它的参数,都被传送到预处理程序去等待处理。
U2x(O3Jq(PBSD爱好者乐园1\xM9dL H}
3^[x,e{H8XZ/N ipfw的pipe和queue命令用来配置流量整形,你可以下面的“TRAFFIC SHAPER (DUMMYNET) CONFIGURATION”节看到看到相关内容。
C&x!r,kmu.oBSD爱好者乐园:XX4M%]V&~
如果系统的world和内核不能保持一致,ipfw的ABI将失效,以防你加入任何规则。这样能保证你的顺利地完成启动过程。你可以利用ipfw临时禁止的机会登录你的网络,来修复你的问题。
2S"|ro E/dl]`CBSD爱好者乐园NdW7N `P
BSD爱好者乐园R7{qf:|e
PACKET FLOW(数据包流程)
U^"?h1Z;gBSD爱好者乐园$_!u+K*Fs$[fm
一个数据包在几个内核变量的控制下,在协议栈的多个地方被防火墙检查。这些地方和变量如下图所示,要在头脑中保持下图,它对于规划一下正确的规则集是非常重要的。
"JTLySFS?GBSD爱好者乐园,vmze8Q'Zp
BSD爱好者乐园J#qGu.IH
^ 到上层 V
r2Y!e1AD"D0L | |
:]b3AuW;gAE4p9C9q$Lj +----------->-----------+BSD爱好者乐园E"we@,DUj
^ VBSD爱好者乐园dK}a|
[ip(6)_input] [ip(6)_output] net.inet(6).ip(6).fw.enable=1BSD爱好者乐园5u%t3Q"d%W!d I0FC+w
| |
$K'W/F3u2b*]1s4|)M\ ^ V
7ml\$ZbJ] [ether_demux] [ether_output_frame] net.link.ether.ipfw=1
T"bA*q-JOQFYn | |
#j^r0IT9j +-->--[bdg_forward]-->--+ net.link.bridge.ipfw=1BSD爱好者乐园8PRM7je6{[&_jJA
^ V
SmMso0sW,b1t | 到设备 |BSD爱好者乐园ffMequ
BSD爱好者乐园 fXZ8OVg
BSD爱好者乐园+p.A*S(Jc.u pu a+m4x[
"f"J*By+R^ 如图所示,根据数据包的源和目的,以及系统配置的不同,同一个数据包穿过防火墙的次数在0和4之间变化。
"usU:^-a(Yr
pb%|'t(h4Tw-b/i?h;o 需要注意的是,在包通过不同栈的时候,头会被加上或剥离,可能会导致这些包被检查不到。例如:当ipfw被ether_demux()调用的时候,进入 的包将包括MAC头;而当ipfw被ip_input()或者ip6_input()调用的时候,同一个数据包的MAC头将被剥离。
0]!xyw*c6]fv
&y-X?-Z5O(}!t 还需要注意的是:不论检查发生在什么地方,也不论数据包源自哪里,每个数据包也整个规则进行对照。(译注:是整个规则集吗?有时候只对照一部分的时候就 中止检查)。如果一个规则包含的一些匹配模型或动作不符合某处的要求(比如:在ip_input或ip6_input处匹配MAC头),那么匹配模型将不 会被匹配。然而,带有not前缀操作符的匹配模型,总是可以和这些数据包相匹配。所以,如果有必要,在有很多地方可以选择的时候,有能力的程序员可以为写 出的规则集选择一个合适的位置。skipto规则在这儿是非常有用的。例如:BSD爱好者乐园 Z(G3dF+i$D-b
tR S#Ls7D6z%ZX # packets from ether_demux or bdg_forwardBSD爱好者乐园7Y;?X7D8ZmC
ipfw add 10 skipto 1000 all from any to any layer2 inBSD爱好者乐园bs;tH;u6S
# packets from ip_input
#u\/_)swQOp7pL ipfw add 10 skipto 2000 all from any to any not layer2 in
'jN)d[K # packets from ip_outputBSD爱好者乐园1n iuNW jZ
ipfw add 10 skipto 3000 all from any to any not layer2 out
d n:T v9Q)s:|? # packets from ether_output_frame
jD[4h7ej ipfw add 10 skipto 4000 all from any to any layer2 outBSD爱好者乐园.rd5uf"SV
BSD爱好者乐园&I2M's!v:V%z0f+NF
(对,在这儿,没有办法区别ether_demux和bdg_forward)BSD爱好者乐园G9O,S*pB&p
qB,r-O\3\Zg.cV)S
I$G3aa,{.t3W(I[_SYNTAX(语法规则)BSD爱好者乐园P_py W6w
-LD2i5o6_Q&R 通常,每个关键字或者参数都是作为独立的命令行参数来提供的,前后都不能有空格。关键字是区分大小写的,而参数按照它们本身的含义,可以是,也可以不是区分大小写的。(例如,udi要区分大小写,而hostname没有必要区分大小写)
X;j;gN_flwBSD爱好者乐园B"yq6Y0mK
在ipfw2中,为了提高可读性,可以在逗号后面加上一个空格。当然,你也可以把整个命令(包括参数)当作一个参数来处理(译注:就是加上双引号,作为一个字符串放到某个命令中)。例如,以下几种格式效果相同:
lJ+?o9`5nk2h
'I-VZ;Mh u:?0O ipfw -q add deny src-ip 10.0.0.0/24,127.0.0.1/8
$fl6F H7H)Tke)W5~w ipfw -q add deny src-ip 10.0.0.0/24, 127.0.0.1/8 (译注:127前面有个空格)
Oh3elNBSD爱好者乐园9i%U;?$yW8|eU0_y
BSD爱好者乐园eT'C2a M j
&K `Gs$^%fRULE FORMAT(规则格式)
gTp |Y'sl
5qe*LyD3K%PLO{8q ipfw的规则格式如下:BSD爱好者乐园:e _M%}ML t'T
BSD爱好者乐园:[-k1FV8E.KPx,{
[rule_number] [set set_number] [prob match_probability] action
m"?*xf6V7n!I R,?$@ [log [logamount number]] [altq queue] [{tag | untag} number] bodyBSD爱好者乐园VP"A*m8c1F,Nb
BSD爱好者乐园i0e:Q,c1Q v
规则的 body 部分用来设定包过滤的信息,具体细节如下:
q6Z+a8p ?%N SR%KZBSD爱好者乐园!v(Ul q%h:h/K#z@U
Layer-2 header fields 第二层头段,什么时候可用
M N*I5PC#I7D
bq+ZcGo0H'iV:n IPv4 and IPv6 Protocol TCP, UDP, ICMP, 协议等BSD爱好者乐园x4Oz6B1rpF%I7r
[ _~ _zifX&u Source and dest. addresses and ports 源和目的。地址和端口
il.z"^7[&W
k*O#_:ej Direction 数据包的流向,见“流量整形”一节BSD爱好者乐园AC"iq4FJ
L`;DQ,gc Transmit and receive interface 传输和接收界面,用名字或地址表示BSD爱好者乐园xP;` f6pWTphe
(G-h]]?2_ Misc. IP header fields 组合IP头字段,包括版本、服务类型、报文长度、唯一标识、分段标志、生存期BSD爱好者乐园wi'b)?b:ct:u
5X*}haB3F0q8^3_o IP options IP选项字段
6?x{8CH*@.svsg1x
gZ2`^,B%ch IPv6 Extension headers IPv6扩展头,包括分片报头、中继选项报头、路由报头、路路由选择报头、IP层安全服务选项、Source routing rthdr0, Mobile IPv6 rthdr2(译注:最后两项不知道怎么翻译)BSD爱好者乐园Y ?/K'~Vkk!YJ
tC\/g\EB3g IPv6 Flow-ID IPv6的流量标识BSD爱好者乐园c7|WQ+W;fN/J
|+r qc X^[u Misc. TCP header fields 组合tcp头字段,有TCP标志(syn,fin,ack,rst等)、序列号、回复号,窗口等。BSD爱好者乐园E*z0H2I~DZ.irg I
BSD爱好者乐园RjsH9l
TCP options TCP的选项
|;De[U`
h.HU:[G D5LG/R(T6z ICMP types ICMP包BSD爱好者乐园Vs4Oj+{"v#Z
BSD爱好者乐园)^F?$tFK
ICMP6 types ICMP6包
mV3dOd9z*d BSD爱好者乐园Y-}w:F'e0]4m
User/group ID 本地栈所归属的用户和组BSD爱好者乐园~*i"eXO
a&O&o*?+KO3X] Divert status 是不是源自一个divert接口(例如:natd(8))BSD爱好者乐园 _!XkCR6mo
\Z|*\/y)iR"\ 需要注意,上面的很多信息中,比如源MAC和IP地址、TCP/UDP端口等,是比较容易伪造的,所以只对这些信息进行过滤不能保证达到预期的效果。
V,~ Sp2n;K,O6ABSD爱好者乐园 J p7f8n0D tcv
J;l7u-m6T rule_numberBSD爱好者乐园v h$z$K}
每个规则都有规则号,规则号从1-65535。65535是保留的默认规则。ipfw将按规则号的顺序依次检查这些规则。可以有多个规则用同一个规则 号,在这种情况下,将按照它们的添加顺序依次检查或列出。如果一个规则没有指定规则号,内核将自动赋于一个规则号,使它成为默认规则前的最后一个规则(即 小于65535)。自动添加的规则号有个步进值,在不大于65535的情况下,每次添加规则时,都自动加上这一步进值。它默认是100,对应于 net.inet.ip.fw.autoinc_step这个内核变量。BSD爱好者乐园d~rm/{
BSD爱好者乐园/s0{C_ `z#C/c&k
set set_number
1_6kL"?^g| ^
z4NYHe7J%XI 每个规则都对应于一个规则集编号,规则集编号取值为:0-31。规则集可以单独地被禁止或启用,所以,它对于规则集的原子操作是
A `(hV"j | Y至 关重要的。它还可以轻松地删除掉一组规则。如果一个规则没有指定规则集编号,它默认的规则集编号就是0。规则集编号31是个特殊的规则集,它不能被禁止, 也不能用ipfw的flush命令删除,它是默认规则的规则集。规则集编号31可以用ipfw delete set 31命令删除。(译注:这在远程调试排斥式防火墙时特别有用,防止把自己锁在外面。)BSD爱好者乐园| l\/ALX#xzI4Qju
BSD爱好者乐园(rW;U"Z6^M0h2A
}#B IE*_5S5^ prob match_probabilityBSD爱好者乐园Yeg/kUD~8Z
rw!jNc,lLx@ 这个语句只用来指定可能性(从0到1之间浮点值)。这在很多随机丢包的应用中,或者(在同dummynet联用的情况下)模拟多路径条件下无序包传递的效果中,是非常有用的。BSD爱好者乐园*d2V9Pay
BSD爱好者乐园9J+Qr ho IM$d
注意:在检查时,这个条件比其它所有条件都先被检查,包括会有副作用的keep-state或者check-state。
yU(W$bg2Y
&L
相关阅读 更多 +
排行榜 更多 +