手册页部分 1M: 系统管理命令

退出打印视图

更新时间: 2014 年 7 月
 
 

ipsecconf(1M)

名称

ipsecconf - 配置系统范围的 IPsec 策略

用法概要

/usr/sbin/ipsecconf 
/usr/sbin/ipsecconf -a file [-q]
/usr/sbin/ipsecconf -c file
/usr/sbin/ipsecconf -d [-i tunnel-name] {index, tunnel-name, index}
/usr/sbin/ipsecconf -f [-i tunnel-name]
/usr/sbin/ipsecconf -F
/usr/sbin/ipsecconf -Fa file [-q]
/usr/sbin/ipsecconf -l [-i tunnel-name] [-n]
/usr/sbin/ipsecconf -L [-n]
/usr/sbin/ipsecconf -r file [-q]

描述

ipsecconf 实用程序用于为主机或主机的某个隧道配置 IPsec 策略。配置该策略后,所有传出和传入数据报在退出和进入主机或隧道时都要受到该策略检查。对于主机策略,如果未找到任何条目,则不会完成任何策略检查,并且将传输所有通信。对于隧道,如果该隧道至少有一个条目,但未找到任何条目,则将自动丢弃通信。出现以上行为差异是因为大量实现中对 IPsec 隧道做了相关假设。转发的数据报不会受到使用此命令添加的策略检查。有关如何保护转发的数据包的信息,请参见 ifconfig(1M)dladm(1M)。系统根据匹配的策略条目采取具体操作。

该命令只能由超级用户运行。

每个条目可以保护某一方向的通信(保护两个方向需要一对条目),也可以通过单个策略条目来保护双向通信(该条目安装所需的对称 sadb 规则)。

如果在不带任何参数的情况下执行此命令,则会显示装入的文件策略条目的列表。要显示 SPD 策略条目,请使用 –l 选项。两种方法均会显示条目的索引号。要指定一个隧道的 SPD,请组合使用 –i 选项和 –l。要指定主机和所有隧道的全部 SPD,请使用 –L

请注意,由于一个文件策略条目 (file policy entry, FPE) 可生成多个 SPD 策略条目 (SPD policy entry, SPE),因此 FPE 的列表可能不会显示所有实际条目。但是,这仍有助于确定 spd 变为当前状态是因添加的哪些规则导致的。

组合使用 –d 选项和索引可以删除系统中的给定策略。如果 –d 选项要删除的 FPE 条目生成了多个 SPE,则将仅删除其策略索引与该 FPE 相同的 SPD。这可能会导致存在 SPE 而没有任何 FPE 的情况。

–l 一样,–d 也可以使用 –i 标志表示隧道。另一种语法是指定隧道名称,后跟逗号 (,),再后跟索引。例如,ip.tun0,1

如果没有任何选项,则会按条目的添加顺序来显示它们,该顺序不一定是匹配通信的顺序。

要查看匹配通信的顺序,请使用 –l 选项。规则按照以下顺序检查:首先检查所有 bypass 规则,然后检查 ESP 规则,再检查 AH 规则。然后按照规则的输入顺序检查规则。

系统重新启动后策略条目将丢失。永久性策略条目应添加到 /etc/inet/ipsecinit.conf。该文件由以下 smf(5) 服务读取:

svc:/network/ipsec/policy

有关管理 IPsec 安全策略的更多信息,请参见“附注”部分;有关保护 /etc/inet/ipsecinit.conf 的问题,请参见“安全”部分。

选项

ipsecconf 支持以下选项:

–a file

按照文件中各个条目的指定向系统添加 IPsec 策略。IPsec 配置文件包含指定系统配置的一个或多个条目。添加策略后,所有传出和传入数据报都将受到该策略检查。

下面的Operands部分介绍了这些文件中的条目。下面的Examples部分提供了一些示例。

对于 connect(3SOCKET)accept(3SOCKET) 处理的 TCP/UDP 套接字,将锁定策略。因此,添加新策略条目不会影响此类端点或套接字。但是,系统将对已有非空策略的套接字锁定策略。因此,请确保不存在新策略条目要检查的连接。

上述策略锁定功能将来可能会发生更改。建议不要依赖此功能。

缺省行为是向现有策略附加新规则。如果新规则与现有规则冲突,则会报告错误,并且将不会添加新规则。

要添加与现有规则冲突的新规则,必须删除现有规则(请参见下文)或清空现有策略。如果清空策略,在添加新策略之前,IPsec 将不会保护任何网络通信。

–F(清空)标志可以与 –a 组合使用来执行原子策略替换;现有策略将替换为配置文件中描述的新策略。通过组合这两个标志,系统几乎没有不存在策略的窗口期,在清空命令后立即运行添加命令即会如此。

–c file

检查配置文件的语法并报告发现的任何错误,但不会对策略进行任何更改。调试配置以及 smf(5) 报告配置错误时,此选项非常有用。请参见“安全”部分。

–d index

删除索引表示的主机策略。通过调用不带任何参数或带有 –l 选项的 ipsecconf,可以获取索引。有关更多信息,请参见“描述”部分。删除策略条目之后,受该策略条目影响的所有传出和传入数据报都不会再受到该策略检查。请注意,对于已锁定策略的连接,传出数据包将继续使用相同策略进行检查,即使该策略已被删除也是如此。建议使用 –l 选项查找正确的策略索引。

–d name,index

name 表示的隧道上删除 index 表示的策略条目。由于隧道可影响源自非本地节点的通信,因此锁定对隧道策略的作用并不像主机策略那样。等效于:–d index –i name

–f

清空系统中的所有策略。在锁定以及主机与各隧道行为方面,该选项的约束与 –d 选项类似。

–F

清空所有隧道的所有策略,同时清空所有主机策略。请参见上文选项 –a 中关于组合使用 –F–a 选项的讨论。

