30.5. IPFILTER (IPF)

IPFILTER即为IPF,是一套跨平台、开放源码的防火墙,已被移植到各种操作系统,包含FreeBSD,NetBSD,OpenBSD与Solaris™。

IPFILTER是核心端(Kernel-side)的防火墙且NAT机制可由Userland的程序控制与监控,防火墙规则可以使用ipf设定或删除,NAT规则可以使用ipnat设定或删除,可使用ipfstat来列出IPFILTER在核心部份的执行期统计信息,可使用ipmon来记录IPFILTER动作到系统记录档。

IPF原来是以最后一个符合的条件优先的规则处理逻辑所撰写并只能使用无状态(Stateless)的规则,之后IPF才被加强支持快速( quick)与保留状态(keep state)的选项。

IPF FAQ位于http://www.phildev.net/ipf/index.html,可搜寻的IPFilter邮递论坛封存数据可至http://marc.info/?l=ipfilter取得。

由于FreeBSD也支持IPF因此操作手册特别在此章节对此介绍,本节提供几个有使用快速(quick)与保留状态(keep state)选项的规则示例。

30.5.1. 开启IPF

IPF 作为一个可加载的内核模块包含在FreeBSD 基础系统中, 这意味着不需要自定义内核来启用IPF

如果用户希望将 IPF 编译进内核,可以参考 第 8 章 配置 FreeBSD 内核。以下是相关内核选项:

options IPFILTER
options IPFILTER_LOG
options IPFILTER_LOOKUP
options IPFILTER_DEFAULT_BLOCK

其中options IPFILTER支持IPFILTERoptions IPFILTER_LOG为每一个有log关键字的规则使用ipl数据包日志伪设备来支持IPF日志记录。IPFILTER_LOOKUP启用了IP池,以加快IP查找速度,而options IPFILTER_DEFAULT_BLOCK改变了默认行为,使任何不符合防火墙pass规则的数据包都会被阻止。

要配置系统在启动时启用IPF,请在/etc/rc.conf中添加以下条目。这些条目还将启用日志记录和default pass all。要将默认策略改为block all,而不需要编译一个自定义内核,记得在规则集的最后添加一个block all规则。

ipfilter_enable="YES"             # Start ipf firewall
ipfilter_rules="/etc/ipf.rules"   # loads rules definition text file
ipmon_enable="YES"                # Start IP monitor log
ipmon_flags="-Ds"                 # D = start as daemon
                                  # s = log to syslog
                                  # v = log tcp window, ack, seq
                                  # n = map IP & port to names

若需启用NAT,添加下列行:

gateway_enable="YES"              # Enable as LAN gateway
ipnat_enable="YES"                # Start ipnat function
ipnat_rules="/etc/ipnat.rules"    # rules definition file for ipnat

然后启动IPF

# service ipfilter start

若要加载防火墙规则, 请使用ipf指定规则集文件的名称。以下命令可用于替换当前运行的防火墙规则:

# ipf -Fa -f /etc/ipf.rules

其中-Fa刷新所有内部规则表,-f指定要加载的规则文件。

这提供了对自定义规则集进行更改的能力,并以新的规则副本更新运行中的防火墙,不需要重新启动系统。这种方法对于测试新规则很方便,因为该过程可以根据需要多次执行。

其他更多详情请参阅 ipf(8)

30.5.2. IPF规则语法

本节介绍用于创建有状态规则的IPF规则语法。创建规则时,请记住,除非quick关键字出现在规则中,否则每个规则都按顺序读取,最后一个匹配规则是应用的规则。这意味着,即使匹配数据包的第一个规则是pass,如果有一个稍后的匹配规则是block,数据包将被丢弃。示例规则集可以在/usr/share/examples/ipfilter中找到。

在创建规则时,#字符用于标记注释的开始,可以出现在规则的末尾,解释该规则的功能,也可以出现在规则本身的行中。任何空行都会被忽略。

规则中使用的关键词必须按照特定的顺序,从左到右写。有些关键词是强制性的,而有些是可选的。有些关键字有子选项,这些关键字本身可能是关键字,也包括更多的子选项。关键字的顺序如下,其中大写的单词代表变量,小写的单词必须在后面的变量前面:

