系统管理指南:IP 服务

第 25 章 Oracle Solaris : IP 过滤器(概述)

本章概述了 Oracle Solaris : IP 过滤器。有关 Oracle Solaris : IP 过滤器的任务,请参见第 26 章

本章包含以下信息:

Oracle Solaris : IP 过滤器的新增功能

本节介绍 Oracle Solaris : IP 过滤器的新增功能。

有关新增功能的完整列表以及 Oracle Solaris : 发行版的说明,请参见《Oracle Solaris 10 9/10 新增功能》

包过滤器钩子

从 Solaris 10 7/07 发行版开始在 Oracle Solaris : 中将包过滤器钩子用于包过滤。此功能在系统管理方面具有以下优点:

有关这些钩子进一步的详细信息,请参见包过滤器钩子。有关与包过滤器钩子相关的任务,请参见第 26 章

Oracle Solaris : IP 过滤器的 IPv6 包过滤

Solaris 10 6/06:对于使用 IPv6 配置其全部或部分网络基础结构的系统管理员,Oracle Solaris : IP 过滤器已增强为包括 IPv6 包过滤。IPv6 包过滤可以基于源/目标 IPv6 地址、包含 IPv6 地址的池和 IPv6 扩展头进行过滤。

-6 选项已添加到 ipf 命令和 ipfstat 命令中以用于 IPv6。虽然对于 ipmonippool 命令,命令行界面没有进行更改,但是这些命令也支持 IPv6。ipmon 命令已增强为包含 IPv6 包的日志记录,并且 ippool 命令可支持在池中包括 IPv6 地址。

有关更多信息,请参见“用于 Oracle Solaris : IP 过滤器的 IPv6”。有关与 IPv6 包过滤相关的任务,请参见第 26 章

Oracle Solaris : IP 过滤器简介

Oracle Solaris : IP 过滤器替代了 SunScreen 防火墙,并且用作 Oracle Solaris : 的防火墙软件。与 SunScreen 防火墙一样,Oracle Solaris : IP 过滤器也会提供状态包过滤和网络地址转换 (network address translation, NAT)。Oracle Solaris : IP 过滤器还具有无状态包过滤功能,并且可以创建和管理地址池。

包过滤可提供基本的保护以防止基于网络的攻击。Oracle Solaris : IP 过滤器可以按 IP 地址、端口、协议、网络接口和流量方向来进行过滤。Oracle Solaris : IP 过滤器还可以按单个源 IP 地址、目标 IP 地址、IP 地址范围或地址池进行过滤。

Oracle Solaris : IP 过滤器是从开放源代码的 IP 过滤器软件衍生而来的。要查看开放源代码 IP 过滤器的许可证条款、所有权和版权声明,缺省路径为 /usr/lib/ipf/IPFILTER.LICENCE。如果已将 Oracle Solaris : 安装在其他位置而非缺省位置,请修改所指定的路径,以在安装位置访问该文件。

开放源代码 IP 过滤器的信息源

Darren Reed 编写的开放源代码 IP 过滤器软件的主页可以在 http://coombs.anu.edu.au/~avalon/ip-filter.html 上找到。此站点包括有关开放源代码 IP 过滤器的信息,其中包括指向标题为 "IP Filter Based Firewalls HOWTO"(Brendan Conoboy 和 Erik Fichtner,2002)的教程的链接。此教程提供了在 BSD UNIX 环境中构建防火墙的逐步说明。此教程虽然是针对 BSD UNIX 环境编写的,但也与 Oracle Solaris : IP 过滤器的配置相关。

Oracle Solaris : IP 过滤器包处理

在处理包时,Oracle Solaris : IP 过滤器会执行一系列步骤。下图说明处理包的步骤,以及过滤如何与 TCP/IP 协议栈集成在一起。

图 25–1 包处理顺序

说明与 Oracle Solaris : IP 过滤器包处理关联的步骤顺序。

包处理顺序包括下列步骤:

使用 OpenSolaris IP 过滤器的指导

使用 Oracle Solaris : IP 过滤器配置文件

Oracle Solaris : IP 过滤器可用于提供防火墙服务或网络地址转换 (network address translation, NAT)。可以使用可装入的配置文件实现 Oracle Solaris : IP 过滤器。Oracle Solaris : IP 过滤器包括一个名为 /etc/ipf 的目录。可以创建名为 ipf.confipnat.confippool.conf 的配置文件,并将其存储在 /etc/ipf 目录中。当这些文件驻留在 /etc/ipf 目录中时,在引导过程中会将其自动装入。也可以将配置文件存储在其他位置并将其手动装入。有关配置文件的示例,请参见创建和编辑 Oracle Solaris : IP 过滤器配置文件

使用 Oracle Solaris : IP 过滤器规则集

要管理防火墙,请使用 Oracle Solaris : IP 过滤器指定用于过滤网络通信流量的规则集。可以创建以下类型的规则集:

此外,还可以创建地址池以引用 IP 地址组。然后,可以在规则集中使用这些池。地址池有助于加快规则处理速度,还可使大型地址组更易于管理。

使用 Oracle Solaris : IP 过滤器的包过滤功能

可以使用包过滤规则集来设置包过滤。使用 ipf 命令可以对包过滤规则集进行处理。有关 ipf 命令的更多信息,请参见 ipf(1M) 命令。

可以在命令行上使用 ipf 命令或在包过滤配置文件中创建包过滤规则。如果希望在引导时装入包过滤规则,请创建一个名为 /etc/ipf/ipf.conf 的配置文件,在其中放置包过滤规则。如果不希望在引导时装入包过滤规则,请将 ipf.conf 文件放置在所选的位置中,然后使用 ipf 命令手动激活包过滤。

使用 Oracle Solaris : IP 过滤器可以维护两种包过滤规则集:活动规则集和非活动规则集。大多数情况下,会使用活动规则集。但是,使用 ipf -I 命令可以将命令操作应用于非活动规则列表。除非您选择非活动规则列表,否则 Oracle Solaris : IP 过滤器不会使用该列表。非活动规则列表可提供一个存储规则的位置,而不会影响活动包过滤。

在传递或阻止包之前,Oracle Solaris : IP 过滤器会按照从已配置规则列表开头到其结尾的顺序处理规则列表中的规则。Oracle Solaris : IP 过滤器可维护用于确定它是否将传递包的标志。它会遍历整个规则集,并基于最后一个匹配规则来确定是传递包还是阻止包。

此过程有两种例外情况。第一种例外情况是当包与包含 quick 关键字的规则匹配时。如果规则包括 quick 关键字,则会针对该规则执行操作,并且不会检查后续规则。第二种例外情况是当包与包含 group 关键字的规则匹配时。如果包与组匹配,则仅会检查标记有该组的规则。

配置包过滤规则

使用以下语法可创建包过滤规则:

action [in|out] option keyword, keyword...

  1. 每个规则都以操作开头。如果包与规则匹配,则 Oracle Solaris : IP 过滤器将操作应用于该包。以下列表包括应用于包的常用操作。

    block

    阻止包通过过滤器。

    pass

    允许包通过过滤器。

    log

    记录包但不确定是阻止包还是传递包。使用 ipmon 命令可查看日志。

    count

    将包包括在过滤器统计信息中。使用 ipfstat 命令可查看统计信息。

    skip number

    使过滤器跳过 number 个过滤规则。

    auth

    请求由验证包信息的用户程序执行包验证。该程序会确定是传递包还是阻止包。

    preauth

    请求过滤器查看预先验证的列表以确定如何处理包。

  2. 操作后面的下一个单词必须是 inout。您的选择将确定是将包过滤规则应用于传入包还是应用于传出包。

  3. 接下来,可以从选项列表中进行选择。如果使用多个选项,则这些选项必须采用此处显示的顺序。

    log

    如果规则是最后一个匹配规则,则记录包。使用 ipmon 命令可查看日志。

    quick

    如果存在匹配的包,则执行包含 quick 选项的规则。所有进一步的规则检查都将停止。

    on interface-name

    仅当包移入或移出指定接口时才应用规则。

    dup-to interface-name

    复制包并将 interface-name 上的副本向外发送到随意指定的 IP 地址。

    to interface-name

    将包移动到 interface-name 上的外发队列。

  4. 指定选项后,可以从确定包是否与规则匹配的各关键字中进行选择。必须按此处显示的顺序使用以下关键字。


    注 –

    缺省情况下,所有与配置文件中的任何规则都不匹配的包会通过此过滤器。


    tos

    基于表示为十六进制或十进制整数的服务类型值,对包进行过滤。

    ttl

    基于包的生存时间值与包匹配。在包中存储的生存时间值指明了包在被废弃之前可在网络中存在的时间长度。

    proto

    与特定协议匹配。可以使用在 /etc/protocols 文件中指定的任何协议名称,或者使用十进制数来表示协议。关键字 tcp/udp 可以用于与 TCP 包或 UDP 包匹配。

    from/to/all/ any

    与以下任一项或所有项匹配: 源 IP 地址、目标 IP 地址和端口号。all 关键字用于接受来自所有源和发往所有目标的包。

    with

    与和包关联的指定属性匹配。在关键字前面插入 notno 一词,以便仅当选项不存在时才与包匹配。

    flags

    供 TCP 用来基于已设置的 TCP 标志进行过滤。有关 TCP 标志的更多信息,请参见 ipf(4) 手册页。

    icmp-type

    根据 ICMP 类型进行过滤。仅当 proto 选项设置为 icmp 时才使用此关键字;如果使用 flags 选项,则不使用此关键字。

    keep keep-options

    确定为包保留的信息。可用的 keep-options 包括 state 选项和 frags 选项。state 选项会保留有关会话的信息,并可以保留在 TCP、UDP 和 ICMP 包中。frags 选项可保留有关包片段的信息,并将该信息应用于后续片段。keep-options 允许匹配包通过,而不会查询访问控制列表。

    head number

    为过滤规则创建一个新组,该组由数字 number 表示。

    group number

    将规则添加到编号为 number 的组而不是缺省组。如果未指定其他组,则将所有过滤规则放置在组 0 中。

以下示例说明如何组织包过滤规则语法以创建规则。要阻止从 IP 地址 192.168.0.0/16 传入的通信流量,需要在规则列表中包括以下规则:


block in quick from 192.168.0.0/16 to any

有关用于编写包过滤规则的完整语法和句法,请参见 ipf(4) 手册页。有关与包过滤关联的任务,请参见管理 Oracle Solaris : IP 过滤器的包过滤规则集。有关示例中所示的 IP 地址方案 (192.168.0.0/16) 的说明,请参见第 2 章

使用 Oracle Solaris : IP 过滤器的 NAT 功能

NAT 可设置映射规则,用于将源 IP 地址和目标 IP 地址转换为其他 Internet 或内联网地址。这些规则可修改传入或传出 IP 包的源地址和目标地址并继续发送包。另外,还可以使用 NAT 将流量从一个端口重定向到另一个端口。在对包进行任何修改或重定向的过程中,NAT 将维护包的完整性。

使用 ipnat 命令可对 NAT 规则列表进行处理。有关 ipnat 命令的更多信息,请参见 ipnat(1M) 命令。

可以在命令行上使用 ipnat 命令或在 NAT 配置文件中创建 NAT 规则。NAT 配置规则驻留在 ipnat.conf 文件中。如果希望在引导时装入 NAT 规则,请创建一个名为 /etc/ipf/ipnat.conf 的文件,在其中放置 NAT 规则。如果不希望在引导时装入 NAT 规则,请将 ipnat.conf 文件放置在所选的位置中,然后使用 ipnat 命令手动激活包过滤。

配置 NAT 规则

使用以下语法创建 NAT 规则:

command interface-name parameters

  1. 每个规则都以以下命令之一开头:

    map

    在无法控制的循环过程中将一个 IP 地址或网络映射到另一个 IP 地址或网络。

    rdr

    将包从一个 IP 地址和端口对重定向到另一个 IP 地址和端口对。

    bimap

    在外部 IP 地址和内部 IP 地址之间建立双向 NAT。

    map-block

    建立基于静态 IP 地址的转换。此命令基于将地址强制转换为目标范围的算法。

  2. 此命令后面的下一个单词是接口名称,如 hme0

  3. 接下来,可以从确定 NAT 配置的各种参数中进行选择。其中一些参数包括:

    ipmask

    指定网络掩码。

    dstipmask

    指定 ipmask 要转换成的地址。

    mapport

    指定 tcpudptcp/udp 协议以及端口号的范围。