–i name

指定一个与 –d–f–l 标志一起使用的隧道接口名称。

–l

列出一个策略表,缺省为主机策略。如果调用不带任何参数的 ipsecconf,则会显示自引导以来用户添加的策略条目及其索引的完整列表。例如,如果添加了多宿主条目或发生策略重新排序,或者如果某个规则条目生成了两个 spd 规则,当前表可能与上一表不同。对于多宿主条目,将显式列出所有地址。如果以前未指定掩码,而是从地址推断而来,则会在此处显式列出掩码。此选项用于按正确顺序显示策略条目。传出和传入策略条目单独列出。

–L

列出所有策略表,包括主机策略和所有隧道实例(包括已配置但未激活的实例)。

如果指定了 –i–L 会列出特定隧道接口的策略表。

–n

用数字显示网络地址、端口、协议。–n 选项只能与 –l 选项一起使用。

–q

静默模式。添加策略时不显示生成的警告消息。

–r file

根据 file 中各个条目的指定,从系统中删除 IPsec 策略规则。该文件的内容格式与使用 –a 选项指定的内容格式相同。该文件可使用 ipsecconf –l 创建,并使用编辑器进行编辑。

操作数

每个策略条目包含按如下方式指定的三个部分:

{pattern} action {properties}

{pattern} action {properties} ["or" action {properties}]*

每个策略条目都从一个新行开始,并且可跨越多个行。如果某个条目超出行长度,则只能在 "{}" 部分中拆分该条目,或者紧接在 {} 部分的第一个(左)花括号之前拆分该条目。避免使用反斜杠字符 (\)。请参见“示例”部分。

以上语法中显示的 pattern 部分指定传出和传入数据报进行匹配时所应依据的通信模式。如果存在匹配项,将根据策略条目的 properties 执行第二个参数确定的特定 action

如果规则中包含 or(一个给定模式具有多个操作-属性),发送器将使用第一个有效的操作-属性对,而接收器将使用可接受的任何操作-属性对。

patternproperties 是名称-值对,其中名称和值使用 <space>、<tab> 或 <newline> 分隔。多个名称-值对应使用 <space>、<tab> 或 <newline> 分隔。模式和属性的开头和结尾分别使用 {} 标记。

文件可包含多个策略条目。pattern 中未指定的名称-值对将视为通配符。通配符条目与数据报中的任意对应条目匹配。

应注意的一点是:始终会绕过 UDP 端口 500,而不考虑任何策略条目。这是保证 in.iked(1M) 正常工作的一个要求。

# 作为第一个字符,可以在文件添加注释。可以在行开头或末尾插入注释。

策略条目的完整语法为:


policy ::= { <pattern1> } <action1> { <properties1> } |
     { <pattern2> } <action2> { <properties2> } 
     [ 'or' <action2> { <properties2>} ]*

     pattern1 ::=  <pattern_name_value_pair1>*

     pattern2 ::=  <pattern_name_value_pair2>*
 
     action1 ::= apply | permit | bypass | pass
     action2 ::=  bypass | pass | drop | ipsec

     properties1 ::=   {<prop_name_value_pair1>}
     properties2 ::=   {<prop_name_value_pair2>}


     pattern_name_value_pair1 ::=
        saddr <address>/<prefix> |
        src  <address>/<prefix> |
        srcaddr <address>/<prefix> |      
        smask <mask> |
        sport <port> |
        daddr <address>/<prefix> |
        dst <address>/<prefix> |
        dstaddr <address>/<prefix> |
        dmask <mask> |
        dport <port> |
        ulp <protocol> |
        proto <protocol> |
        type <icmp-type> |
        type <number>-<number> |
        code <icmp-code>
        code <number>-<number>
        tunnel <interface-name> |
        negotiate <tunnel,transport>

     pattern_name_value_pair2 ::=
        raddr <address>/<prefix> |
        remote <address>/<prefix> |
        rport <port> |
        laddr <address>/<prefix> |
        local <address>/<prefix> |
        lport <port> |
        ulp <protocol> |
        type <icmp-type> |
        type <number>-<number> |
        code <icmp-code> |
        code <number>-<number>
        proto <protocol>  |
        tunnel <interface-name> |
        negotiate <tunnel,transport> |
        dir <dir_val2>

     address ::=  <IPv4 dot notation> | <IPv6 colon notation> |
                  <String recognized by gethostbyname>|
                  <String recognized by getnetbyname>

     prefix ::=  <number>

     mask ::= <0xhexdigit[hexdigit]> | <0Xhexdigit[hexdigit]> |
              <IPv4 dot notation>

     port ::= <number>| <String recognized by getservbyname>

     protocol ::=  <number>| <String recognized by getprotobyname>

     prop_name_value_pair1 ::=
          auth_algs <auth_alg> |
          encr_algs <encr_alg> |
          encr_auth_algs <auth_alg> |
          sa <sa_val> |
          dir <dir_val1>

     prop_name_value_pair2 ::=
          auth_algs <auth_alg> |
          encr_algs <encr_alg> |
          encr_auth_algs <auth_alg> |
          sa <sa_val>

     auth_alg ::=  <auth_algname> ['(' <keylen> ')']
     auth_algname ::= any | md5 | hmac-md5 | sha | sha1 | hmac-sha | 
                      hmac-sha1 | hmac-sha256 | hmac-sha384 | 
                      hmac-sha512 | aes-gmac128 | aes-gmac192 |
                      aes-gmac256 | <number>

     encr_alg ::= <encr_algname> ['(' <keylen> ')']
     encr_algname ::= any | aes | aes-cbc | des | des-cbc | 3des | 
                      3des-cbc | blowfish | blowfish-cbc | aes-ccm | 
                      aes-gcm | aes-none-gmac | <number>
     
     keylen ::= <number> | <number>'..' | '..'<number> | <number>'..' \
     <number>

     sa_val ::= shared | unique

     dir_val1 ::= out | in
     dir_val2 ::= out | in | both

     number ::= < 0 | 1 | 2 ... 9> <number>
     icmp-type ::= <number> | unreach | echo | echorep | squench |
                   redir | timex | paramprob | timest | timestrep |
                   inforeq | inforep | maskreq | maskrep | unreach6 |
                   pkttoobig6 | timex6 | paramprob6 | echo6 | echorep6 |
                   router-sol6 | router-ad6 | neigh-sol6 | neigh-ad6 |
                   redir6

     icmp-code ::= <number> | net-unr | host-unr | proto-unr | port-unr |
                   needfrag | srcfail | net-unk | host-unk | isolate |
                   net-prohib | host-prohib | net-tos | host-tos |
                   filter-prohib | host-preced | cutoff-preced |
                   no-route6 | adm-prohib6 | addr-unr6 | port-unr6 |
                   hop-limex6 | frag-re-timex6 | err-head6 | unrec-head6 |
                   unreq-opt6

策略条目的 pattern 字段中可包含下列(名称值)对。在给定策略条目中每个(名称值)对只能出现一次。

laddr/plen
local/plen

后跟的值是数据报的本地地址以及前缀长度。只匹配数据包源地址的 plen 前导位。plen 是可选的。Local 表示传入数据包的目标和传出数据包的源。源地址值可以是 getaddrinfo(3SOCKET) 中所述的主机名、getnetbyname(3XNET) 中所述的网络名或者采用 Internet 标准点记法的主机地址或网络地址。请参见 inet_addr(3XNET)。如果指定了一个主机名而 getaddrinfo(3SOCKET) 返回多个主机地址,则会为每个地址添加策略,添加时除地址以外的其他项保持不变。

raddr/plen
remote/plen

后跟的值是数据报的远程地址以及前缀长度。只匹配数据包远程地址的 plen 前导位。plen 是可选的。Remote 表示传入数据包的源和传出数据包的目标。远程地址值可以是 getaddrinfo(3SOCKET) 中所述的主机名、getnetbyname(3XNET) 中所述的网络名或者采用 Internet 标准点记法的主机地址或网络地址。请参见 inet_addr(3XNET)。如果指定了一个主机名而 getaddrinfo(3SOCKET) 返回多个主机地址,则会为每个地址添加策略,添加时除地址以外的其他项保持不变。

src/plen
srcaddr/plen
saddr/plen

后跟的值是数据报的源地址以及前缀长度。只匹配数据包源地址的 plen 前导位。plen 是可选的。

源地址值可以是 getaddrinfo(3SOCKET) 中所述的主机名、getnetbyname(3XNET) 中所述的网络名或者采用 Internet 标准点记法的主机地址或网络地址。请参见 inet_addr(3XNET)

如果指定了一个主机名而 getaddrinfo(3SOCKET) 返回多个主机地址,则会为每个地址添加策略,添加时除地址以外的其他项保持不变。

daddr/plen
dest/plen
dstaddr/plen

后跟的值是数据报的目标地址以及前缀长度。只匹配数据包目标地址的 plen 前导位。plen 是可选的。

有关可指定的有效值,请参见 saddr。如果发现多个源地址和目标地址,则会将包含每个源地址-目标地址对的策略条目添加到系统。

smask

仅适用于 IPv4。后跟的值是源掩码。如果在 saddr 中指定了前缀长度,则不应指定该掩码。该掩码可以用带有前导 0x0X 的十六进制数字表示(例如,0xffff00000Xffff0000),或用 Internet 十进制点记法表示(例如,255.255.0.0255.255.255.0)。该掩码应为连续数字,没有定义不连续掩码的行为。

仅当指定了 saddr 时才会考虑 smask

对于 IPv4 和 IPv6 地址,可以将相同信息指定为附加到 saddr 参数的 slen 值。

dmask

类似于 smask

lport

后跟的值是数据报的本地端口。该值可以是一个端口号或使用 NULL proto 参数搜索到的字符串,如 getservbyname(3XNET) 中所述。

rport

后跟的值是数据报的远程端口。该值可以是一个端口号或使用 NULL proto 参数搜索到的字符串,如 getservbyname(3XNET) 中所述。

sport

后跟的值是数据报的源端口。该值可以是一个端口号或使用 NULL proto 参数搜索到的字符串,如 getservbyname(3XNET) 中所述。

dport

后跟的值是数据报的目标端口。该值可以是一个端口号或使用 NULL proto 参数搜索到的字符串,如 getservbyname(3XNET) 中所述。

proto ulp

后跟的值是匹配此条目时所应依据的上层协议。该值可以是数字或字符串,如 getprotobyname(3XNET)中所述。如果未指定 smask 或 plen,则将对 IPv4 使用 plen 32,对 IPv6 使用 plen 128(表示主机)。如果 ulpicmpipv6-icmp,则对于所有 icmp 规则而言,应用 IPsec 的所有操作必须相同。

type numnum-num

后跟的值是匹配此条目时所应依据的 ICMP 类型。type 必须为 0 至 255 之间的数字,或者为相应的 icmp-type 关键字之一。此外,还必须存在 ulp,并且必须指定 icmpipv6-icmp。通过连字符分隔数字可以指定一系列类型。

code numnum-num

后跟的值是匹配此条目时所应依据的 ICMP 代码。关键字 code 后跟的值必须为 0 至 254 之间的数字,或者为相应的 icmp-code 关键字之一。此外,还必须存在 type。通过连字符分隔数字可以指定一系列代码。

tunnel name

按照 ifconfig(1M) 配置的那样指定隧道网络接口。即使不存在名为 name 的隧道,仍会添加策略条目,并会在创建该隧道时与隧道状态关联。如果隧道未激活,其策略条目将消失。

negotiate tunnel
negotiate transport

为保证每个隧道的安全,请指定保护通信的 IPsec SA 应当为隧道模式 SA 还是传输模式 SA。如果指定传输模式 SA,策略条目中不能出现任何地址。传输模式用于与 Solaris 9 向后兼容,并且使用 ifconfig(1M) 配置的隧道 IPsec 策略在此处将显示为传输模式条目。

策略条目的属性字段中可包含下列(名称值)对。在给定策略条目中每个(名称值)对只能出现一次。

auth_algs

该参数后跟可接受的值表明传出数据报中将包含 IPsec AH 头。该参数后跟的值描述了在对传出数据报应用 IPsec AH 时将使用的验证算法,还将验证传入数据报中是否包含 IPsec AH 头。请参见 RFC 2402

此条目可以包含字符串或十进制数字。

string

该值可以为 MD5 或 HMAC-MD5(表示 RFC 2403 中所述的 HMAC-MD5 算法),也可以为 SHA1、HMAC-SHA1、SHA 或 HMAC-SHA(表示 RFC 2404 中所述的 HMAC-SHA 算法)。使用 ipsecalgs(1M) 命令可以获取完整的验证算法列表。

该字符串也可以是 ANY,表示没有首选算法。对于手动 SA,缺省算法将根据此时可用的 SA 进行选择,对于自动 SA,则根据密钥协商守护进程进行选择。字符串不区分大小写。

number

在 1-255 范围内的数字。当可以动态装入新算法时,此数字非常有用。

如果不存在 auth_algs,传出数据报中将不包含 AH 头,并且将按照相同标准对传入数据报进行验证。

encr_algs

该参数后跟可接受的值表明传出数据报中将包含 IPsec ESP 头。该参数后跟的值描述了在对传出数据报应用 IPsec ESP 协议时将使用的加密算法,还将验证传入数据报中是否包含 IPsec ESP 头。请参见 RFC 2406

此条目可以包含字符串或十进制数字。字符串不区分大小写。

string

可以是下列项之一:

字符串值:
所用算法:
RFC 参考:
DES 或 DES-CBC
DES-CBC
2405
3DES 或 3DES-CBC
3DES-CBC
2451
BLOWFISH 或 BLOWFISH-CBC
BLOWFISH-CBC
2451
AES 或 AES-CBC
AES-CBC
2451
AES-CCM
AES-CCM
4309
AES-GCM
AES_GCM
4106

使用 ipsecalgs(1M) 命令可以获取完整的验证算法列表。

该值可以为 NULL,这表示 RFC 2410NULL 加密。这意味着将不会对有效负荷加密。该字符串也可以是 ANY,表示没有首选算法。对于手动 SA,缺省算法将根据此时可用的 SA 进行选择,对于自动 SA,则根据密钥协商守护进程进行选择。字符串不区分大小写。

number

在 1-255 范围内的十进制数字。当可以动态装入新算法时,此数字非常有用。

encr_auth_algs

encr_auth_algs 后跟可接受的值表明传出数据报中将包含 IPsec ESP 头。encr_auth_algs 后跟的值描述了在对传出数据报应用 IPsec ESP 协议时将使用的验证算法,还将验证传入数据报中是否包含 IPsec ESP 头。请参见 RFC 2406。此条目可以包含字符串或数字。字符串不区分大小写。

string

有效值与上述 auth_algs 中介绍的有效值相同。

number

此数字应是在 1-255 范围内的十进制数字。当可以动态装入新算法时,此数字非常有用。

如果策略条目中存在 encr_algs 但不存在 encr_auth_algs,系统将使用 ESP SA,而不管 SA 是否具有验证算法。

如果策略条目中不存在 encr_algs 但存在 encr_auth_algs,将对传出和传入数据报使用 NULL 加密,这等效于带有 NULL 的 encr_algs

如果策略条目中不存在 encr_algsencr_auth_algs,传出数据报中将不包含 ESP 头,并且将按照相同标准对传入数据报进行验证。

如果策略条目中同时存在 encr_algsencr_auth_algs,传出数据报中将包含具有完整性校验和的 ESP 头,并且将按照相同标准对传入数据报进行验证。

对于 encr_algsencr_auth_algsauth_algs,必须指定密钥长度。该值要么是一个指定算法的唯一有效密钥长度的值,要么是一个指定有效的最小和/或最大密钥长度的范围。可省略最小或最大长度。

dir

该参数后跟的值确定该条目是针对传出还是传入数据报。有效值应为以下字符串之一:

out

这表示此策略条目仅针对传出数据报。

in

这表示此策略条目仅针对传入数据报。

both

这表示此策略条目针对传入和传出数据报

当操作为 "apply"、"permit" 或 "ipsec" 时,不需要此条目。但是,如果指定了此条目且操作为 "apply" 或 "permit",则该值应分别为 "out" 或 "in"。当操作为 "bypass" 时,必须指定此条目。

sa

该参数后跟的值确定安全关联的属性。该值指示是应使用唯一的安全关联,还是可以使用任何现有 SA。如果具有策略要求,则会使用密钥管理守护进程在第一个传出数据报中动态创建 SA。使用 ipseckey(1M) 可以创建静态 SA。此处使用的值确定是否将使用/获取新 SA。有效值可以是以下字符串之一:

unique

唯一关联。将为与此策略条目匹配的数据包获取/使用新的/未使用的关联。如果存在由相同的 5 个元组(即,{源地址、目标地址、源端口、目标端口、协议(例如,TCP/UDP)})使用过的 SA,则将重用该 SA。因此,唯一性由上面指定的 5 个元组表示。上述 5 个元组使用的安全关联将不会供任何其他套接字使用。对于传入数据报,不会验证唯一性。

