ipsec.conf是strongSwan的关键配置,文件指定了strongSwan IPsec子系统的大部分配置和控制信息。主要的例外是身份验证的密钥,配置保存在ipsec.secrets文件中。
该文件是一个文本文件,由一个或多个部分组成。#后面跟空格,再后面任何到行尾的任何内容都是注释并被忽略,不在一个部分内的空行也是如此。
包含include和文件名的行,以空格分隔,将替换为该文件的内容。如果文件名不是完整路径名,则认为它是相对于包含文件的目录,这样的包含可以嵌套。只能提供一个文件名,它可能不包含空格,但它可能包含shell通配符,例如:
include ipsec.*.conf
包含工具的目的主要是允许将连接或连接集的信息与主配置文件分开。这允许更改此类连接描述,将其复制到所涉及的其他安全网关等,而不必不断地从配置文件中提取它们,然后将它们重新插入其中。还要注意允许将单个逻辑部分(例如连接描述)分成几个实际部分的参数(如下所述)。
一个部分以如下形式的一行开始:
type name
其中type表示后面是什么类型的节,name是一个任意名称,用于将该节与其他相同类型的节区分开来。所有后续以空格开头的非空行都是该部分的一部分。 共享相同名称的相同类型的部分将被合并。
通常具有以下形式
parameter=value
(注意前面的强制性空格)。 = 两边可以有空格。参数名称特定于节类型。
空值代表参数的系统默认值(如果有),即大致相当于完全省略参数行。这对于清除从 %default 部分或通过参数(见下文)继承的设置可能很有用。一个值可能包含单个空格(额外的空格减少为一个空格)。为了保留写入的空白,请将整个值括在双引号 (") 中;在此类值中,双引号本身可以通过在它们前面加上 \ 字符来进行转义。双引号字符串可以通过以 \ 字符结尾来跨越多行(以下行不必以空格开头,因为它将被保留)。此外,以下控制字符可以编码在双引号字符串中:\n、\r、\t、\b、\f。
数值被指定为“整数”(数字序列)或“十进制数”(数字序列可选地后跟“.”和另一个数字序列)。
当前有一个参数可用于任何类型的部分:
该值也是一个部分名称;该节的参数由当前节继承。当前节中的参数总是覆盖继承的参数,即使它们后面也跟着一个。指定的节必须存在并且必须具有相同的节类型;如果它是在当前部分之前或之后定义的,则不会。允许嵌套,并且单个部分中也可能有多个(引用部分的参数按照这些参数的顺序被继承和覆盖)。
名称为 %default 的部分指定相同类型的部分的默认值。其中的所有参数都由该类型的所有其他部分继承。
目前有三种类型的部分:CONFIG部分指定IPsec的一般配置信息,CONN部分指定IPsec连接,而CA部分指定证书颁发机构的特殊属性。
conn 部分包含连接规范,定义要使用 IPsec 建立的网络连接。 给定的名称是任意的,用于标识连接。 这是一个简单的例子:
conn snt
left=192.168.0.1
leftsubnet=10.1.0.0/16
right=192.168.0.2
rightsubnet=10.1.0.0/16
keyingtries=%forever
auto=add
关于术语的注释:有两种通信正在进行:用户 IP 报文的传输,以及用于密钥、重新密钥和一般控制的网关到网关协商。控制连接的路径在 IKEv1 中称为“ISAKMP SA”,在 IKEv2 协议中称为“IKE SA”。正在协商的内核级数据路径称为“IPsec SA”或“子 SA”。 strongSwan 以前使用过两个单独的键控守护进程 pluto 和 charon。本手册不再讨论 pluto 选项,而只讨论自 strongSwan 5.0 支持 IKEv1 和 IKEv2 以来的 charon。
为了避免简单地编辑配置文件以使其适合连接中涉及的每个系统,连接规范是根据左右参与者而不是本地和远程来编写的。哪个参与者被认为是左或右是任意的;对于每个连接描述,都会尝试确定本地端点应该充当左端点还是右端点。这是通过将两个端点定义的 IP 地址与分配给本地网络接口的 IP 地址相匹配来完成的。如果找到匹配项,则匹配的角色(左或右)将被视为本地角色。如果在启动过程中没有找到匹配项,left 被认为是本地的。这允许在两端使用相同的连接规范。有没有对称性的情况;一个好的约定是使用 left 表示本地端和 right 表示远程端(第一个字母是一个很好的助记符)。
许多参数与一个参与者或另一个参与者有关;这里只列出了 left 的参数,但每个以 left 开头的参数都有一个右对应物,其描述相同,但左右颠倒。
除非标记为“(必需)”,否则参数是可选的。
除非另有说明,否则要使连接正常工作,通常两端必须在这些参数的值上完全一致。
aaa_identity = <id>
定义在 IKEv2 EAP 身份验证期间使用的 AAA 后端的身份。 如果 EAP 客户端使用验证服务器身份的方法(例如 EAP-TLS),但它与 IKEv2 网关身份不匹配,则需要这样做。
aggressive = yes | no
是使用 IKEv1 野蛮模式还是主模式(默认)。
ah = <cipher suites>
用于连接的AH算法的逗号分隔列表,例如sha1-sha256-modp1024。符号是完整性[-dhgroup]。对于IKEv2,同一类型的多个算法(用 - 分隔)可以包含在单个提案中。IKEv1仅包含提案中的第一个算法。只能使用关键字ah或esp,不支持 AH+ESP同时使用。
没有默认的AH密码套件,因为默认使用ESP。 守护程序将其广泛的默认提议添加到配置的值。要将其限制为已配置的提案,可以在末尾添加感叹号 (!)。
如果指定了dh-group,则CHILD_SA/Quick Mode设置和密钥更新包含单独的 Diffie-Hellman 交换。
also = <name>
包含 conn 部分 <名称>。
auth = <value>
pluto IKEv1 守护进程使用 AH 对 ESP 加密报文进行完整性保护,但在 charon 中不支持。ah关键字指定用于AH完整性保护的算法,但不加密。 不支持 AH+ESP 同时使用。
authby = pubkey | rsasig | ecdsasig | psk | secret | never | xauthpsk | xauthrsasig
两个安全网关应如何相互验证; 可接受的值为预共享密钥的 psk 或 secret、公钥签名的 pubkey(默认值)以及 RSA 数字签名的同义词 rsasig 和椭圆曲线 DSA 签名的 ecdsasig。 如果永远不会尝试或接受协商,则可以使用 never(对于 shuntonly conns 很有用)。 数字签名在各方面都优于共享密钥。 除了分别基于共享密钥或数字 RSA 签名的 IKEv1 主模式之外,IKEv1 还支持 xauthpsk 和 xauthrsasig 值,它们将启用扩展身份验证 (eXtended AUTHentication,XAUTH)。 不推荐使用此参数,因为两个对等体不需要就 IKEv2 中的身份验证方法达成一致。请改用 leftauth 参数来定义身份验证方法。
auto = ignore | add | route | start
IPsec 启动时应自动执行哪些操作(如果有); 当前接受的值是 add、route、start 和 ignore(默认值)。 add 加载连接而不启动它。 route 加载连接并安装内核陷阱。 如果检测到左子网和右子网之间的流量,则建立连接。 start 加载一个连接并立即启动它。 ignore 忽略连接。 这相当于从配置文件中删除一个连接。 仅本地相关,另一端无需同意。
closeaction = none | clear | hold | restart
定义远程对等体意外关闭 CHILD_SA 时要采取的操作。如果对等体使用重新身份验证或 uniquids 检查,则不应使用关闭操作,因为这些事件可能会在不需要时触发定义的操作。
compress = yes | no
是否在连接上建议IPComp压缩内容(链路级压缩对加密数据不起作用,因此要有效,必须在加密之前进行压缩); 可接受的值为 yes 和 no(默认值)。 值为 yes 会导致守护程序建议压缩和未压缩,并且更喜欢压缩。 no 值阻止守护进程提议或接受压缩。
dpdaction = none | clear | hold | restart
控制死节点检测协议 (Dead Peer Detection,DPD, RFC 3706) 的使用,其中定期发送 R_U_THERE 通知消息 (IKEv1) 或空 INFORMATIONAL 消息 (IKEv2) 以检查 IPsec 对等点的活跃性。 值 clear、hold 和 restart 都激活 DPD 并确定超时时要执行的操作。 clear连接关闭后,不采取进一步行动。 hold 安装一个陷阱策略,它将捕获匹配的流量并尝试按需重新协商连接。 restart 将立即触发重新协商连接的尝试。 默认值为 none,禁用 DPD 消息的主动发送。
dpddelay = 30s | <time>
定义将 R_U_THERE 消息/INFORMATIONAL 交换发送到对等体的周期时间间隔。 只有在没有收到其他流量时才会发送这些信息。 在 IKEv2 中,值为 0 时不发送额外的信息消息,并且仅使用标准消息(例如要重新加密的消息)来检测死节点。
dpdtimeout = 150s | <time>
定义超时间隔,在此之后与对等体的所有连接都将在不活动的情况下被删除。 这仅适用于 IKEv1,在 IKEv2 中,默认重传超时适用,因为每个交换都用于检测死对等体。
inactivity = <time>
定义超时间隔,在此之后,如果 CHILD_SA 未发送或接收任何流量,则将其关闭。 在 CHILD_SA 更新密钥期间,不活动计数器被重置。这意味着不活动超时必须小于重新生成密钥的间隔才能生效。
eap_identity = <id>
定义客户端用来回复 EAP 身份请求的身份。 如果在 EAP 服务器上定义,则定义的身份将在 EAP 身份验证期间用作对等体身份。 特殊值 %identity 使用 EAP 身份方法向客户端询问 EAP 身份。 如果未定义,IKEv2 身份将用作 EAP 身份。
esp = <cipher suites>
用于连接的 ESP 加密/身份验证算法的逗号分隔列表,例如 aes128-sha256。 表示法是加密完整性[-dhgroup][-esnmode]。 对于 IKEv2,同一类型的多个算法(用 - 分隔)可以包含在单个提案中。 IKEv1 仅包含提案中的第一个算法。 只能使用 ah 或 esp 关键字,不支持 AH+ESP 同时使用。
默认为 aes128-sha256。守护程序将其广泛的默认提议添加到此默认值或配置值。要将其限制为已配置的提案,可以在末尾添加感叹号 (!)。
注意:作为响应者,守护进程默认选择第一个配置的提案,该提案也受到对等体的支持。这可以通过 strongswan.conf更改为选择对等体发送的第一个可接受的提案。为了限制响应者只接受特定的密码套件,可以使用严格标志(!,感叹号),例如:aes256-sha512-modp4096!
如果指定了 dh-group,则 CHILD_SA/快速模式密钥更新和初始协商使用指定组的单独 Diffie-Hellman 交换。但是,对于 IKEv2,使用 IKE_SA 隐式创建的 CHILD_SA 的密钥将始终来自 IKE_SA 的密钥材料。因此,此处指定的任何 DH 组仅在 CHILD_SA 稍后被重新加密或使用单独的 CREATE_CHILD_SA 交换创建时才适用。因此,建议不匹配可能不会在 SA 建立时立即被注意到,但可能会导致更新密钥失败。
esnmode 的有效值为 esn 和 noesn。指定两者都与对等体协商扩展序列号支持,默认为 noesn。
forceencaps = yes | no
即使未检测到 NAT 情况,也强制对 ESP 报文进行 UDP 封装。 这可能有助于克服限制性防火墙。 为了强制对等体封装报文,NAT 检测有效负载是伪造的。
fragmentation = yes | accept | force | no
是否使用 IKE 分片(根据 RFC 7383 的专有 IKEv1 扩展或 IKEv2 分片)。 可接受的值为 yes(默认值)、accept、force 和 no。 如果设置为yes,并且对等体支持,超大的IKE 消息将分片发送。 如果设置为接受,则会向对等体宣布对分片的支持,但守护进程不会以分片的形式发送自己的消息。 如果设置为强制(仅支持 IKEv1),初始 IKE 消息将在需要时被分片。 最后,将该选项设置为 no 将禁用宣布对此功能的支持。
请注意,无论此选项的值如何(即使设置为 no),对等体发送的分片 IKE 消息总是被接受。
ike = <cipher suites>
要使用的 IKE/ISAKMP SA 加密/身份验证算法的逗号分隔列表,例如 aes128-sha256-modp3072。 符号是加密完整性[-prf]-dhgroup。 如果没有给出 PRF,则为完整性定义的算法用于 PRF。 prf 关键字与完整性算法相同,但具有 prf 前缀(例如 prfsha1、prfsha256 或 prfaesxcbc)。
在 IKEv2 中,可能包含多种算法和提议,例如 aes128-aes256-sha1-modp3072-modp2048,3dessha1-md5-modp1024。
默认为 aes128-sha256-modp3072。 守护程序将其广泛的默认提议添加到此默认值或配置值。 要将其限制为已配置的提案,可以在末尾添加感叹号 (!)。
注意:作为响应者,守护进程接受从对等体收到的第一个支持的提案。 为了限制响应者只接受特定的密码套件,可以使用严格标志(!,感叹号),例如:aes256-sha512-modp4096!
ikedscp = 000000 | <DSCP field>
要在从此连接发送的传出 IKE 报文上设置的区分服务字段代码点。 该值是定义要设置的代码点的六位二进制编码字符串,如 RFC 2474 中所定义。
ikelifetime = 3h | <time>
在重新协商之前,连接(ISAKMP 或 IKE SA)的密钥通道应该持续多长时间。 另请参阅下面的“SA到期/更新密钥”。
installpolicy = yes | no
决定是否由 charon 守护进程为给定连接在内核中安装 IPsec 策略。允许和平合作,例如与想要控制内核策略的移动 IPv6 守护进程 mip6d 一起使用。 可接受的值为 yes(默认值)和 no。
keyexchange = ike | ikev1 | ikev2
应该使用哪个密钥交换协议来启动连接。 标有 ike 的连接在启动时使用 IKEv2,但在响应时接受任何协议版本。
keyingtries = 3 | <number> | %forever
在放弃之前应该进行多少次尝试(整数或 %forever)来协商连接或替换连接(默认 3)。 值 %forever 表示“永不放弃”。 仅本地相关,另一端无需同意。
left = <ip address> | <fqdn> | %any | <range> | <subnet>
左侧参与者的公共网络接口的 IP 地址或几个魔术值之一。本地端点的值 %any(默认值)表示在协商期间要填写的地址(通过自动键入)。如果本地对等体发起连接设置,则会查询路由表以确定正确的本地 IP 地址。如果本地对等体响应连接设置,则将接受分配给本地接口的任何 IP 地址。
完全限定域名或 IP 地址前面的前缀 % 将隐式设置 leftallowany=yes。
如果 %any 用于远程端点,它的字面意思是任何 IP 地址。
如果分配了 FQDN,则每次完成配置查找时都会对其进行解析。如果 DNS 解析超时,则查找会延迟该时间。
要将连接限制在特定范围的主机,可以指定范围(10.1.0.0-10.2.255.255)或子网(10.1.0.0/16),多个地址、范围和子网可以用逗号分隔。虽然可以自由组合这些项目,但要启动连接,至少需要一个范围/子网。
请注意,使用通配符时,多个连接描述可能会匹配给定的传入连接尝试。在这种情况下使用最具体的描述。
leftallowany = yes | no
left 的修饰符,尽管已分配了具体的 IP 地址或域名,但使其行为为 %any。
leftauth = <auth method>
在本地(左)使用或从远程(右)端使用的身份验证方法。可接受的值是用于公钥认证 (RSA/ECDSA) 的 pubkey,用于预共享密钥认证的 psk,用于(要求)在 IKEv2 中使用可扩展认证协议的 eap,以及用于 IKEv1 扩展认证的 xauth。
要要求远程端的信任链公钥强度,请指定密钥类型,后跟以位为单位的最小强度(例如 ecdsa-384 或 rsa-2048-ecdsa-256)。要限制信任链验证的可接受散列算法集,请将散列算法附加到 pubkey 或密钥强度定义(例如 pubkey-sha256-sha512、rsa-2048-sha256-sha384-sha512 或 rsa-2048-sha256-ecdsa- 256-sha256-sha384)。除非在 strongswan.conf中禁用,或者配置了明确的 IKEv2 签名约束(见下文),否则这些密钥类型和哈希算法也将作为对远程端使用的 IKEv2 签名认证方案的约束。
如果两个对等点都支持 RFC 7427(“IKEv2 中的签名认证”),则可以配置在 IKEv2 认证期间使用的特定散列算法。语法与上面相同,但带有 ike: 前缀。例如,对于 ike:pubkeysha384-sha256,具有 SHA-384 或 SHA-256 的公钥签名方案将用于身份验证,按照该顺序并取决于对等体支持的哈希算法。如果未配置特定的哈希算法,则默认优先选择匹配或超过签名密钥强度的算法。如果没有配置带有 ike: 前缀的约束,则任何签名方案约束(没有 ike: 前缀)也将应用于 IKEv2 身份验证,除非在 strongswan.conf中禁用此功能。
要使用或要求 RSASSA-PSS 签名,请使用 rsa/pss 而不是 rsa,例如ike:rsa/pss-sha256。如果配置了 pubkey 或 rsa 约束,则只有在 strongswan.conf中启用时,才会使用/接受 RSASSA-PSS 签名。
对于 eap,可以附加一个可选的 EAP 方法。当前定义的方法有 eap-aka、eap-gtc、eap-md5、eap-mschapv2、eap-peap、eap-sim、eap-tls、eap-ttls、eap-dynamic 和 eap-radius。或者,接受 IANA 分配的 EAP 方法编号。供应商特定的 EAP 方法以 eap-type-vendor 的形式定义(例如 eap-7-12345)。要为 EAP-(T)TLS 指定签名和信任链约束,请在 EAP 方法后附加一个冒号,后跟上面讨论的密钥类型/大小和哈希算法。对于 xauth,可以指定 XAuth 身份验证后端,例如 xauth-generic 或 xauth-eap。如果在 leftauth 中使用 XAuth,则使用混合身份验证。对于传统的 XAuth 身份验证,在 lefauth2 中定义 XAuth。
leftauth2 = <auth method>
与 leftauth 相同,但定义了额外的身份验证交换。 在 IKEv1 中,第二轮认证只能使用 XAuth。 IKEv2 使用 RFC 4739 中定义的“多重身份验证交换”支持多轮完整的身份验证。例如,这允许对主机和用户进行单独的身份验证。
leftca = <issuer dn> | %same
证书颁发机构的专有名称,需要位于从左参与者证书到根证书颁发机构的信任路径中。 %same 表示应该重用为正确参与者配置的值。
leftca2 = <issuer dn> | %same
与 leftca 相同,但用于第二轮身份验证(仅限 IKEv2)。
leftcert = <path>
左侧参与者的 X.509 证书的路径。 该文件可以以 PEM 或 DER 格式编码。 也支持 OpenPGP 证书。 绝对路径或相对于 /etc/ipsec.d/certs 的路径都被接受。 默认情况下,leftcert 将 leftid 设置为证书主题的可分辨名称。 但是,可以通过指定必须由证书认证的 leftid 值来覆盖左侧参与者的 ID。 %smartcard[<slot nr>[@<module>]]:<keyid> 形式的值定义要从 PKCS#11 后端为此连接加载的特定证书。 有关智能卡定义的详细信息,请参阅 ipsec.secrets。 仅当使用 leftid 选择证书不够时才需要 leftcert,例如,如果多个证书使用相同的主题。 可以在逗号分隔的列表中指定多个证书路径或 PKCS#11 后端。 如果可能,守护程序会根据收到的证书请求选择证书,然后再强制执行第一个。
leftcert2 = <path>
与 leftcert 相同,但用于第二轮身份验证(仅限 IKEv2)。
leftcertpolicy = <OIDs>
对等体的证书必须具有的证书策略 OID 的逗号分隔列表。 OID 使用数字点表示来指定。
leftdns = <servers>
要作为配置属性交换的 DNS 服务器地址的逗号分隔列表。 在启动器上,服务器是一个固定的 IPv4/IPv6 地址,或 %config4/%config6 来请求没有地址的属性。 在响应者上,仅允许使用固定的 IPv4/IPv6 地址并定义分配给客户端的 DNS 服务器。
leftfirewall = yes | no
左侧参与者是否正在使用 iptables 对来自 leftsubnet 的流量进行转发防火墙(包含伪装),一旦建立连接,就应该关闭(对于到另一个子网的流量);可接受的值为 yes 和 no(默认值)。不能在与 leftupdown 相同的连接描述中使用。作为默认 ipsec _updown 脚本的参数实现。请参阅下面的注释。仅本地相关,另一端无需同意。
如果一个或两个安全网关都在进行转发防火墙(可能包含伪装),并且这是使用防火墙参数指定的,则使用 IPsec 建立的隧道不受其影响,因此报文可以通过隧道保持不变。 (这意味着以这种方式连接的所有子网必须具有不同的、不重叠的子网地址块。)这是由默认的 ipsec _updown 脚本完成的。
在需要更多控制的情况下,用户最好提供他自己的 updown 脚本,以便对他的系统进行适当的调整。
leftgroups = <group list>
逗号分隔的组名列表。 如果 leftgroups 参数存在,则对等体必须是该参数定义的至少一个组的成员。
leftgroups2 = <group list>
与 leftgroups 相同,但用于使用 leftauth2 定义的第二轮身份验证。
lefthostaccess = yes | no
使用默认的 ipsec _updown 脚本插入一对 INPUT 和 OUTPUT iptables 规则,从而在主机的内部接口是协商的客户端子网的一部分的情况下允许访问主机本身。 可接受的值为 yes 和 no(默认值)。
leftid = <id>
如何识别左参与者以进行身份验证;默认为 left 或使用 leftcert 配置的证书的主题。如果配置了 leftcert,则必须通过证书确认身份。
可以是 IP 地址、完全限定域名、电子邮件地址或可识别名称,其 ID 类型会自动确定,字符串会转换为适当的编码。此转换的规则在下面的“身份解析”中描述。
在某些特殊情况下,上面的身份解析可能不充分或产生错误的结果。例如需要将 FQDN 编码为 KEY_ID,或者字符串解析器无法生成证书 DN 的正确二进制 ASN.1 编码。对于这些情况,可以强制执行特定的身份类型并提供身份的二进制编码。为此,可以使用前缀,后跟冒号 (:)。如果数字符号 (#) 跟在冒号后面,则剩余数据被解释为十六进制编码,否则将字符串原样用作标识数据。注意:后者意味着不对非字符串身份执行任何转换。例如,ipv4:10.0.0.1 不会创建有效的 ID_IPV4_ADDR IKE 身份,因为它不会转换为二进制 0x0a000001。相反,可以使用 ipv4:#0a000001 来获得有效身份,但仅使用具有自动转换的隐式类型通常更简单。这同样适用于 ASN.1 编码类型。以下前缀是已知的:ipv4、ipv6、rfc822、email、userfqdn、fqdn、dns、asn1dn、asn1gn 和 keyid。自定义类型前缀可以通过用大括号包围数字类型值来指定。
对于 IKEv2 和 rightid,身份前面的前缀 % 可防止守护程序在其 IKE_AUTH 请求中发送 IDr,并允许它根据响应者证书中包含的主题和 subjectAltNames 验证配置的身份(否则仅与 IDr 进行比较由响应者返回)。如果响应者为 leftid 配置了不同的值,则发起者发送的 IDr 可能会阻止响应者找到配置。
leftid2 = <id>
用于左侧参与者的第二次身份验证的身份(仅限 IKEv2); 默认为leftid。
leftikeport = <port>
左侧参与者用于 IKE 通信的 UDP 端口。 如果未指定,则使用端口 500,如果检测到 NAT 或启用 MOBIKE,则端口浮动到 4500。 指定与默认不同的本地 IKE 端口还需要侦听此端口的套接字实现。
leftprotoport = <protocol>/<port>
将流量选择器限制为单个协议和/或端口。 现在不推荐使用此选项,可以直接在 leftsubnet 中为每个子网定义协议/端口信息。
leftsigkey = <raw public key> | <path to public key>
左侧参与者用于公钥签名认证的公钥,采用 PKCS#1 格式,使用十六进制(0x 前缀)或 base64(0s 前缀)编码。 使用 0x 或 0s 前面的可选 dns: 或 ssh: 前缀,公钥应分别采用 RFC 3110(不是完整的 RR,只有 RSA 密钥部分)或 RFC 4253 公钥格式。 还接受包含 PEM、DER 或 SSH 编码的公钥的文件的路径。 绝对路径或相对于 /etc/ipsec.d/certs 的路径都被接受。
leftsendcert = never | no | ifasked | always | yes
接受的值是 never 或 no,always 或 yes,以及 ifasked(默认值),后者意味着对等体必须发送证书请求有效负载才能获得证书作为回报。
leftsourceip = %config4 | %config6 | <ip address>
要在隧道中使用的内部源 IP 的逗号分隔列表,也称为虚拟 IP。 如果该值是同义词 %config、%cfg、%modeconfig 或 %modecfg 之一,则从对等端请求地址(来自隧道地址系列)。 使用 %config4 和 %config6 将明确请求给定地址族的地址。 如果配置了 IP 地址,则会向响应者请求,响应者可以自由地使用不同的地址进行响应。
rightsourceip = %config | <network>/<netmask> | <from>-<to> | %poolname
要在远程对等体的隧道中使用的内部源 IP 的逗号分隔列表。 如果响应方的值为 %config,则发起方必须提出一个地址,然后回显。 还支持以网络/网络掩码表示的地址池,以及使用 %poolname 来表示或使用外部 IP 地址池,其中 poolname 是用于查找的 IP 地址池的名称。
leftsubnet = <ip subnet>[[<proto/port>]][,...]
左侧参与者后面的私有子网,表示为网络/网络掩码;如果省略,则基本上假定为 left/32,表示连接的左端仅到达左侧参与者。对等体的配置子网可能不同,协议将其缩小到最大公共子网。在 IKEv1 中,这可能会导致其他实现出现问题,请确保在此类配置中配置相同的子网。 IKEv2 支持以逗号分隔的多个子网。 IKEv1 仅解释此类定义的第一个子网,除非启用了 Cisco Unity 扩展插件。这是由于 IKEv1 协议的限制,每个 CHILD_SA 只允许一对子网。因此,要为多个子网建立隧道,必须为每对子网定义和启动一个 conn 条目。
方括号中的每个子网后面的可选部分指定了一个协议/端口,以限制该子网的选择器。
示例:leftsubnet=10.0.0.1[tcp/http],10.0.0.2[6/80] 或 leftsubnet=fec1::1[udp],10.0.0.0/16[/53]。而不是省略任何一个值, %any 可以用于相同的效果,例如leftsubnet =fec1::1[udp/%any],10.0.0.0/16[%any/53]。
如果协议是 icmp 或 ipv6-icmp,则端口在小于 256 时被解释为 ICMP 消息类型,如果大于或等于 256,则被解释为类型和代码,类型在最高有效 8 位,代码在最低有效 8 位。
端口值也可以采用 RFC 4301 OPAQUE 选择器的值 %opaque,或 1024-65535 形式的数字范围。目前没有任何内核后端支持不透明或端口范围,而是使用 %any 进行策略安装。
不用指定子网,可以使用 %dynamic 将其替换为 IKE 地址,与完全省略 leftsubnet 具有相同的效果。使用 %dynamic 可用于定义多个动态选择器,每个选择器都有可能不同的协议/端口定义。
leftupdown = <path>
当连接状态发生变化时,运行什么“updown”脚本来调整路由和/或防火墙(默认ipsec _updown)。 可能包含由空格分隔的位置参数(尽管这需要将整个字符串括在引号中); 包含 shell 元字符是不明智的。 仅本地相关,另一端无需同意。 Charon 使用 updown 脚本只插入防火墙规则,因为路由已经直接实现到守护进程中。
lifebytes = <number>
在 IPsec SA 过期之前通过它传输的字节数。
lifepackets = <number>
在 IPsec SA 过期之前通过它传输的报文数。
lifetime = 1h | <time>
从成功协商到到期,连接的特定实例(用户报文的一组加密/身份验证密钥)应该持续多长时间; 可接受的值是一个整数,可选地后跟 s(以秒为单位的时间)或一个十进制数,后跟 m、h 或 d(分别以分钟、小时或天为单位的时间)(默认为 1h,最大为 24h)。 通常,连接会在过期之前重新协商(通过密钥通道)(参见margintime)。 两端不需要完全同意生命周期,但如果它们不完全一致,则认为生命周期更长的一端会有一些被取代的连接混乱。 另请参阅下面的 “SA到期/更新密钥”。
marginbytes = <number>
IPsec SA 到期前的多少字节(请参阅 lifebytes)应该尝试协商替换开始。
marginpackets = <number>
在 IPsec SA 到期之前有多少报文(请参阅 lifepackets)应该尝试协商替换开始。
margintime = 9m | <time>
应该在连接到期或密钥通道到期前多长时间开始尝试协商替换; 可接受的生命周期值(默认 9m)。 仅本地相关,另一端无需同意。 另请参阅下面的 “SA到期/更新密钥”。
mark = <value>[/<mask>]
在入站策略和出站 IPsec SA 和策略上设置 XFRM 标记。 如果缺少掩码,则假定默认掩码为 0xffffffff。 特殊值 %unique 为每个新创建的 IPsec SA 分配一个唯一值。 为了额外使每个 IPsec SA 方向(输入/输出)的标记唯一,可以使用特殊值 %unique-dir。
mark_in = <value>[/<mask>]
在入站策略(而不是 SA)上设置 XFRM 标记。 如果缺少掩码,则假定默认掩码为 0xffffffff。
mark_out = <value>[/<mask>]
在出站 IPsec SA 和策略上设置 XFRM 标记。 如果缺少掩码,则假定默认掩码为 0xffffffff。
mobike = yes | no
启用 RFC 4555 定义的 IKEv2 MOBIKE 协议。接受的值为 yes(默认值)和 no。 如果设置为 no,charon 守护进程将不会主动提议 MOBIKE 作为发起者并忽略 MOBIKE_SUPPORTED 通知作为响应者。
modeconfig = push | pull
定义用于分配虚拟 IP 的模式。 接受的值是 push 和 pull(默认值)。 IKEv2 目前不支持push模式。 两边的设置必须相同。
reauth = yes | no
IKE_SA 的密钥更新是否也应该重新验证对等体。 在 IKEv1 中,始终会进行重新身份验证。 在 IKEv2 中,no rekeys 值无需卸载 IPsec SA,yes(默认值)值从头开始创建新的 IKE_SA 并尝试重新创建所有 IPsec SA。
rekey = yes | no
连接即将到期时是否应重新协商; 可接受的值为 yes(默认值)和 no。 两端不需要同意,但是 no 的值会阻止 charon 请求重新协商,但它不会阻止响应另一端请求的重新协商,因此除非双方同意,否则 no 将在很大程度上无效。 另见reauth。
rekeyfuzz = 100% | <percentage>
应随机增加marginbytes、marginpackets 和margintime 的最大百分比,以随机化密钥更新间隔(对于具有许多连接的主机很重要); 可接受的值是一个整数,可能超过 100,后跟一个 `%'(默认为 100%)。 随机增加后,marginTYPE 的值不得超过 lifeTYPE(其中 TYPE 是字节、报文或时间之一)。 值 0% 将抑制随机化。 仅本地相关,另一端无需同意。 另请参阅下面的“SA到期/更新密钥”。
replay_window = -1 | <number>
此连接的 IPsec 重播窗口大小。 默认值为 -1,使用 strongswan.conf中使用 charon.replay_window 配置的值。 仅使用 Netlink 后端支持大于 32 的值,值 0 禁用 IPsec 重放保护。
reqid = <number>
将给定连接的 reqid 设置为预先配置的固定值。
sha256_96 = no | yes
HMAC-SHA-256 与 IPsec 的 128 位截断一起使用。 为了与错误使用 96 位截断的实现兼容,可以启用此选项以在内核中配置较短的截断长度。 这不是协商的,因此这仅适用于使用不正确截断长度(或启用此选项)的对等体。
tfc = <value>
将 ESP 有效负载数据填充到的字节数。 IKEv2 当前支持流量机密性,仅适用于传出报文。 特殊值 %mtu 用填充填充 ESP 报文以具有 MTU 的大小。
type = tunnel | transport | transport_proxy | passthrough | drop
连接类型; 当前接受的值是tunnel(默认值),表示主机到主机、主机到子网或子网到子网隧道; transport,表示主机到主机的传输模式; transport_proxy,表示特殊的Mobile IPv6传输代理模式; passthrough,表示根本不应该进行任何 IPsec 处理; drop,表示应该丢弃报文。
xauth = client | server
如果由 authby=xauthpsk 或 authby=xauthrsasig 激活,则指定 XAuth 协议中的角色。 接受的值为服务器和客户端(默认值)。
xauth_identity = <id>
定义客户端用来回复 XAuth 请求的身份/用户名。 如果未定义,IKEv1 身份将用作 XAuth 身份。
以下参数仅与 IKEv2 中介扩展操作相关。
mediation = yes | no
此连接是否为中介连接,即。 此连接是否用于调解其他连接。 中介连接不创建子 SA。 可接受的值为 no(默认值)和 yes。
mediated_by = <name>
用于调解此连接的连接名称。 如果给定,连接将通过命名的中介连接进行中介。 中介连接必须设置mediation =yes。
me_peerid = <id>
中介服务器知道对等体的 ID,即。 此连接的另一端将其用作与中介服务器连接的 leftid。 这是我们请求中介服务器用来调解我们的 ID。 如果没有给出me_peerid,则该连接的rightid 将用作peer ID。
这些是可用于将特殊参数分配给证书颁发机构 (Certification Authority,CA) 的可选部分。 因为守护进程会自动从 /etc/ipsec.d/cacerts 导入 CA 证书,所以无需使用 CA 部分显式添加它们,除非您想为 CA 分配特殊参数(如 CRL)。
also = <name>
包含 ca 部分 <name>。
auto = ignore | add
当前可以具有值忽略(默认值)或添加。
cacert = <path>
定义 CA 证书的路径,相对于 /etc/ipsec.d/cacerts 或绝对路径。 %smartcard[<slot nr>[@<module>]]:<keyid> 形式的值定义要从 PKCS#11 后端为此 CA 加载的特定 CA 证书。 有关智能卡定义的详细信息,请参阅 ipsec.secrets。
crluri = <uri>
定义 CRL 分发点(ldap、http 或文件 URI)
crluri1
crluri 的同义词。
crluri2 = <uri>
定义备用 CRL 分发点(ldap、http 或文件 URI)
ocspuri = <uri>
定义一个 OCSP URI。
ocspuri1
ocspuri 的同义词。
ocspuri2 = <uri>
定义了一个替代的 OCSP URI。
certuribase = <uri>
定义 IKEv2 支持的 Hash 和 URL 功能的基本 URI。 IKEv2 不交换完整的证书,而是允许发送解析为 DER 编码证书的 URI。 证书 URI 是通过将 DER 编码证书的 SHA1 哈希附加到此基本 URI 来构建的。
目前,IPsec 软件唯一知道的配置部分是名为 setup 的部分,其中包含软件启动时使用的信息。 配置设置部分中当前接受的参数名称是:
cachecrls = yes | no
如果启用,通过 HTTP 或 LDAP 获取的证书吊销列表 (certificate revocation lists,CRL) 将缓存在 /etc/ipsec.d/crls/ 中的唯一文件名下,该文件名源自证书颁发机构的公钥。
charondebug = <debug list>
应该记录多少 charon 调试输出。 可以指定包含类型/级别对的逗号分隔列表,例如:dmn 3、ike 1、net -1。 可接受的类型值为 dmn、mgr、ike、chd、job、cfg、knl、net、asn、enc、lib、esp、tls、tnc、imc、imv、pts,级别为 -1、0、1 之一 , 2, 3, 4(用于静默、审计、控制、控制更多、原始、私有)。 默认情况下,所有类型的级别都设置为 1。
strictcrlpolicy = yes | ifuri | no
定义是否必须提供新的 CRL 才能使基于 RSA 签名的对等身份验证成功。 IKEv2 还识别 ifuri,如果定义了至少一个 CRL URI,则返回 yes,如果不知道 URI,则返回 no。
uniqueids = yes | no | never | replace | keep
是否应保持特定参与者 ID 的唯一性,任何使用 ID 的新 IKE_SA 都被视为替换使用该 ID 的所有旧的; 可接受的值为 yes(默认值)、no 和 never。 参与者 ID 通常是唯一的,因此使用相同 ID 的新 IKE_SA 几乎总是旨在替换旧的。 no 和 never 之间的区别在于,如果选项为 no,则守护程序将在接收 INITIAL_CONTACT 通知时替换旧的 IKE_SA,但如果配置了 never,则将忽略这些通知。 守护进程还接受与 yes 相同的值 replace 和值 keep 以拒绝新的 IKE_SA 设置并保持先前建立的副本。
leftid 中指定的标识字符串的类型和二进制编码检测如下:
· 如果字符串值包含等号 (=),则假定它是专有名称,RDN 由逗号 (,) 或斜杠分隔(/ - 字符串必须以斜杠开头才能使用此语法)。尝试从该字符串创建二进制 ASN.1 编码。如果失败,则将类型设置为 KEY_ID,并采用文字字符串值作为编码。
· 如果字符串值包含@,则类型取决于该字符的位置:
· 如果字符串以@# 开头,则类型设置为KEY_ID,并且该前缀后面的字符串被假定为身份的十六进制编码二进制值。
· 如果字符串以@@ 开头,则类型设置为 USER_FQDN,并且编码是该前缀之后的文字字符串。
· 如果字符串以@ 开头,则类型设置为FQDN,并且编码是该前缀之后的文字字符串。
· 包含@ 的所有剩余字符串都假定为USER_FQDN/RFC822 类型,并以文字字符串值作为编码。
· 如果值不包含任何 @ 或 = 字符,则解析如下:
· 如果值为空字符串,或等于 %any[6]、0.0.0.0、:: 或 *,则类型设置为 ID_ANY,它与任何其他身份匹配。
· 如果值包含冒号 (:),则假定它是 IPv6 地址。但是,如果解析地址并将其转换为二进制编码失败,则类型设置为 KEY_ID 并且编码是文字值。
· 对于所有其他字符串,尝试将它们解析为 IPv4 地址。如果失败,则将类型设置为 FQDN,并采用文字值作为编码(这是域名和简单名称结束的地方)。
由守护进程协商的 IKE SA 和 IPsec SA 可以配置为在特定时间后过期。 对于 IPsec SA,这也可能在指定数量的传输报文或传输字节之后发生。 可以使用以下设置进行配置:
IKE SA的ikelifetime默认值为3h;IPsec SA的lifebytes默认值为空,lifepackets默认值为空,lifetime默认值为1h。
重新加密
IKE SA 和 IPsec SA 可以在到期前重新生成密钥。 这可以使用以下设置进行配置:
IKE SA和IPsec SA的margintime默认值为9m;IPsec SA的marginbytes默认值为空,marginpackets默认值为空。
随机化
为了避免冲突,指定的保证金在从到期限制中减去之前随机增加(参见下面的公式)。 这由 rekeyfuzz 设置控制:
IKE SA和IPsec SA的rekeyfuzz默认值为100%,可以通过将rekeyfuzz设置为 0% 来禁用随机化。
公式
以下公式用于计算 IPsec SA 的密钥更新时间:
rekeytime = lifetime - (margintime + random(0, margintime * rekeyfuzz))
它同样适用于 IKE SA 以及 IPsec SA 的字节和报文限制。
例子
让我们考虑一下默认配置:
lifetime = 1h
margintime = 9m
rekeyfuzz = 100%
从上面的公式可以看出,重新生成密钥的时间介于:
rekeytime_min = 1h - (9m + 9m) = 42m
rekeytime_max = 1h - (9m + 0m) = 51m
因此,守护程序将在建立 SA 后 42 到 51 分钟之间的随机时间尝试重新生成 IPsec SA 的密钥。 或者,换句话说,在 SA 到期前 9 到 18 分钟。
· 由于 SA 的重新加密需要一些时间,所以边际值不能太低。
· 值margin... + margin... * rekeyfuzz 不能超过原来的限制。 例如,在默认配置中指定 margintime = 30m 是一个坏主意,因为重新生成密钥的时间可能为零,因此重新生成密钥会被禁用。