在IPFW使用altq的名字来检查队列之前,你必须用pfctl(8)工具来设置队列。一旦重置ALTQ命令,那么包含队列标识符的规则将过期,需要被重新读取才能生效。过期的队列标识符将会产生错误的分类。
所有的ALTQ系统进程都可以被ipfw的enable altq和disable altq命令启用或关闭。ALTQ流量整形有真实规则动作,永远附加在ALTQ标签之后,和net.inet.ip.fw.one_pass毫无关系。
一个规则可以和下面动作中的一个或多个相关联,如果数据包匹配了规则体,那么这些动作将被执行。
allow | accept | pass | permit 允许匹配规则的数据包通过,规则搜索中止。
check-state
将数据包和动态规则集里的规则进行对照。如果找到,则执行产生这条动态规则的那个规则相关联的动作,如果没找到,则进行下一条规则。check- state没有规则体。如果在规则集里没有找到check-state,则在第一次出现keep-state或者limit规则时,检查动态规则集。
count 更新和本条规则相匹配的所有数据包的计数器。继续进行下一条搜索。
deny | drop 抛弃和本条规则相匹配的数据包。搜索中止。
divert port 把和本条规则相匹配的数据包转向到divert(4)栈所绑定的端口。搜索中止。
B
fwd | forward ipaddr | tablearg[,port]
修改匹配数据包的下一跳地址,有可能是一个IP地址,也有可能是一个主机名。当使用tablearg关键字时,下一跳地址可以不是一个明确的地址,它可以从最后的数据包检查表中获取。如果匹配本规则,搜索中止。
(译注:tablearg是FreeBSD7.0的ipfw新增功能,它可以使查表的结果作为规则的一部分来使用,可以用来优化一些规则集,或实现基于策略的路由,在使用时,要配合table命令使用。)
如果指定的ipaddr是一个本地地址,所匹配数据包将被传递到本地机器的相应端口(如果在规则中没有指定端口,则是数据包中的端口号)。如果ipaddr不是一个本地地址,那么端口号(如果指定的话)将被忽略,数据包将会根据本机的路由表被转发到远程地址。
一个fwd规则不会和一个二层的数据包(用ether_input,ether_output或者bridged接受)相匹配。fwd不会修改数据包中的任何数据,特别是目的地址。所以,除非在目的系统中有相应的规则接受这些数据包,否则,被转发到目的系统的数据包将被拒绝。对于被转发到本地的数据包,将把本地地址作为它的原始目的地址。这将使netstat(1)看起来有些古怪,但是,对于透明代理服务器来说,却是有用的。
要使用fwd,必须在内核中使用IPFIREWALL_FORWARD选项,并重新编译内核。
nat nat_nr
Pass packet to a nat instance (for network address translation,
address redirect, etc.): see the NETWORK ADDRESS TRANSLATION
(NAT) Section for further information.
将数据包传送到一个nat界面(用来做地址转换或地址重定向等):详细信息,请查看NETWORK ADDRESS TRANSLATION (NAT)一节。
将数据包传送到一个dummynet(4)的“管道”(用来实现流量整形,延迟等)。详细信息请查看TRAFFIC SHAPER (DUMMYNET) CONFIGURATION一节。如果匹配,则搜索中止。但是,在离开管道的时候,并且内核变量net.inet.ip.fw.one_pass没有设置,数据包将被送回到防火墙的下一条规则。
将数据包传送到一个dummynet(4)的“队列”(用WF2Q+实现流量整形)
reject (Deprecated).
不可到达的同义词。
reset 丢掉和本规则相匹配的数据包,如果是一个TCP数据包,则发送一个重置(RST)消息。搜索中止。
reset6 丢掉和本规则相匹配的数据包,如果是一个TCP数据包,则发送一个重置(RST)消息。搜索中止。
skipto number
s
跳到指定的规则,忽略掉比指定规则号小的规则。搜索从指定的规则号继续。
tee port
将相匹配的数据包复制一份到divert(4)所绑定的端口。搜索继续。
unreach code
丢弃和本规则相匹配的包,并且尝试发送一条编号为指定编号的不可到达的ICMP消息。编号范围是0-255,或者使用下列别名之一:net, host, protocol, port, needfrag, srcfail, net-unknown,host-unknown, isolated,net-prohib, host-prohib, tosnet, toshost, filter-prohib,host-precedence or precedence-cutoff。搜索中止。
unreach6 code
丢弃和本规则相匹配的包,并且尝试发送一条编号为指定编号的不可到达的ICMPv6消息。编号为0,1,3,4或者是下列别名之一:no-route, admin-prohib, address or port。搜索中止。
netgraph cookie
使用指定的cookie把数据包转向到netgraph。搜索中止。如果稍后数据包众netgraph返回,则受内核变量net.inet.ip.fw.one_pass的影响,或者被接受,或者从下一条规则继续。
ngtee cookie
将数据包复制一份,转发到netgraph,原始的数据包则受net.inet.ip.fw.one_pass的影响,或者被接受,或者从下一条规则继续。查看ng_ipfw(4)可以获取更多关于netgraph和ngtee动作的信息。
RULE BODY(规则体)
规则体包括零个或多个匹配模式(比如指定源和目的的地址或端口,协议选项,进入和流出的界面等。),这些匹配模式必须按顺序对数据包进行识别。通常,匹配模式之间用一个隐含的“和”操作连接,比如:所有规则中的模型都必须去和数据包进行匹配。单个的模型可以使用“not”操作符作为前缀,用来表示相反的匹配结果,就象在下例中:
ipfw add 100 allow ip from not 1.2.3.4 to any
特别的,当用来表示二选一的“或”模型时,可以使用一对小括号“()”或一对大括号“{}”括起来的“or”操作符,比如:
ipfw add 100 allow ip from { x or not y or z } to any
只允许有一级小括号。特别提示:大多数shell中,小括号和大括号都有特殊的意义,所以,为了防止被shell误解,强烈建议在小括号和大括号前加上反斜杠“\”。
规则体中,至少要包含一个源地址和目的地址的语句。"any"关键字可以用在多种地方,用来表明源或目标可以是任意的。
规则体的格式如下:
[proto from src to dst] [options]
第一个部分(proto from src to dst)用来和早期版本的FreeBSD相兼容。在新的FreeBSD版本中,所有的匹配模型(包括MAC头,IP协议,地址和端口)都可以在options里指定。
各规则字段的含义如下:
proto: protocol | { protocol or ... }
protocol:[not] protocol-name | protocol-number
一个IP协议可以用序号或名称(在/etc/protocols里可以查看完整的名称列表),或者是下面的关键字之一:
ip4 | ipv4 和IPv4数据包相匹配
ip6 | ipv6 和IPv6数据包相匹配
ip | all 和所有数据包相匹配
ipv6在proto选项中,将被作为内部协议。并且,ipv4在prto选项中是不适用的。
{ protocol or ... } 格式的“或”的功能只是方便使用,不提倡这种做法。
src and dst: {addr | {addr or ... }} [[not] ports]
一个地址(或者一个列表,见后),可以使用ports修饰符。
第二种格式(用or连接起来的多个地址)只是方便使用,却不提倡这种做法。
addr: [not] {any | me | me6 | table(number[,value]) | addr-list | addr-set}
any 匹配任意地址
me 匹配系统中所有设置的IP地址。
me6 匹配系统中所有设置的IPv6地址。地址列表是在分析数据包的时候才被列出的。
如果一个数据包在表序号为number的表中存在相应的条目,则匹配。如果指定了一个可选的32位无符号数value,则条目序号为value的数据包才被匹配。查看LOOKUP TABLES一节,可以获取更多信息。
addr-list: ip-addr[,addr-list]
#a,b
ip-addr: 一个主机或者一段地址,可以采用下列格式:
numeric-ip | hostname
匹配单个IPv4地址,可以采用点分四组格式或主机名。当采用主机的时候,在添加规则的时候将被解析为相应的IP。
匹配于指定的基地址addr(可以是单个IP地址、网络地址或者是主机名)和掩码位masklen。例如:1.2.3.4/25或1.2.3.0/25 匹配于从1.2.3.0到1.2.3.127的IP地址。
addr:mask
匹配于指定的基地址addr(可以是单个地址、网络地址或主机名)和指定的子网掩码mask,用点分四组表示法。例如:1.2.3.4: 255.0.255.0或者1.0.3.0:255.0.255.0匹配于1.*.3.*。只建议在非连续的子网掩码中使用这种格式,对于连续的子网掩码,请使用addr/masklen格式,它的格式更紧凑,也不容易出错。
分页: [1] [2] [3]
TAG: