📄 rfc2367.txt
字号:
+---------------+---------------+---------------+---------------+
| sadb_spirange_max |
+---------------+---------------+---------------+---------------+
| sadb_spirange_reserved |
+---------------+---------------+---------------+---------------+
3 符号名
这一节定义了PF_KEY使用的各种符号和其含义。为了可移植性,应用程序必须
使用这些符号名。这里定义的数字只是起说明作用,可以与其它系统不同,除非有
其它明确规定。所有符合的执行必须保持符号名一致。
3.1 消息类型
PF_KEY使用的消息类型,在文件<net/pfkeyv2.h>中定义。如下:
#define SADB_RESERVED 0
#define SADB_GETSPI 1
#define SADB_UPDATE 2
#define SADB_ADD 3
#define SADB_DELETE 4
#define SADB_GET 5
#define SADB_ACQUIRE 6
#define SADB_REGISTER 7
#define SADB_EXPIRE 8
#define SADB_FLUSH 9
#define SADB_DUMP 10 /* 通常不用 */
#define SADB_MAX 10
每个消息的行为包括最初的消息传播(如:用户层到内核)和随后预期的动作。
消息内容如下:
<base, REQUIRED EXTENSION, REQ., (OPTIONAL EXT.,) (OPT)>
安全关联扩展项有时候只使用它的SPI字段,如果其它字段必须被忽略,就表
示为“SA(*)”。
生存期扩展项表示为一到三个字母跟在单词“lifetime”后,H代表硬件、S
代表软件、C代表当前。
地址扩展项表示为一到三个字母跟在单词“address”后,S代表源地址、D代
标目的地址、P代表代理地址。
注意:一些安全关联类型不使用源地址作为SA认证,而一些使用。这可导致一
些不报告冲突的SA类型的EEXIT错误。希望程序作者充分了解安全关联
类型以便理解这些差别。
密钥扩展项表示为一到两各字母跟在单词“key”后,A代表认证、E代表加密。
身份扩展项表示为一到两各字母跟在单词“identity”后,S代表源、D代表目
的。
当出现错误时,只返回基本消息头。
注意任何消息都可以返回任何标准错误。
代表性的,它们既可以是一个消息的说明中详细列出的一种错误,也可以是下
列错误的一种:
EINVAL 可以表示各种错误,包括SPI范围不对。
ENOMEM 内存不够。
ENOBUFS 缓存不够。
EMSGSIZ 消息长度错误。
3.1.1 SADB_GETSPI
SADB_GETSPI消息允许一个进程根据安全关联类型、源和目的地址获得唯一的
SPI值。它和紧跟的SADB_UPDATE消息是创建一个安全关联的一种方法(SADB_ADD是
另外一种方法)。进程在基本消息头中指定类型,在地址扩展项中指定源和目的地
址。如果SADB_GETSPI消息响应内核产生的SADB_ACQUIRE消息,那么sadb_msg_seq
必须和SADB_ACQUIRE消息一致。应用程序也可以指定SPI值,当内核使用SPI范围扩
展选定SPI值范围。应用程序设置相同的最高和最低值可以指定单一的通过验证的
SPI值。允许指定范围是因为内核能够根据已使用的SPI值分配SPI值。内核将分配
的SPI值保存在安全关联扩展的spi字段,然后返回同一个消息。分配的SPI(和目
的地址)指出一个LARVAL期的安全关联。随后的SADB_UPDATE消息利用请求的SPI值
增加整个安全关联项目。
如果使用SADB_GETSPI消息建立的安全关联没有使用SADB_UPDATE消息更新,应
该定期自动删除。这样保存的SA不会混乱。
SADB_GETSPI消息机制:
用户进程发送SADB_GETSPI消息到内核。
<base, address, SPI range>
内核返回SADB_GETSPI消息给所有的监听进程。
<base, SA(*), address(SD)>
错误:
EEXIST 请求的SPI值或SPI范围值不可用或已经使用。
3.1.2 SADB_UPDATE
SADB_UPDATE消息允许一个进程更新已存在的安全关联的信息。由于SADB_GETSPI
不允许设置一些参数,所以SADB_UPDATE消息需要完全构建由SADB_GETSPI建立的状
态为SADB_SASTATE_LARVAL的安全关联。SADB_UPDATE消息的格式由一个基本消息头、
安全关联头和几个可选的扩展头组成。内核根据消息中指定的类型、SPI、源和目的
地址搜索相同的安全关联并用消息中的内容更新。
内核可以不接受SADB_UPDATE消息,除非消息由建立安全关联的套接字发出。
这样可以避免意外修改正在使用的安全关联。恶意的可信程序仍然可以发出SADB_FLUSH
或SADB_DELETE消息,但是安全关联的删除可以很容易的发现,而不像意外出现的
错误SADB_UPDATE消息。相反的意见是当用户层的密钥管理程序出现错误并重启,
新的实例和安全关联建立者不会有相同的套接字。
内核必须在更新数据库中的SA之前对SADB_UPDATE消息提交的有效值做安全检
查,如果任何值无效必须返回EINVAL错误。例如:应检查DES密钥的奇偶位、密钥长
度、已知的指定算法的弱密钥、已知的指定算法不兼容的标志或参数。
只有状态为SADB_SASTATE_MATURE的SA可以接受SADB_UPDATE消息。如果SA的状
态为SADB_SASTATE_LARVAL,那么可以修改除了源地址、目的地址和SPI以外的值。
如果SA的状态为SADB_SASTATE_DEAD,任何更新尝试必将返回EINVAL错误。对已确
定的密钥或算法信息进行修改而不修改SPI是无效的,那样与其修改一个已存在的SA
不如请求建立一个新的SA。一旦SA的密钥和算法信息商定,那么地址和身份信息也
已确定。所以,如果状态为SADB_SASTATE_MATURE或DYING的SA,只有SA头的
sadb_sa_state
和生存期(硬件、软件和当前)可以修改,其它修改必将返回EINVAL错误。
SADB_UPDATE消息机制:
Send an SADB_UPDATE message from a user process to the kernel.
用户进程发送SADB_UPDATE消息到内核。
<base, SA, (lifetime(HSC),) address(SD), (address(P),)
key(AE), (identity(SD),) (sensitivity)>
内核返回SADB_UPDATE消息给所有的监听进程。
<base, SA, (lifetime(HSC),) address(SD), (address(P),)
(identity(SD),) (sensitivity)>
密钥素材将不在从内核到监听套接字的消息中返回,因为监听者不一定有特权。
错误:
ESRCH 要更新的安全关联没有找到。
EINVAL 其它可能错误,如果参数健全检查(如密钥)错误返回此值。
EACCES 权限不够。发送SADB_UPDATE消息的套接字不是建立者。
3.1.3 SADB_ADD
SADB_ADD消息除了不需要预先呼叫SADB_GETSPI消息,其它与SADB_UPDATE消息
相同。SADB_ADD消息用于手工密钥管理程序,在其它情况下唯一的SPI可以立即知
道。
SADB_ADD消息也用于协商结束后一对安全关联中的第二个安全关联的增加,SPI
值由对端机器决定。sadb_msg_seq必须设置成内核产生的SADB_ACQUIRE消息中的值,
这样两个安全关联绑定同一个ACQUIRE请求。
内核必须在增加SA至数据库之前对所有SADB_ADD消息中提交的字段进行健全检
查,如果任何值无效,必须返回EINVAL错误。
只有状态为SADB_SASTATE_MATURE的SA可以在SADB_ADD消息中提交。状态为
SADB_SASTATE_LARVAL的SA由SADB_GETSPI建立,并且在DYING或SADB_SASTATE_DEAD
状态下增加新的SA是不明智的。因此,所有提交的SA的sadb_sa_state字段值必须
是SADB_SASTATE_MATURE,否则内核必须返回错误。
SADB_ADD消息机制如下:
Send an SADB_ADD message from a user process to the kernel.
用户进程发送SADB_ADD消息到内核。
<base, SA, (lifetime(HS),) address(SD), (address(P),)
key(AE), (identity(SD),) (sensitivity)>
内核返回SADB_ADD消息给所有的监听进程。
<base, SA, (lifetime(HS),) address(SD), (identity(SD),)
(sensitivity)>
密钥素材将不在从内核到监听套接字的消息中返回,因为监听者不一定有特权。
错误:
EEXIST 要增加的安全关联已经存在。
EINVAL 其它可能错误,如果参数健全检查(如密钥)错误返回此值。
3.1.4 SADB_DELETE
SADB_DELETE消息导致内核从密钥表中删除安全关联。删除消息包含基本消息
头和安全关联扩展、源和目的地址扩展。内核删除与消息中的类型、SPI、源和目
的地址相匹配的安全关联。
SADB_DELETE消息机制如下:
用户进程发送SADB_DELETE消息到内核。
<base, SA(*), address(SD)>
内核返回SADB_DELETE消息给所有的监听进程。
<base, SA(*), address(SD)>
3.1.5 SADB_GET
SADB_GET允许一个进程从内核密钥表中获得一个安全关联的拷贝。GET消息由
基本消息头和有关的扩展项组成。内核将返回与消息中的类型、SPI、源和目的地
址相匹配的安全关联。
SADB_GET消息机制如下:
用户进程发送SADB_GET消息到内核。
<base, SA(*), address(SD)>
内核返回SADB_GET消息给发送者的套接字。
<base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE),
(identity(SD),) (sensitivity)>
错误:
ESRCH 没有找到匹配的安全关联
3.1.6 SADB_ACQUIRE
SADB_ACQUIRE消息典型的应用是由内核发送至已登记(见SADB_REGISTER消息)
的密钥套接字监听者。SADB_ACQUIRE消息可以被应用层用户的安全关联发送(像使
用OSPF安全的OSPFv2实现)。SADB_ACQUIRE消息由基本消息头连同地址扩展、可选
的身份扩展和提议扩展组成。提议包含想用的算法列表,如果算法在基本消息头中
不可用。基本消息头中的字段和紧跟的安全关联数据指出监听进程企图获得的安全
关联的特性。如果消息从内核发出(sadb_msg_pid为0),随后的SADB_GETSPI消息
和SADB_UPDATE消息必须使用sadb_msg_seq的值,或者随后的SADB_ADD消息用来绑
定一个安全关联的请求。这样可以避免需要唯一安全关联的两个IP主机之间的两个
TCP连接的竞争,可以避免一个使用另一个安全关联。监听进程应忽略sadb_msg_errno
和sadb_msg_state字段。
当内核密钥表中没有输出包需要的可用的安全关联时触发SADB_ACQUIRE消息。
如果包可以被多个算法或可选联合充分保护,SADB_ACQUIRE消息必须按序优先使
用提议扩展中的选项。
SADB_ACQUIRE消息有三种机制。第一种是内核需要一个安全关联(如IPsec)。
内核发送SADB_ACQUIRE消息至已注册的套接字。
<base, address(SD), (address(P)), (identity(SD),) (sensitivity,)
proposal>
注意: 地址(源和目的)扩展的端口字段必须填入需要密钥会话的端口号。
第二种:由于某些原因,密钥关联失败,可以发送一个带有非零错误号与最初
的ACQUIRE消息相同sadb_msg_seq值的ACQUIRE消息。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -