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_SECURITY 将这个信息保存到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.2.3.35 1.2.3.55 1.2.3.89 .
这种格式是特殊用于处理单独规则里面少量的地址。
ports: [not] {port | port-port} [,...]
支持端口号的协议(例如:TCP and UDP),随意的端口号可以被指定,一个,多个,胡哦这是一个范围,用“,”隔开(不能有空格),并且一个随意的没有具体的项。“-”符号指定带边界的范围。
服务器(from /etc/services)的名字可以用数字的端口值代替。端口的长度被限制到30,或一个范围内,尽管这个范围在规则里很大。
"\"可以劈开用"-"在shell里的冲突(有的服务器有自己的定义)。
ipfw add count tcp from any ftp\\-data-ftp to any
一个非零的包的碎片(也就是不是第一段的)将不匹配规则规则。看关于碎片设置的详细资料。
RULE OPTIONS (匹配模式)
附加的匹配模式可以被用在规则里面。0或者其他所谓的设置都可以出现在规则里,前置由非操作数和可能的区域里的组决定。
以下匹配模式可以使用:
bridged
指匹配过渡的数据包。
dst-ip ip address
匹配ip包,看谁的目的地址是清单里的其中一个。
dst-port source ports
匹配ip包,看谁的目的端口是清单里的其中一个。
established
匹配那些有RST or ACK bits设置的TCP包。
frag 匹配那些片断或者不是第一段的ip数据包,注意,这些包不具备下一个协议头(e.g. TCP, UDP),所以这些玄想不能被匹配。
gid group
匹配所有被组(组可以是指定的名字或数字)承认的TCP or UDP包。
icmptypes types
匹配所有的列在ICMP类表里的ICMP包。列表可以是一个指定的范围,或者是逗号隔开的个别类型。这里支持的ICMP类型有:
echo reply (0), destination unreachable (3), source quench (4),
redirect (5), echo request ( 8) , router advertisement (9), router
solicitation (10), time-to-live exceeded (11), IP header bad
(12), timestamp request (13), timestamp reply (14), information
request (15), information reply (16), address mask request (17)
and address mask reply (1 8) .
in | out
分别的匹配进出的包,进和出是互斥的(实际上,出就是执行不进)。
ipid id
匹配IP包里的Id值。
iplen len
匹配ip包的总长度,包括头和数据。
ipoptions spec
匹配谁的ip头包含用逗号隔开的设置,支持以下几种:
ssrr (strict source route), lsrr (loose source route), rr (record
packet route) and ts (timestamp). 没有详细说明则用"!"表示。
ipprecedence precedence
匹配有优先权的IP。
iptos spec
匹配带有被逗号隔开的服务类型表的ip,支持以下几种:
lowdelay (IPTOS_LOWDELAY), throughput (IPTOS_THROUGHPUT),
reliability (IPTOS_RELIABILITY), mincost (IPTOS_MINCOST),
congestion (IPTOS_CE). 没有详细说明则用"!"表示。
ipttl ttl
匹配ip的存活时间
ipversion ver
匹配ip的版本号
keep-state
在匹配时,防火墙将创建一个动态规则,它的默认的行为就是去匹配双向的通信,在源和IP/port使用同样协议的的目的地之间。这个规则有一定寿命,这个存活时间在每次要匹配的包被找到后重新更新。
layer2 仅匹配2层的包,例如通过ipfw的从ether_demux() and ether_output_frame().
limit {src-addr | src-port | dst-addr | dst-port} N
防火墙只允许像设置里的那个数N连接,一个或多个的源和目的地址都会被定义。
{ MAC | mac } dst-mac src-mac
匹配带有MAC的源和目的地址,详细的就像一些关键字,或者是6个被逗号隔开的数字,例如下:
MAC 10:20:30:40:50:60/33 any
注意MAC地址的规则(目的地第一,源第二)他们同样也在信息里,只是对应的习惯用IP地址罢 了。
mac-type mac-type
匹配跟内网类型一样的数据包。mac类型也用同样的方法被定义就像端口号。你可用象征的名字为你知道的含义,像vlan, ipv4, ipv6.这个值也可以被直接输入,像10近制,16近制,他们输出总是按16近制,除非-N设置启用,那么那些符号将被试图启用。
proto protocol
匹配ipv4的通用协议。
recv | xmit | via {ifX | if* | ipno | any}
匹配接受的包,分别的转输或是通过,接口被将由精确的名字(ifX)和设备名字(if*)所定义,还可以由ip或一些其它的接口定义。
via这个关键字就是说,所有的接口总是要被检查的。如果是recv or xmit取代了via则表示只接受,或只转发,这就有可能匹配包是基于接受和转发的接口上的。例如:
ipfw add deny ip from any to any out recv ed0 xmit ed1
recv接口可以测试在通过他们所进出的包,所以只要xmit在使用中,出就会被请求(没有进)。
一个包可以没有接受或转发接口:数据包从本地主机出来,是没有接受接口的,一会儿就回到达没有转发接口的本地主机。
setup 匹配只带SYN字节不带ACK字节的TCP包,
src-ip ip-address
匹配ip包里有源ip在地址列表里的
src-port ports
匹配ip包里有源端口在端口列表里的
tcpack ack
仅TCP包,匹配TCP头带有ack字样的包。
tcpflags spec
仅TCP包,匹配TCP头带有逗号隔开的字样的包,支持以下几种:
fin, syn, rst, psh, ack and urg. The absence of a particular
flag may be denoted with a `!'. A rule which contains a tcpflags
specification can never match a fragmented packet which has a
non-zero offset. See the frag option for details on matching
fragmented packets.
tcpseq seq
仅TCP包,匹配TCP头带号码区有seq字样的包。
tcpwin win
仅TCP包,匹配TCP头带window区有win字样的包。
tcpoptions spec
仅TCP包,匹配TCP头包含逗号隔开的选想说明,支持以下几种:
mss (maximum segment size), window (tcp window advertisement),
sack (selective ack), ts (rfc1323 timestamp) and cc (rfc1644
t/tcp connection count). 空缺用`!'表示。
uid user
匹配所有用户收发数据包,用户可以由名字或认证数字来匹配。
SETS OF RULES
每一条规则都是32不同条例中的其中一个,0-31,31为保留的默认规则。
默认的情况下,,规则将被设置为0,除非你输入新规则是,在N上有所改动,设置可以被个别激活或者停止,所以这种办法允许一个很简单的方法去贮存防火墙的多种配置,很快的可以在它们之间互相转换。激活/停止的命令为:
ipfw set disable number ... [enable number ...]
各种各样的激活或