对于隧道模式隧道,将忽略 unique。在隧道模式隧道中,SA 按照规则进行分配。对于传输模式隧道,由于只作用于外部数据包地址且协议值要么为 IPv4-in-IP,要么为 IPv6-in-IP,因此隐含使用 unique

shared

共享关联。如果此源-目标对已存在 SA,则使用它。否则获取新的 SA。这是缺省值。

只有在传出策略条目中该参数才是必需的,不应在操作是 "bypass" 的条目中指定该参数。如果没有为传入条目指定此项(例如,当 "dir" 为 in 或 "action" 为 permit 时),将假定为共享关联。

操作位于模式之后,并且应在属性前指定。操作应当为下列值之一,并且此字段是必需的。

ipsec

按属性所述对数据报使用 IPsec(如果模式与数据报匹配)。如果指定的 ipsec 的未给定 dir,模式将与传入和传出数据报匹配。

apply

按属性所述对数据报应用 IPsec(如果模式与数据报匹配)。如果指定了 apply,模式仅与传出数据报进行匹配。

permit

如果模式与传入数据报匹配,并且符合属性描述的约束,则允许数据报。如果不符合属性,则放弃数据报。如果指定了 permit,模式仅与传入数据报进行匹配。

bypass
pass

如果模式与数据报匹配,则绕过所有策略检查。属性中的 dir 确定是对传出数据报还是传入数据报执行检查。所有 bypass 条目都在系统中的任何其他策略条目之前检查。同任何其他条目相比,该条目的优先级最高。当操作为 bypass 时,只能存在 dir 字段。

drop

删除与模式匹配的任何数据包。

例如,如果文件包含多个策略条目,则假定这些策略条目按照其应用顺序列出。如果有多个条目与传出和传入数据报匹配,则采用第一个匹配条目。仅当满足下列条件时,系统才会对策略条目重新排序,即将新条目添加在旧条目之前:

保护级别“强”于旧保护级别。

目前,强度定义为:

AH and ESP > ESP > AH

在此由高到低的排名中,组合使用 AH 和 ESP 的标准用法强度最高。此排名存在缺陷。ESP 可以在不进行验证的情况下使用,这将允许剪切和粘贴或重放攻击;也可以在不进行加密的情况下使用,这使其强度等于或略低于 AH。管理员应谨慎行事,以保证正确使用 ESP。有关更多详细信息,请参见 ipsecesp(7P)

如果新条目的操作为 bypassbypass 具有最高优先级。该新条目可以在任意位置添加,并且系统仍会在匹配任何其他条目之前匹配所有 bypass 条目。此功能对密钥管理守护进程非常有用,由于该守护进程保护其自己的通信,因此可使用此功能绕过 IPsec。

新添加的同时具有 AH(策略条目中包含 auth_algs)和 ESP(策略条目中包含 encr_algsencr_auth_algs)保护的条目排列在具有 AH 和 ESP 的所有已有条目之后,在仅具有 AH 的已有条目和仅具有 ESP 的已有条目之前。在其他所有情况下,不会修改用户指定的顺序,即在所有旧条目之后添加新条目。请参见Examples

如果旧条目和新条目匹配的通信模式相同,则将新条目视为旧条目的重复条目。有关重复条目的信息,请参见Examples

安全

例如,如果通过线路从挂载了 NFS 的文件系统传输策略文件,对手可以修改该文件中包含的数据,从而更改计算机上配置的策略以满足其需求。管理员在通过网络传输策略文件副本时应谨慎。

为了防止非特权用户修改安全策略,请确保只有可信用户才能对配置文件执行写入。

配置文件通过 policy smf(5) 服务的属性定义。缺省配置文件为 /etc/inet/ipsecinit.conf。使用 svcprop(1) 命令可更改此设置。有关更多详细信息,请参见“附注”部分。

策略描述语言支持使用标记,标记可通过名称服务解析(使用 gethostbyname(3NSL) 等函数)。尽管使用这些函数非常方便,但其安全程度与系统配置使用的名称服务一样。当名称服务用于解析安全策略的元素时,务必谨慎行事,确保名称服务安全可靠。

如果您的源地址是可通过网络查找的主机,并且您的命名系统本身已泄密,使用的所有名称都将不再值得信任。

如果名称转换配置为使用非系统本地的名称服务,可能需要添加 bypass 策略条目以免策略阻止与名称服务通信。请参见 nsswitch.conf(4)

对于 connect(3SOCKET)accept(3SOCKET) 处理的 TCP/UDP 套接字,将锁定策略。添加新策略条目不会对此类套接字有任何影响。此锁定功能将来可能会发生更改。建议不要依赖此功能。

ipsecconf 命令只能由具有足够的特权打开 pf_key(7P) 套接字的用户运行。使用 "Network IPsec Management"(网络 IPsec 管理)配置文件可以将相应特权分配给用户。请参见 profiles(1)rbac(5)prof_attr(4)

务必在启动任何通信之前设置策略,因为添加新策略条目可能会影响现有连接。类似地,请勿在通信过程中更改策略。

请注意,某些 ndd 可调参数会影响使用此工具配置的策略的执行;有关更多详细信息,请参见 ipsecesp(7P)

示例

示例 1 使用 ESP 和 AES 算法保护传出 TCP 通信

以下示例指定从 spiderweb 至 arachnid 的任何 TCP 数据包都应当使用 AES 加密,并且 SA 可以为共享 SA。该示例不验证传入通信是否已加密。


#
# Protect the outbound TCP traffic between hosts spiderweb
# and arachnid with ESP and use AES algorithm.
#
{
     laddr spiderweb
     raddr arachnid
     ulp tcp
     dir out
} ipsec {
	     encr_algs AES
}
示例 2 验证传入通信是否已加密

示例 1 不验证传入通信是否已加密。本示例中的条目会保护传入通信:

#
# Protect the TCP traffic on inbound with ESP/DES from arachnid
# to spiderweb
#
{
	    laddr spiderweb
	    raddr arachnid
	    ulp tcp
	    dir in
} ipsec {
	    encr_algs AES
}

传入策略条目可以省略 sa,这表明 SA 可以为共享 SA。未对传入通信验证唯一性。请注意,在上述条目中,从未指定验证。这可能导致剪切粘贴攻击。如前所述,尽管未指定验证,但是如果在 SA 表中找到 ESP SA,系统仍将按指定的 encr_auth_alg 使用该 SA。

示例 3 保护两台主机之间的所有通信

以下示例一次性保护两个方向:


{
	    laddr spiderweb
	    raddr arachnid
	    ulp tcp
} ipsec {
	    encr_algs AES
}

示例 4 验证传输到 Telnet 端口的所有传入通信

此条目指定传输到 Telnet 端口的所有传入数据报在传入时都应使用 SHA1 算法验证。否则不允许此数据报。如果不使用此条目,发往端口号 23 的通信可能会以明文形式出现。sa 未指定,这表明 SA 是共享 SA。只有传入条目可以这样做。要保护传出通信,您需要有一个等效条目,这样将对传出通信也进行验证,从而不考虑方向。


#
# All the inbound traffic to the telnet port should be
# authenticated.
#
{
	   lport telnet
	   dir in
} ipsec {
	   auth_algs sha1
}

示例 5 验证传入通信是否采用 Null 加密

第一个条目指定不应根据任何策略检查具有 host-B 地址的所有数据包。第二个条目指定来自 network-B 的所有传入通信都应当使用 NULL 加密算法和 MD5 验证算法进行加密。NULL 加密表明将使用 ESP 头,而不会加密数据报。由于第一个条目为 bypass,而 bypass 条目具有最高优先级,因此不必将其顺序指定为第一个。因此,所有传入通信都将先与所有 bypass 条目进行匹配,然后再匹配任何其他策略条目。


#
# Make sure that all inbound traffic from network-B is NULL
# encrypted, but bypass for host-B alone from that network.
# Add the bypass first.
{
raddr host-B
	dir in	
} bypass {}

# Now add for network-B.
{
	raddr network-B/16
	dir in
} ipsec {
encr_algs NULL
encr_auth_algs md5
}

示例 6 使来自 IPsec 的通信绕过检查的条目

前两个条目指出从计算机源端口 53 传出或传入端口 53 的任何数据报都不应受到 IPsec 策略检查,而不考虑系统中的任何其他策略条目。因此,仅对端口号 53 以外的端口考虑后两个条目。

#
# Bypass traffic for port no 53
     #
{lport 53} bypass {}
{rport 53} bypass {}
{raddr spiderweb } ipsec {encr_algs any sa unique}

示例 7 保护传出通信

 #
     # Protect the outbound traffic from all interfaces.
     #
{raddr spiderweb dir out} ipsec {auth_algs any sa unique}

如果针对 spiderweb 的 gethostbyname(3XNET) 调用生成多个地址,则将以相同的属性为所有源地址添加策略条目。


{ 
    laddr arachnid 
    raddr spiderweb 
    dir in 
} ipsec {auth_algs any sa unique}

如果针对 spiderweb 的 gethostbyname(3XNET) 调用和针对 arachnid 的 gethostbyname(3XNET) 调用生成多个地址,则将为以相同的属性为每个 (saddr daddr) 对添加策略条目。使用 ipsecconf –l 可查看添加的所有策略条目。

示例 8 使未验证的通信绕过检查

#
# Protect all the outbound traffic with ESP except any traffic
# to network-b which should be authenticated and bypass anything
# to network-c
#
{raddr network-b/16 dir out} ipsec {auth_algs any}
{dir out} ipsec {encr_algs any}
{raddr network-c/16 dir out} bypass {} # NULL properties

请注意,可以在任意位置指定 bypass,其优先级高于所有其他条目。NULL 模式与所有通信匹配。

示例 9 使用 3DES 和 MD5 对 IPv6 通信进行加密

链路本地地址为 fe80::a00:20ff:fe21:4483 的主机上的以下条目指定 IPv6 链路本地地址为 fe80::a00:20ff:fe21:4483fe80::a00:20ff:felf:e346 的主机之间的所有传出通信都必须使用 3DES 和 MD5 加密。


{
    laddr fe80::a00:20ff:fe21:4483
    raddr fe80::a00:20ff:felf:e346
    dir out
} ipsec {
    encr_algs 3DES
    encr_auth_algs MD5
}
示例 10 验证 IPv6 通信是否使用 SHA1 验证

以下两个条目要求使用 SHA1 验证传入和传出 IPv6 站点本地网络 fec0:abcd::0/32 的所有 IPv6 通信。


{raddr fec0:abcd::0/32} ipsec { auth_algs SHA1 }

示例 11 密钥长度

# use aes at any key length
{raddr spiderweb} ipsec {encr_algs aes}

# use aes with a 192 bit key
{raddr spiderweb} ipsec {encr_algs aes(192)}

# use aes with any key length up to 192 bits
# i.e. 192 bits or less
{raddr spiderweb} ipsec {encr_algs aes(..192)}

# use aes with any key length of 192 or more
# i.e. 192 bits or more
{raddr spiderweb} ipsec {encr_algs aes(192..)}

#use aes with any key from 192 to 256 bits
{raddr spiderweb} ipsec {encr_algs aes(192..256)}

#use any algorithm with a key of 192 bits or longer
{raddr spiderweb} ipsec {encr_algs any(192..)}

示例 12 正确和错误的策略条目

以下示例列举了正确格式的策略条目:

{ raddr that_system rport telnet } ipsec { encr_algs 3des encr_auth_algs
sha1 sa shared}

{
        raddr that_system
        rport telnet
} ipsec {
        encr_algs 3des
        encr_auth_algs sha1
        sa shared
}

{ raddr that_system rport telnet } ipsec
        { encr_algs 3des encr_auth_algs sha1 sa shared}

{ raddr that_system rport telnet } ipsec
        { encr_algs 3des encr_auth_algs sha1 sa shared} or ipsec
        { encr_algs aes encr_auth_algs sha1 sa shared}

...以下是错误格式的策略条目:

{ raddr that_system rport telnet } ipsec
        { encr_algs 3des encr_auth_algs sha1 sa shared}
        or ipsec { encr_algs aes encr_auth_algs sha1 sa shared}

在上一错误的策略条目中,请注意第三行以 “or ipsec” 开头。此类条目会导致 ipsecconf 返回错误。

示例 13 允许以明文形式执行相邻节点搜索

以下两个条目要求使用 SHA1 验证传入和传出 IPv6 站点本地网络 fec0:abcd::0/32 的所有 IPv6 通信。第二个条目使相邻节点搜索能正确运行。

{raddr fec0:abcd::0/32} ipsec { auth_algs SHA1 }
{raddr fec0:abcd::0/32 ulp ipv6-icmp type 133-137  dir both }
    pass { }
示例 14 使用 "or"

以下条目允许来自远程计算机 spiderweb 的通信使用 AES 或 Blowfish 算法:

{raddr spiderweb} ipsec {encr_algs aes} or ipsec {encr_algs blowfish}
示例 15 配置隧道以便与 Solaris 9 向后兼容

以下示例等效于 ifconfig(1M) 中的 “encr_algs aes encr_auth_algs md5”:

{tunnel ip.tun0 negotiate transport} ipsec {encr_algs aes
                                                   encr_auth_algs md5}
示例 16 使用分配的地址配置到 VPN 客户机的隧道

以下示例假定存在一个单独的“内部”网络,它具有自己的拓扑,因而客户机的缺省路由转向“内部”。

# Unlike route(1m), the default route has to be spelled-out.
{tunnel ip.tun0 negotiate tunnel raddr client-inside/32
laddr 0.0.0.0/0} ipsec {encr_algs aes encr_auth_algs sha1}
示例 17 在两个隧道子网和第三个子网之间传输信息的 VPN 路由器

以下示例为在两个隧道子网和第三个链路子网之间路由信息的 VPN 路由器指定配置。假定远程站点 A、远程站点 B 和本地站点 C 分别具有 /24 地址分配。

# ip.tun0 between me (C) and remote-site A.
# Cover remote-site A to remote-side B.
{tunnel ip.tun0 negotiate tunnel raddr A-prefix/24 laddr
B-prefix/24} ipsec {encr_algs 3des encr_auth_algs md5}

# Cover remote-site A traffic to my subnet.
{tunnel ip.tun0 negotiate tunnel raddr A-prefix/24 laddr
C-prefix/24} ipsec {encr_algs 3des encr_auth_algs md5}

# ip.tun1 between me (C) and remote-site B.
# Cover remote-site B to remote-site A.
{tunnel ip.tun1 negotiate tunnel raddr B-prefix/24 laddr
A-prefix/24} ipsec {encr_algs aes encr_auth_algs sha1}

# Cover remote-site B traffic to my subnet.
{tunnel ip.tun1 negotiate tunnel raddr B-prefix/24 laddr
C-prefix/24} ipsec {encr_algs aes encr_auth_algs md5}
示例 18 使用组合模式加密算法

组合模式加密算法在一个操作中提供数据保密和消息验证。这类算法被视为 encr_algs 的特殊版本。这类算法可提供消息验证,而不必用户指定 encr_auth_algs。支持以下两种组合模式加密算法:

aes-ccm

AES CCM 模式(与 CBC-MAC 相对)

aes-gcm

AES GCM 模式 (Galois/Counter)

使用的参数与任何其他 encr_algs 相同。在两个示例中,算法令牌中的数字表示完整性检查向量 (Integrity Check Vector, ICV) 的长度。请参见 ipsecalgs(1M)

# simple example using transport mode
{laddr 192.168.99.2 raddr 192.168.99.3} ipsec
    {encr_algs aes-gcm sa shared}
# simple example using CCM mode and 128 bit keys
{laddr 192.168.99.100 raddr 192.168.99.200} ipsec
    {encr_algs aes-ccm(128) sa shared}
示例 19 使用 AES GMAC

AES GMAC 算法是提供消息验证的散列算法。会计算完整性检查向量 (Integrity Check Vector, ICV),并将其作为验证的数据包的一部分传送。

AES GMAC 算法可用于 ESP 模式,此种情况下会验证数据包数据和 ESP 头。当与 IPsec ESP 组合使用时,AES GMAC 只能作为加密算法指定,即使它未提供任何加密也是如此。

# simple example using AES GMAC and 128 bit keys for ESP
{laddr 192.168.99.100 raddr 192.168.99.200} ipsec
    {encr_algs aes-none-gmac(128) sa shared}

以上示例类似于以下无效示例:

{laddr 192.168.99.100 raddr 192.168.99.200} ipsec
    {encr_algs null encr_auth_algs aes-gmac(128) sa shared}

当与 ESP 组合使用时,aes-none-gmac 算法将密钥长度作为可选参数,使用 ipsecalgs(1M) 命令可显示支持的密钥长度。

AES GMAC 算法可用于 AH 模式,此种情况下会验证整个数据包(包括 IP 头)。当与 IPsec AH 组合使用时,AES GMAC 只能作为验证算法指定。

# simple example using AES GMAC and 128 bit keys for AH
{laddr 192.168.99.100 raddr 192.168.99.200} ipsec
    {auth_algs aes-gmac128 sa shared}