以下示例说明如何组织 NAT 规则语法以创建 NAT 规则。要重新编写从源地址为 192.168.1.0/24de0 设备上传出的包并在外部将该设备的源地址显示为 10.1.0.0/16,需要在 NAT 规则集中包括以下规则:


map de0 192.168.1.0/24 -> 10.1.0.0/16

有关用于编写 NAT 规则的完整语法和句法,请参见 ipnat(4) 手册页。

使用 Oracle Solaris : IP 过滤器的地址池功能

地址池可建立用于命名一组地址/网络掩码对的单个引用。地址池提供可减少将 IP 地址与规则相匹配的时间的进程,还可使大型地址组更易于管理。

地址池配置规则驻留在 ippool.conf 文件中。如果希望在引导时装入地址池规则,请创建一个名为 /etc/ipf/ippool.conf 的文件,在其中放置地址池规则。如果不希望在引导时装入地址池规则,请将 ippool.conf 文件放置在所选的位置中,然后使用 ippool 命令手动激活包过滤。

配置地址池

使用以下语法可创建地址池:


table role = role-name type = storage-format number = reference-number
table

定义对多个地址的引用。

role

指定 Oracle Solaris : IP 过滤器中池的角色。此时,可以引用的唯一角色是 ipf

type

指定池的存储格式。

number

指定过滤规则所用的引用号。

例如,要将地址组 10.1.1.1 和 10.1.1.2 以及网络 192.16.1.0 作为池编号 13 引用,需要在地址池配置文件中包括以下规则:

table role = ipf type = tree number = 13 
{ 10.1.1.1/32, 10.1.1.2/32, 192.168.1.0/24 };

然后,要在过滤规则中引用池编号 13,需要构建与以下示例类似的规则:


pass in from pool/13 to any

请注意,必须在装入包含对池的引用的规则文件之前装入池文件。如果不这样做,则池是未定义的,如以下输出所示:


# ipfstat -io
empty list for ipfilter(out)
block in from pool/13(!) to any

即使稍后添加池,所添加的池也不会更新内核规则集。另外,还需要重新装入引用池的规则文件。

有关用于编写包过滤规则的完整语法和句法,请参见 ippool(4) 手册页。

包过滤器钩子

从 Solaris 10 7/07 发行版开始,包过滤器钩子替代 pfil 模块以启用 Oracle Solaris : IP 过滤器。在早期的 Oracle Solaris : 发行版中,要求配置 pfil 模块作为设置 Oracle Solaris : IP 过滤器的附加步骤。这一额外的配置要求增加了出现错误进而可能导致 Oracle Solaris : IP 过滤器无法正常工作的风险。此外,在 IP 和设备驱动程序之间插入 pfil STREAMS 模块会导致性能下降。最后,pfil 模块无法在区域之间执行包拦截。

包过滤器钩子的使用简化了启用 Oracle Solaris : IP 过滤器的过程。通过这些钩子,Oracle Solaris : IP 过滤器使用 pre-routing(输入)和 post-routing(输出)过滤器阀控制进出 Oracle Solaris : 系统的包流。

有了包过滤器钩子,就不必使用 pfil 模块。因此,与该模块相关的下列组件也已被删除。

有关与启用 Oracle Solaris : IP 过滤器相关的任务,请参见第 26 章

Oracle Solaris : IP 过滤器和 pfil STREAMS 模块


注 –

pfil 模块只能在以下 Oracle Solaris 10 发行版中与 Oracle Solaris : IP 过滤器一起使用:

从 Solaris 10 7/07 发行版开始,pfil 模块已被包过滤器钩子所替代,不再与 Oracle Solaris : IP 过滤器一起使用。


pfil STREAMS 模块是启用 Oracle Solaris : IP 过滤器所必需的。但是,Oracle Solaris : IP 过滤器不提供将模块推送到每个接口上的自动机制。相反,pfil STREAMS 模块由 SMF 服务 svc:/network/pfil 进行管理。要在网络接口上激活过滤,需要首先配置 pfil.ap 文件。然后激活 svc:/network/pfil 服务,以便为网络接口提供 pfil STREAMS 模块。要使 STREAMS 模块生效,必须重新引导系统,或者必须取消检测要过滤的每个网络接口,然后重新检测。要激活 IPv6 包过滤功能,需要检测接口的 inet6 版本。