ACTION DIRECTION OPTIONS proto PROTO_TYPE from SRC_ADDR SRC_PORT to DST_ADDR DST_PORT TCP_FLAG|ICMP_TYPE keep state STATE

本节介绍了这些关键词及其选项。这并不是所有可能的选项的全部列表。请参考 ipf(5),以了解创建IPF规则时可使用的规则语法的完整描述,以及使用每个关键字的示例。

ACTION

如果数据包与该规则匹配,则 action 关键字指示如何处理该数据包。每个规则都必须有一个操作。以下操作将被识别:

block: 丢弃数据包。

pass: 允许数据包通过。

log: 生成日志记录。

count:计算数据包和字节数,它可以显示规则的使用频率。

排队等待其他程序处理数据包。

call:提供对IPF中内置的函数的访问来支持更复杂的操作。

decapsulate:删除所有标头以处理数据包的内容。

DIRECTION

接下来,每个规则必须使用以下关键字之一显式指出流量方向:

in: 规则作用于传入数据包。

out: 规则作用于传出数据包。

all: 规则对双向流量都生效。

如果系统具有多个接口,可在指定流量方向时指定接口。举个例子 in on fxp0

OPTIONS

选项是可选的。但是,如果指定了多个选项,必须按照这里显示的顺序使用。

log:当执行指定的action时,数据包头的内容将被写到ipl(4)数据包日志伪设备。

quick:如果数据包匹配此规则,则发生规则指定的 ACTION,并且不会对此数据包进行进一步处理以下所有规则。

on:必须在ifconfig(8)所显示的接口名称后面。只有当数据包沿指定的方向通过指定的接口时,该规则才会匹配。

在使用log关键字时,限定词的顺序和含义如下所示:

body: 表示数据包内容的前128字节将被记录在报头之后。

first:如果log关键字与keep state选项一起使用,建议使用这个选项,这样只记录触发的数据包,而不是其他有状态连接的数据包。

可以使用其他选项来指定错误返回信息。有关详细信息,请参阅 ipf(5)

PROTO_TYPE

协议类型是可选的。但是,如果规则需要指定 SRC_PORT 或 DST_PORT,它是强制性的,因为它定义了协议类型。当指定协议类型时,请使用proto关键字,后面是/etc/protocols中的协议号或名称。例如协议名称包括tcpudpicmp。如果指定了 PROTO_TYPE,但没有指定 SRC_PORT 或 DST_PORT,则所有端口的此类型数据包将与该规则相匹配。

SRC_ADDR

from关键字是强制性的,后面有一个表示数据包源的关键字。源可以是主机名、IP地址,后面跟着CIDR掩码、地址池或关键字all。有关示例,请参阅 ipf(5)

没有办法匹配 IP地址的范围,因为这些地址不容易用虚线数字形式/掩码长度符号来表示。可以使用 net-mgmt/ipcalc 来简化 CIDR 掩码计算。更多信息可在该程序的网站上获得。http://jodies.de/ipcalc

SRC_PORT

源的端口号是可选的。但是, 如果使用了它, 则需要在规则中首先定义 PROTO_TYPE。端口号也必须在前面加上 proto 关键字。

支持多种比较运算符。=(等于),!=(不等于),<(小于),>(大于),<=(小于或等于),以及>=(大于或等于)。

要指定端口范围,请将两个端口号放在 <> (小于且大于 )、>< (大于且小于 )或 : (大于或等于且小于或等于 )之间。

DST_ADDR

to关键字是强制性的,后跟一个关键字,该关键字表示数据包的目标。与 SRC_ADDR 类似,它可以是主机名,IP地址后跟CIDR掩码、地址池或 all

DST_PORT

与 SRC _ PORT 类似,目标的端口号是可选的。但是, 如果使用它, 则需要首先在规则中定义 PROTO _ TYPE。端口号前面必须有proto关键字。

TCP_FLAG|ICMP_TYPE

如果tcp被指定为 PROTO_TYPE,则可以用字母来指定标志,每个字母代表可能的TCP标志中的一个,用于确定连接状态。可能的值是。S (SYN)、A (ACK)、P (PSH)、F (FIN)。U(URG)、R(RST)、C(CWN)和E(ECN)。

如果指定了icmp作为PROTO_TYPE,则可以指定要匹配的ICMP类型。有关允许的类型,请参阅ipf(5)

STATE

如果pass规则包含keep stateIPF将向其动态状态表添加一个条目,并允许后续的数据包与连接匹配。IPF可以监控TCPUDPICMP会话的状态。任何IPF可以确数的据包定是活动会话的一部分,即使是不同的协议,也会被允许。

IPF中,首先根据动态状态表检查打算通过连接到公共互联网的接口出去的数据包。如果数据包与下一个预期的数据包相匹配,组成一个活动的会话,那么它就会退出防火墙,并在动态状态表中更新会话流的状态。不属于活动会话的数据包会根据出站规则集进行检查。从连接到公共互联网的接口进来的数据包首先会根据动态状态表进行检查。如果数据包与构成活动会话的下一个预期数据包相匹配,它就会退出防火墙,并在动态状态表中更新会话会话对话流的状态。不属于已经活动会话的数据包会根据入站规则集进行检查。

keep state之后可以添加几个关键字。如果使用,这些关键字可以设置各种控制有状态过滤的选项,例如设置连接数限制或连接时间。有关可用选项的列表及其说明,请参阅 ipf(5)

30.5.3. 规则集示例

本节演示了如何创建一个示例规则集,该规则集只允许匹配pass规则的服务,并阻止其他所有服务。

FreeBSD 使用 loopback 接口 (lo0) 和 IP 地址 127.0.0.1进行内部通讯。防火墙规则集必须包含允许这些内部使用的数据包自由移动的规则:

# no restrictions on loopback interface
pass in quick on lo0 all
pass out quick on lo0 all

连接到互联网的公共接口用于授权和控制所有出站和入站连接。如果一个或多个接口与专网相连,那么这些内部接口可能需要规则来允许来自LAN的数据包在内部网络之间或连接到Internet的接口之间流动。规则集应该被组织成三大部分:任何可信的内部接口、通过公共接口的出站连接和通过公共接口的入站连接。

这两条规则允许所有流量通过一个名为xl0的可信的LAN接口:

# no restrictions on inside LAN interface for private network
pass out quick on xl0 all
pass in quick on xl0 all

公共接口的出站段和入站段的规则应该将匹配频率最高的规则放在匹配频率较低的规则之前,该段中的最后一条规则会拦截并记录所有通过该接口的数据包。

这组规则定义了公共接口的出站部分,其名称为dc0。这些规则保持状态(keep state),并确定内部系统被授权用于公共互联网访问的特定服务。所有规则都使用quick,并指定了相应的端口号,以及在适用的情况下,指定了目标地址。

# interface facing Internet (outbound)
# Matches session start requests originating from or behind the
# firewall, destined for the Internet.

# Allow outbound access to public DNS servers.
# Replace x.x.x. with address listed in /etc/resolv.conf.
# Repeat for each DNS server.
pass out quick on dc0 proto tcp from any to x.x.x. port = 53 flags S keep state
pass out quick on dc0 proto udp from any to xxx port = 53 keep state

# Allow access to ISP's specified DHCP server for cable or DSL networks.
# Use the first rule, then check log for the IP address of DHCP server.
# Then, uncomment the second rule, replace z.z.z.z with the IP address,
# and comment out the first rule
pass out log quick on dc0 proto udp from any to any port = 67 keep state
#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state

# Allow HTTP and HTTPS
pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state
pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state

# Allow email
pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state
pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state

# Allow NTP
pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state

# Allow FTP
pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state

# Allow SSH
pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state

# Allow ping
pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state

# Block and log everything else
block out log first quick on dc0 all

示例规则在公共接口的入站部分首先阻止了所有不受欢迎的数据包。这样可以减少最后一个规则记录的数据包的数量。

# interface facing Internet (inbound)
# Block all inbound traffic from non-routable or reserved address spaces
block in quick on dc0 from 192.168.0.0/16 to any    #RFC 1918 private IP
block in quick on dc0 from 172.16.0.0/12 to any     #RFC 1918 private IP
block in quick on dc0 from 10.0.0.0/8 to any        #RFC 1918 private IP
block in quick on dc0 from 127.0.0.0/8 to any       #loopback
block in quick on dc0 from 0.0.0.0/8 to any         #loopback
block in quick on dc0 from 169.254.0.0/16 to any    #DHCP auto-config
block in quick on dc0 from 192.0.2.0/24 to any      #reserved for docs
block in quick on dc0 from 204.152.64.0/23 to any   #Sun cluster interconnect
block in quick on dc0 from 224.0.0.0/3 to any       #Class D & E multicast

# Block fragments and too short tcp packets
block in quick on dc0 all with frags
block in quick on dc0 proto tcp all with short

# block source routed packets
block in quick on dc0 all with opt lsrr
block in quick on dc0 all with opt ssrr

# Block OS fingerprint attempts and log first occurrence
block in log first quick on dc0 proto tcp from any to any flags FUP

# Block anything with special options
block in quick on dc0 all with ipopts

# Block public pings and ident
block in quick on dc0 proto icmp all icmp-type 8
block in quick on dc0 proto tcp from any to any port = 113

# Block incoming Netbios services
block in log first quick on dc0 proto tcp/udp from any to any port = 137
block in log first quick on dc0 proto tcp/udp from any to any port = 138
block in log first quick on dc0 proto tcp/udp from any to any port = 139
block in log first quick on dc0 proto tcp/udp from any to any port = 81

任何时候,只要规则产生日志,使用log first选项,运行ipfstat -hio来评估该规则被匹配的次数。匹配次数过多可能表明系统受到了攻击。

入站部分的其余规则定义了允许从互联网发起的连接。最后一条规则拒绝了本节中以前的规则不允许的所有连接。

# Allow traffic in from ISP's DHCP server. Replace z.z.z.z with
# the same IP address used in the outbound section.
pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state

# Allow public connections to specified internal web server
pass in quick on dc0 proto tcp from any to x.x.x.x port = 80 flags S keep state

# Block and log only first occurrence of all remaining traffic.
block in log first quick on dc0 all

30.5.4. 设置 NAT

若要启用 NAT ,请将这些语句添加到/etc/rc.conf并指定包含 NAT 规则的文件的名称:

gateway_enable="YES"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"

NAT规则很灵活,可以完成许多不同的事情,以满足商业和家庭用户的需求。这里介绍的规则语法经过简化,展示常见的使用方法。完整的规则语法说明请参阅ipnat(5)

NAT规则的基本语法如下,其中map启动规则,IF应替换为外部接口的名称:

map IF LAN_IP_RANGE -> PUBLIC_ADDRESS

LAN_IP_RANGE 是内网中的客户机使用的地址范围。 通常情况下, 这应该是类似 192.168.1.0/24 的地址。PUBLIC_ADDRESS 既可以是外网的 IP 地址, 也可以是 0/32 这个特殊的关键字, 它表示分配到 IF 上的所有地址。

IPF中,当一个数据包从LAN到达防火墙的公开目的地时,它首先通过防火墙规则集的出站规则。然后,该数据包被传递到NAT规则集,该规则集从上而下读取,其中第一个匹配的规则获胜。IPF根据数据包的接口名和源IP地址测试每个NAT规则。当数据包的接口名称与 NAT规则匹配时,将检查该数据包在私有的 LAN中的源 IP地址,以查看它是否位于 LAN_IP_RANGE中指定的 IP地址范围内。在匹配时,数据包的源IP地址将被重写为由PUBLIC_ADDRESS指定的公共IP地址。IPF在其内部的NAT表中发布一个条目,这样当数据包从互联网返回时,可以将其映射回原来的私有IP地址,然后再传递给防火墙规则进行进一步处理。