当与 AH 组合使用时,每个密钥长度都具有自己的 DOI 编号,密钥长度不需要指定为参数。

文件

/var/run/ipsecpolicy.conf

该文件缓存了当前为系统配置的 IPsec 策略,由 ipsecconf 命令维护。请勿编辑该文件。

/etc/inet/ipsecinit.conf

该文件包含在重新启动系统时 policy smf(5) 服务要安装的 IPsec 策略。有关更多信息,请参见“附注”部分。

/etc/inet/ipsecinit.sample

ipseconf 的示例输入文件。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os
接口稳定性
Committed(已确定)

另请参见

auths(1)profiles(1)svcprop(1)svcs(1)in.iked(1M)init(1M)ifconfig(1M)ipsecalgs(1M)ipseckey(1M)netcfg(1M)svcadm(1M)svccfg(1M)gethostbyname(3NSL)accept(3SOCKET)connect(3SOCKET)gethostbyname(3XNET)getnetbyname(3XNET)getprotobyname(3XNET)getservbyname(3XNET)getaddrinfo(3SOCKET)socket(3SOCKET)ike.config(4)nsswitch.conf(4)prof_attr(4)user_attr(4)attributes(5)rbac(5)smf(5)ipsecah(7P)ipsecesp(7P)pf_key(7P)

由 Glenn, R. 和 Kent, S. 合著的《The NULL Encryption Algorithm and Its Use With IPsec》,RFC 2410。互联网协会出版,1998 年。

由 Kent, S. 和 Atkinson, R. 合著的《IP Authentication Header》,RFC 2402。互联网协会出版,1998 年。

由 Kent, S. 和 Atkinson, R. 合著的《IP Encapsulating Security Payload (ESP)》,RFC 2406。互联网协会出版,1998 年。

由 Madsen, C. 和 Glenn, R. 合著的《The Use of HMAC-MD5-96 within ESP and AH》,RFC 2403。互联网协会出版,1998 年。

由 Madsen, C. 和 Glenn, R. 合著的《The Use of HMAC-SHA-1-96 within ESP and AH》,RFC 2404。互联网协会出版,1998 年。

由 Madsen, C. 和 Doraswamy, N. 合著的《The ESP DES-CBC Cipher Algorithm With Explicit IV》,RFC 2405。互联网协会出版,1998 年。

由 Pereira, R. 和 Adams, R. 合著的《The ESP CBC-Mode Cipher Algorithms》,RFC 2451。互联网协会出版,1998 年。

由 Frankel, S. 和 Kelly, R.Glenn 合著的《The AES Cipher Algorithm and Its Use With IPsec》。2001 年。

诊断

Bad “string” on line N.
Duplicate “string” on line N.

string 表示模式或属性中的某个名称。Bad(错误)字符串表示参数格式错误;Duplicate(重复)字符串表示存在多个类似类型的参数,例如,多个源地址参数。

Interface name already selected

对某个接口同时使用 –i namename,index

Error before or at line N.

表示第 N 行或其前面的行出现解析错误。

Non-existent index

当要删除的 index 不是有效索引时,会报告此错误。

spd_msg return: File exists

当已存在与此新条目的通信相匹配的策略条目时,会报告此错误。

附注

IPsec 手动密钥由服务管理工具 smf(5) 管理。下面列出的服务管理 IPsec 的组件。这些服务按如下方式交付:

svc:/network/ipsec/policy:default (enabled)
svc:/network/ipsec/ipsecalgs:default (enabled)
svc:/network/ipsec/manual-key:default (disabled)
svc:/network/ipsec/ike:default (disabled)

手动密钥服务以禁用状态交付。系统管理员必须先按 ipseckey(1M) 中所述手动创建 IPsec 安全关联 (Security Association, SA),然后才能启用该服务。

策略服务以启用状态交付,但没有配置文件,因此,在起始状态下,数据包不受 IPsec 保护。按照本手册页中所述创建配置文件 /etc/inet/ipsecinit.conf 和刷新服务(svcadm refresh,请参见下文)后,会应用配置文件中包含的策略。如果该文件中存在错误,该服务会进入维护模式。

以禁用状态交付的服务之所以按该方式交付是因为:系统管理员必须先为其创建配置文件,然后才能启用这些服务。有关 ike 服务,请参见 ike.config(4)

有关 ipsecalgs 服务,请参见 ipsecalgs(1M)

正确的管理步骤是先为每项服务创建配置文件,然后使用 svcadm(1M) 启用每项服务。

如果需要更改配置,应先编辑配置文件,然后再刷新服务,如下所示:

example# svcadm refresh policy

smf(5) 框架将在服务特定的日志文件中记录发现的任何错误。可使用以下任一命令检查 logfile 属性:

example# svcs -l policy
example# svcprop policy
example# svccfg -s policy listprop

policy 服务定义了以下属性:

config/config_file

分配了以下授权的用户可以使用 svccfg(1M) 修改此属性:

solaris.smf.value.ipsec

请参见 auths(1)user_attr(4)rbac(5)

必须先使用 svcadm(1M) 刷新该服务,新属性才能生效。使用 svcprop(1) 命令可以查看不可修改的常规属性。

# svccfg -s ipsec/policy setprop config/config_file = /new/config_file
# svcadm refresh policy

可以使用 svcadm(1M) 来对此服务执行管理操作(如启用、禁用、刷新和请求重新启动)。分配有以下授权的用户可以执行这些操作:

solaris.smf.manage.ipsec

可以使用 svcs(1) 命令来查询服务的状态。

ipsecconf 命令设计为由 policy smf(5) 服务进行管理。尽管可以从命令行运行 ipsecconf 命令,但是不建议采用这种方法。如果要从命令行运行 ipsecconf 命令,应该首先禁用 policy smf(5) 服务。请参见 svcadm(1M)