如果未找到网络接口的 pfil 模块,请将 SMF 服务置于维护状态。导致此情况的最常见原因是错误编辑了 /etc/ipf/pfil.ap 文件。如果将服务置于维护模式,则在过滤日志文件中会记录事件。

有关与激活 Oracle Solaris : IP 过滤器关联的任务,请参见配置 Oracle Solaris : IP 过滤器

用于 Oracle Solaris : IP 过滤器的 IPv6

从 Solaris 10 6/06 发行版开始,Oracle Solaris : IP 过滤器可以支持 IPv6。IPv6 包过滤可以基于源/目标 IPv6 地址、包含 IPv6 地址的池和 IPv6 扩展头进行过滤。

IPv6 在许多方面都与 IPv4 类似。但是,这两个版本的 IP 的包头和包大小是不同的,这是 IP 过滤器的重要注意事项。称为 jumbogram 的 IPv6 包包含长度超过 65,535 字节的数据报。Oracle Solaris : IP 过滤器不支持 IPv6 jumbogram。要了解有关其他 IPv6 功能的更多信息,请参见IPv6 的主要特征


注 –

有关 jumbogram 的更多信息,请参阅 Internet 工程任务组 (Internet Engineering Task Force, IETF) 的文档 "IPv6 Jumbograms" (RFC 2675)。[http://www.ietf.org/rfc/rfc2675.txt]


与 IPv6 关联的 IP 过滤器任务和与 IPv4 关联的任务差异不大。最明显的差异是,前者将 -6 选项与某些命令一起使用。ipf 命令和 ipfstat 命令都包括用于 IPv6 包过滤的 -6 选项。使用带有 -6 选项的 ipf 命令可以装入和清除 IPv6 包过滤规则。要显示 IPv6 统计信息,请使用带有 -6 选项的 ipfstat 命令。尽管没有用于 IPv6 支持的关联选项,ipmonippool 命令仍支持 IPv6。ipmon 命令已增强为包含 IPv6 包的日志记录。ippool 命令支持具有 IPv6 地址的包。可以创建仅包含 IPv4 地址或 IPv6 地址的池,或创建在同一池内既包含 IPv4 地址又包含 IPv6 地址的池。

可以使用 ipf6.conf 文件创建用于 IPv6 的包过滤规则集。缺省情况下,ipf6.conf 配置文件包括在 /etc/ipf 目录中。与其他过滤配置文件一样,ipf6.conf 文件存储在 /etc/ipf 目录中时也会在引导过程中自动装入。您也可以在其他位置创建和存储 IPv6 配置文件,然后将其手动装入。


注 –

网络地址转换 (Network Address Translation, NAT) 不支持 IPv6。


设置用于 IPv6 的包过滤规则后,请通过检测接口的 inet6 版本激活 IPv6 包过滤功能。

有关 IPv6 的更多信息,请参见第 3 章。有关与 Oracle Solaris : IP 过滤器相关的任务,请参见第 26 章

Oracle Solaris : IP 过滤器手册页

下表包括与 Oracle Solaris : IP 过滤器相关的手册页文档。

手册页 

说明 

ipf(1M)

使用 ipf 命令可以完成以下任务:

  • 处理包过滤规则集。

  • 禁用和启用过滤。

  • 重置统计信息,并使内核中的接口列表与当前接口状态列表重新同步。

ipf(4)

包含用于创建 Oracle Solaris : IP 过滤器包过滤规则的语法和句法。 

ipfilter(5)

提供开放源代码 IP 过滤器许可信息。 

ipfs(1M)

使用 ipfs 命令保存 NAT 信息和状态表信息并在重新引导后将其恢复。

ipfstat(1M)

使用 ipfstat 命令检索和显示有关包处理的统计信息。

ipmon(1M)

使用 ipmon 命令打开日志设备并查看包过滤和 NAT 的记录包。

ipnat(1M)

使用 ipnat 命令可以完成以下任务:

  • 处理 NAT 规则。

  • 检索和显示 NAT 统计信息。

ipnat(4)

包含用于创建 NAT 规则的语法和句法。 

ippool(1M)

使用 ippool 命令创建和管理地址池。

ippool(4)

包含用于创建 Oracle Solaris : IP 过滤器地址池的语法和句法。 

ndd(1M)

显示 pfil STREAMS 模块的当前过滤参数和可调参数的当前值。