对于具有大量内部系统或多个子网的网络,将每个专用IP地址插入单个公共IP地址的过程将成为一个资源问题。有两种方法可以缓解此问题。

第一个方法是指定一个范围内的端口作为源端口。通过添加 portmap关键字, NAT 可以被引导到只使用指定范围内的源端口:

map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000

另外,还可以使用 auto关键字,该关键字会告诉 NAT 可用的端口号:

map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto

第二种方法是使用公共地址池。当有太多的 LAN地址无法放入一个公共地址中,而有一个公共 IP地址块可用时,这种方法很有用。这些公共地址可以作为一个池子来使用,NAT会从其中选择一个IP地址,因为数据包的地址被映射到它的出路上。

可以使用子网掩码或CIDR表示法指定公共IP地址的范围。以下两个规则是等效的:

map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0
map dc0 192.168.1.0/24 -> 204.134.75.0/24

常见的做法是将公开访问的Web服务器或邮件服务器隔离到一个内部网段。来自这些服务器的流量仍然需要经过NAT,但需要进行端口重定向,将入站流量引导到正确的服务器。例如,要将一个使用内部地址10.0.10.25的web服务器映射到它的公共IP地址20.20.20.5,使用这个规则:

rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80

如果它是唯一的Web服务器,这个规则也会起作用,因为它将所有外部的HTTP请求重定向到10.0.10.25

rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80

IPF内置了FTP代理,可与NAT一起使用。它可以监控所有主动或被动的FTP连接请求,并动态地创建包含FTP数据通道使用的端口号的临时过滤规则。这样就不需要为FTP连接打开过多的高阶端口。

在这个例子中,第一个规则调用来自内部 LANFTP出站流量的代理。第二条规则将防火墙上的FTP流量传递到Internet,第三条规则处理来自内部LAN的所有非FTP流量:

map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp
map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp
map dc0 10.0.10.0/29 -> 0/32

FTP map 规则走在NAT规则之前,这样,当数据包与FTP规则匹配时,FTP代理会创建临时过滤规则,让FTP数据包通过 NAT。所有非 FTP的局域网数据包将不符合 FTP规则,但如果符合第三条规则,则会通过 NAT

如果没有FTP代理,则需要使用以下防火墙规则。注意,在没有代理的情况下,所有1024以上的端口都需要被允许:

# Allow out LAN PC client FTP to public Internet
# Active and passive modes
pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state

# Allow out passive mode data channel high order port numbers
pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state

# Active mode let data channel in from FTP server
pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state

每当编辑包含NAT的规则时,请运行ipnat,并使用-CF删除当前的NAT规则,并刷新动态翻译表。包括-f并指定要加载的NAT规则集的名称:

# ipnat -CF -f /etc/ipnat.rules

显示NAT的统计信息:

# ipnat -s

列出当前的NAT表:

# ipnat -l

要打开详细模式并显示与规则处理和活动规则和表条目相关的信息,请执行:

# ipnat -v

30.5.5. 检视IPF统计信息

IPF包括ipfstat(8),它可以用来检索和显示统计数据,当数据包通过防火墙时,数据包与规则匹配时,就会收集到这些统计数据。自防火墙上次启动或上次使用ipf -Z将其重置为零以来,统计数字会被累积。

ipfstat默认输出如下:

input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
 output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
 input packets logged: blocked 99286 passed 0
 output packets logged: blocked 0 passed 0
 packets logged: input 0 output 0
 log failures: input 3898 output 0
 fragment state(in): kept 0 lost 0
 fragment state(out): kept 0 lost 0
 packet state(in): kept 169364 lost 0
 packet state(out): kept 431395 lost 0
 ICMP replies: 0 TCP RSTs sent: 0
 Result cache hits(in): 1215208 (out): 1098963
 IN Pullups succeeded: 2 failed: 0
 OUT Pullups succeeded: 0 failed: 0
 Fastroute successes: 0 failures: 0
 TCP cksum fails(in): 0 (out): 0
 Packet log flags set: (0)

有几个选项可供选择。当提供-i用于入站,或者-o用于出站时,该命令将检索并显示相应的过滤规则列表。要查看规则的编号,请包含-n。例如,ipfstat -on会显示带规则号的出站规则表:

@1 pass out on xl0 from any to any
@2 block out on dc0 from any to any
@3 pass out quick on dc0 proto tcp/udp from any to any keep state

加入-h,在每条规则前加上一个规则匹配次数的前缀。例如,ipfstat -oh显示出站内部规则表,在每个规则的前缀上加上使用次数:

2451423 pass out on xl0 from any to any
354727 block out on dc0 from any to any
430918 pass out quick on dc0 proto tcp/udp from any to any keep state

要以类似于top(1)的格式显示状态表,请使用ipfstat -t。当防火墙受到攻击时,这个选项提供了识别和查看攻击数据包的能力。可选子标志提供了选择要实时监控的目标或源 IP、端口或协议的能力。有关详细信息,请参阅 ipfstat(8)

30.5.6. IPF日志

IPF提供了ipmon,可用于生成人类可读的防火墙日志。若需使用,须将options IPFILTER_LOG添加到内核配置文件中,参考第 8 章 配置 FreeBSD 内核

这条命令通常是在守护进程模式下运行的, 以便提供一个连续的系统日志文件, 以便查看过去的事件记录。由于 FreeBSD 有一个内置的 syslogd(8) 工具来自动轮换系统日志, 因此默认的 rc.conf ipmon_flags语句使用了 -Ds

ipmon_flags="-Ds" # D = start as daemon
                  # s = log to syslog
                  # v = log tcp window, ack, seq
                  # n = map IP & port to names

日志提供了事后审查信息的能力,例如哪些数据包被丢弃了,它们来自什么地址,以及它们要去哪里。这些信息对追踪攻击者很有用。

rc.conf中启用日志记录,并执行service ipmon startIPF将只记录包含log关键字的规则。防火墙管理员决定记录规则集中哪些规则应该被记录,通常只记录拒绝规则。通常情况下,在规则集的最后一条规则中包含log关键字。这样就可以看到所有不符合规则集中任何一条规则的数据包。

默认情况下,ipmon -Ds模式使用local0作为记录设施。以下的日志级别可以用来进一步隔离记录数据:

LOG_INFO - packets logged using the "log" keyword as the action rather than pass or block.
LOG_NOTICE - packets logged which are also passed
LOG_WARNING - packets logged which are also blocked
LOG_ERR - packets which have been logged and which can be considered short due to an incomplete header

为了让IPF将所有数据记录到/var/log/ipfilter.log,首先创建空文件:

# touch /var/log/ipfilter.log

然后,要将所有记录的消息写入指定的文件,请在/etc/syslog.conf中添加以下语句:

local0.* /var/log/ipfilter.log

要应用更改,并指示 syslogd(8)读取修改后的 /etc/syslog.conf,请执行 service syslogd reload

不要忘记编辑/etc/newsyslog.conf轮转新的日志文件。

ipmon生成的信息由空白分隔的数据字段组成。所有消息共有的字段包括:

  1. 数据包接收的日期。

  2. 数据包的接收时间。其形式为 HH:MM:SS.F,为时、分、秒、分、秒、秒的分数。

  3. 处理数据包的接口的名称。

  4. 组和规则的编号, 例如@0:17

  5. 动作:p表示通过,b表示阻塞,s表示短包,n不符合任何规则,L表示日志规则。

  6. 地址写成三个字段:用逗号分隔的源地址和端口,>符号,以及目的地址和端口。例如:209.53.17.22,80 -> 198.73.220.17,1722

  7. PR后面是协议名称或编号:例如,PR tcp

  8. len后跟数据包的标头长度和总长度:例如,len 20 40

如果数据包是TCP数据包,则会有一个以连字符开头的附加字段,后面是与任何已设置的标志相对应的字母。有关字母及其标志的列表,请参阅 ipf(5)

如果数据包是ICMP数据包,那么末尾会有两个字段:第一个字段总是icmp,下一个字段是ICMP报文和子报文类型,用斜线隔开。例如icmp 3/3 表示端口无法到达的报文。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.