IPsec

本节介绍 IPsec 示例和集成。使用本节可配置 IKEv2、预共享密钥和后量子密钥工作流,以及第三方 VPN 连接。

IPsec

本节介绍 IPsec 示例和集成。使用本节可配置 IKEv2、预共享密钥和后量子密钥工作流,以及第三方 VPN 连接。

Internet Protocol Security (IPsec) 是 Internet Engineering Task Force (IETF) 定义的一组协议,用于在互联网等未受保护的 IP/IPv6 网络上保护数据包交换。

IPsec 协议套件可分为以下几组:

  • Internet Key Exchange (IKE) 协议,动态生成并分发用于 AH 和 ESP 的加密密钥。
  • Authentication Header (AH) RFC 4302。
  • Encapsulating Security Payload (ESP) RFC 4303。

Internet Key Exchange Protocol (IKE)

Internet Key Exchange (IKE) 是一种协议,为 Internet Security Association and Key Management Protocol (ISAKMP) 框架提供经过认证的密钥材料。其他密钥交换方案也可与 ISAKMP 配合工作,但 IKE 是使用最广泛的一种。两者共同提供主机身份验证和安全关联(SA)的自动管理手段。

IKE 守护进程在大多数情况下处于空闲状态。它在两种情况下被激活:

被 policy 规则匹配的流量需要加密或认证,但该 policy 没有任何 SA。policy 会通知 IKE 守护进程,随后 IKE 守护进程向远程主机发起连接。IKE 守护进程也可以响应远程连接。在两种情况下,peer 都会建立连接并执行 2 个阶段:

  • Phase 1 - peer 就它们在后续 IKE 消息中使用的算法达成一致并相互认证。用于为所有 SA 派生密钥以及保护主机之间后续 ISAKMP 交换的密钥材料也会在此生成。此阶段应匹配以下设置:

    • Authentication method
    • DH group
    • Encryption algorithm
    • Exchange mode
    • Hash algorithm
    • NAT-T
    • DPD 和 lifetime(可选)
  • Phase 2 - peer 建立一个或多个供 IPsec 用于加密数据的 SA。IKE 守护进程建立的所有 SA 都有 lifetime 值(要么限制 SA 变为无效的时间,要么限制此 SA 可以加密的数据量,或两者兼有)。此阶段应匹配以下设置:

    • IPsec protocol
    • Mode(tunnel 或 transport)
    • Authentication method
    • PFS (DH) group
    • lifetime

警告

存在两个 lifetime 值 —— soft 和 hard。当 SA 达到其 soft lifetime 阈值时,IKE 守护进程会收到通知并发起另一次 Phase 2 交换,以用新的 SA 替换此 SA。如果 SA 达到 hard lifetime,则会被丢弃。

注意: 如果禁用 DPD,当 lifetime 到期时 Phase 1 不会重新密钥;只有 Phase 2 会重新密钥。要强制 Phase 1 重新密钥,请启用 DPD。

注意: PSK 认证在 "aggressive" 模式下已知易受离线攻击,但最近的发现表明,在 "main" 和 "ike2" 交换模式下也可能发生离线攻击。你应避免使用 PSK 认证方法。 IKE 可选地提供 Perfect Forward Secrecy (PFS),这是密钥交换的一种属性,对 IKE 而言意味着:即使长期 Phase 1 密钥被泄露,也无法轻易访问通过此 Phase 1 建立的 SA 所保护的所有 IPsec 数据。这意味着每次 Phase 2 都会生成额外的密钥材料。

密钥材料的生成在计算上非常昂贵。例如,modp8192 组交换即使在非常快的计算机上也可能需要几秒钟。它通常在每个 Phase 1 交换中发生一次,而 Phase 1 交换机在任何主机对之间只发生一次,然后会保持很长时间。PFS 会将这一昂贵操作也添加到每次 Phase 2 交换中。

Diffie-Hellman 组

Diffie-Hellman (DH) 密钥交换协议允许两方在最初没有任何共享密钥的情况下安全地建立共享密钥。支持以下 Modular Exponential (MODP) 和 ECP Diffie-Hellman(也称为 "Oakley")组:

Diffie-Hellman 组名称参考
Group 1768 位 MODP 组RFC 2409
Group 21024 位 MODP 组RFC 2409
Group 51536 位 MODP 组RFC 3526
Group 142048 位 MODP 组RFC 3526
Group 153072 位 MODP 组RFC 3526
Group 164096 位 MODP 组RFC 3526
Group 176144 位 MODP 组RFC 3526
Group 188192 位 MODP 组RFC 3526
Group 19256 位随机 ECP 组RFC 5903
Group 20384 位随机 ECP 组RFC 5903
Group 21521 位随机 ECP 组RFC 5903

有关标准的更多信息可在此处找到:here。

更大的 DH 组提供更强的安全性,但需要更多 CPU 资源。以下是几种具有不同安全级别和 CPU 影响的常见 DH 组:

DH Group 14(2048 位)- 在安全性和 CPU 使用之间提供了实用的平衡。它提供 2048 位密钥交换,被认为对大多数现代应用是安全的,并得到广泛支持。

DH Group 5(1536 位)- 提供的安全级别略低于 DH Group 14,但由于密钥尺寸更小,CPU 开销更低。在许多场景中仍被认为可接受。

DH Group 2(1024 位)- 应谨慎使用,因为在常用组中它提供的安全性最低。尽管 CPU 要求较低,但随着计算能力的提升,它更容易受到攻击。不要将其用于新部署。

为获得最佳安全性,你应使用 DH Group 19。它通常被认为既快速又安全。除非为了与旧设备兼容而需要,否则通常应避免使用 DH Group 2。

信息

要计算适合你网络基础设施的安全级别,首先确定所需的安全位数,并估算解密受保护数据应花费多长时间。根据这些要求,选择合适的算法。作为参考,请参见 https://www.keylength.com/en/4/。

IKE 流量

为避免 IKE 数据包命中某个 SPD 规则并需要使用尚未建立的 SA(该数据包可能正试图建立此 SA)进行加密而产生的问题,源端口为 UDP 500 的本地发起数据包不会经过 SPD 处理。同样,要本地交付的、目标端口为 UDP 500 的数据包也不会在入站 policy 检查中处理。

设置流程

要让 IPsec 使用 IKE-ISAKMP 进行自动密钥交换工作,你必须配置 policy、peer 和 proposal(可选)条目。

危险

IPsec 对时间变化非常敏感。如果 IPsec 隧道两端的时间没有同步一致(例如,不同的 NTP 服务器没有以相同的时间戳更新时间),隧道会中断并必须重新建立。

EAP 认证方法

外部认证内部认证
EAP-GTC
EAP-MD5
EAP-MSCHAPv2
EAP-PEAPv0EAP-MSCHAPv2 EAP-GPSK EAP-GTC EAP-MD5 EAP-TLS
EAP-SIM
EAP-TLS
EAP-TTLSPAP CHAP MS-CHAP MS-CHAPv2 EAP-MSCHAPv2 EAP-GTC EAP-MD5 EAP-TLS

Windows 上的 EAP-TLS 称为 "Smart Card or other certificates"。

信息

不支持用于 IKEv2 认证的 AES-GCM 加密。

重要: 如果将 IPsec 与 X.509 证书一起使用,证书必须包含 "SubjectKeyIdentifier" 扩展,该扩展仅在版本 3 中受支持。

重要: 不支持使用 ed25519 认证。

Authentication Header (AH)

AH 是一种通过添加基于数据报中的值计算出的头部,来提供数据报全部或部分内容认证的协议。用于计算的数据报部分以及头部的放置位置,取决于使用的是 tunnel 还是 transport 模式。

AH 头部的存在允许验证消息的完整性,但不会对其进行加密。因此,AH 提供认证但不提供隐私。另一种协议 (ESP) 被认为更优;它提供数据隐私以及自己的认证方法。

RouterOS 为 AH 支持以下认证算法:

  • SHA2 (256, 512)
  • SHA1
  • MD5

传输模式

在 transport 模式下,AH 头部插入在 IP 头部之后。使用 IP 数据和头部来计算认证值。传输过程中可能发生变化的 IP 字段(如 TTL 和 hop count)在认证前会被设置为零值。

隧道模式

在 tunnel 模式下,原始 IP 数据包被封装在一个新的 IP 数据包内。所有原始 IP 数据包都会被认证。

Encapsulating Security Payload (ESP)

Encapsulating Security Payload (ESP) 使用共享密钥加密来提供数据隐私。ESP 也支持其自己的认证方案,类似于 AH 中使用的方案。

ESP 打包其字段的方式与 AH 非常不同。它不只有一个头部,而是将其字段分为三个组成部分:

  • ESP Header - 位于加密数据之前,其位置取决于 ESP 是在 transport 模式还是 tunnel 模式下使用。
  • ESP Trailer - 此部分位于加密数据之后。它包含用于对齐加密数据的填充。
  • ESP Authentication Data - 当使用 ESP 的可选认证功能时,此字段包含以类似于 AH 协议工作方式计算出的 Integrity Check Value (ICV)。

传输模式

在 transport 模式下,ESP 头部插入在原始 IP 头部之后。ESP 尾部(trailer)和认证值被添加到数据包末尾。在此模式下,只有 IP 载荷被加密和认证;IP 头部不受保护。

隧道模式

在 tunnel 模式下,原始 IP 数据包被封装在一个新的 IP 数据包内,从而保护 IP 载荷和 IP 头部。

加密算法

RouterOS ESP 支持各种加密和认证算法。

认证

  • MD5
  • SHA1
  • SHA2 (256-bit, 512-bit)

加密

  • AES - 128 位、192 位和 256 位密钥的 AES-CBC、AES-CTR 和 AES-GCM 算法。
  • Blowfish - 自 v4.5 起添加。
  • Twofish - 自 v4.5 起添加。
  • Camellia - 自 v4.5 起添加的 128 位、192 位和 256 位密钥 Camellia 加密算法。
  • DES - 56 位 DES-CBC 加密算法。
  • 3DES - 168 位(3 x 56 位)DES 加密算法。

硬件加速

硬件加速通过 CPU 内置的加密引擎实现更快的加密。

支持硬件加速的设备列表可在此处找到:here

CPUDES 和 3DESAES-CBCAES-CTRAES-GCM
MD5SHA1SHA256SHA512MD5SHA1SHA256SHA512MD5SHA1SHA256SHA512MD5SHA1SHA256SHA512
88F7040否是是是否是是是否是是是否是是是
AL21400是是是是是是是是是是是是是是是是
AL32400是是是是是是是是是是是是是是是是
AL52400是是是是是是是是是是是是是是是是
AL73400是是是是是是是是是是是是是是是是
IPQ-4018 / IPQ-4019否是是否否是*是*否否是*是*否否否否否
IPQ-5018是是是否是是是否是是是否否否否否
IPQ-6010否否否否否是是是否是是是否是是是
IPQ-8064否是是否否是*是*否否是*是*否否否否否
IPQ-8072否否否否否是是是否是是是否是是是
MT7621A是****是****是****否是是是否否否否否否否否否
EN7562CT是****是****是****否是是是否是是是否否否否否
P1023NSN5CFB否否否否是**是**是**是**否否否否否否否否
P202ASSE2KFB是是是否是是是是否否否否否否否否
PPC460GT否否否否是***是***是***是***是***是***是***是***否否否否
TLR4 (TILE)是是是否是是是否是是是否否否否否
x86 (AES-NI)否否否否是***是***是***是***是***是***是***是***是***是***是***是***

* 仅支持 128 位和 256 位密钥长度

** 仅自 2016 年起生产,序列号以数字 5 和 7 开头

*** 仅 AES-CBC 和 AES-CTR 加密被加速,哈希在软件中完成

**** 不支持 DES,仅支持 3DES 和/或 AES-CBC

各种加密和哈希算法组合的 IPsec 吞吐量结果发布在 MikroTik products page 上。

带 NAT 的 RoadWarrior 客户端

考虑如下所示的设置。RouterOS 作为 RoadWarrior 客户端连接到 Office,允许访问其内部资源。

隧道建立,接收到本地 mode-config IP 地址,并生成一组动态 policy。

[admin@mikrotik] > ip ipsec policy print 
Flags: T - template, X - disabled, D - dynamic, I - invalid, A - active, * - default 
 0 T * group=default src-address=::/0 dst-address=::/0 protocol=all proposal=default template=yes 

 1 DA src-address=192.168.77.254/32 src-port=any dst-address=10.5.8.0/24 dst-port=any protocol=all 
action=encrypt level=unique ipsec-protocols=esp tunnel=yes sa-src-address=10.155.107.8 
sa-dst-address=10.155.107.9 proposal=default ph2-count=1 

 2 DA src-address=192.168.77.254/32 src-port=any dst-address=192.168.55.0/24 dst-port=any protocol=all 
action=encrypt level=unique ipsec-protocols=esp tunnel=yes sa-src-address=10.155.107.8 
sa-dst-address=10.155.107.9 proposal=default ph2-count=1 

只有源地址为 192.168.77.254/32 的数据包匹配 IPsec policy。要让本地网络到达远程子网,你必须将本地主机的源地址改为动态分配的 mode config IP 地址。源 NAT 规则可以动态生成。创建一个新的 address list,包含应应用 NAT 规则的所有本地网络。在本例中,它是 192.168.88.0/24。

/ip/firewall/address-list/add address=192.168.88.0/24 list=local-RW

在 mode-config initiator 配置下指定该 address list 会动态生成源 NAT 规则。

/ip/ipsec/mode-config/set [ find name="request-only" ] src-address-list=local-RW

当 IPsec 隧道建立时,会为每个网络出现动态创建的源 NAT 规则。现在 192.168.88.0/24 中的每台主机都可以访问 Office 的内部资源。

[admin@mikrotik] > ip firewall nat print 
Flags: X - disabled, I - invalid, D - dynamic 
 0 D ;;; ipsec mode-config
chain=srcnat action=src-nat to-addresses=192.168.77.254 dst-address=192.168.55.0/24 src-address-list=local-RW

 1 D ;;; ipsec mode-config
chain=srcnat action=src-nat to-addresses=192.168.77.254 dst-address=10.5.8.0/24 src-address-list=local-RW

仅允许 IPsec 封装的流量

在某些场景中,出于安全原因,如果入站/出站数据包未加密,你希望丢弃对特定网络的访问。例如,如果你有 L2TP/IPsec 设置,你希望丢弃未加密的 L2TP 连接尝试。

你可以通过以下几种方式实现:

  • 在防火墙中使用 IPsec policy 匹配器。
  • 使用 action 设置为 drop 且优先级较低的通用 IPsec policy(可用于生成动态 policy 的 Road Warrior 设置)。
  • 在 mangle 中设置 DSCP 或优先级,并在解封装后在防火墙中匹配相同的值。

IPsec policy 匹配器

让我们设置一个 IPsec policy 匹配器,以接受匹配任何 IPsec policy 的所有数据包并丢弃其余数据包:

add chain=input comment="ipsec policy matcher" in-interface=WAN ipsec-policy=in,ipsec
add action=drop chain=input comment="drop all" in-interface=WAN log=yes

IPsec policy 匹配器接受两个参数 direction, policy。本示例使用 incoming direction 和 IPsec policy。IPsec policy 选项允许你在解封装后检查数据包,例如,仅允许来自特定源地址的 GRE 封装数据包并丢弃其余数据包:

add chain=input comment="ipsec policy matcher" in-interface=WAN ipsec-policy=in,ipsec protocol=gre src-address=192.168.33.1
add action=drop chain=input comment="drop all" in-interface=WAN log=yes

对于 L2TP,规则集为:

add chain=input comment="ipsec policy matcher" in-interface=WAN ipsec-policy=in,ipsec protocol=udp dst-port=1701
add action=drop chain=input protocol=udp dst-port=1701 comment="drop l2tp" in-interface=WAN log=yes

使用通用 IPsec policy

此方法通过添加一条 action 为 drop 的默认 policy 来起作用。本示例假设在公网地址 1.1.1.1 上有一个 L2TP/IPsec 服务器,并丢弃所有未加密的 L2TP:

/ip/ipsec/policy
add src-address=1.1.1.1 dst-address=0.0.0.0/0 sa-src-address=1.1.1.1 protocol=udp src-port=1701 tunnel=yes action=discard

路由器会丢弃任何未加密的 L2TP 入站流量,但在 L2TP/IPsec 连接成功后,会创建一个优先级高于默认静态规则的动态 policy,匹配该动态规则的数据包可以被转发。

警告

Policy 顺序很重要!为此,请确保静态 drop policy 位于动态 policy 之下。如有必要,请将其移动到 policy 模板下方。

[admin@rack2_10g1] /ip/ipsec/policy> print
Flags: T - template, X - disabled, D - dynamic, I - inactive, * - default
 0 T * group=default src-address=::/0 dst-address=::/0 protocol=all
proposal=default template=yes

 1 D src-address=1.1.1.1/32 src-port=1701 dst-address=10.5.130.71/32
dst-port=any protocol=udp action=encrypt level=require
ipsec-protocols=esp tunnel=no sa-src-address=1.1.1.1
sa-dst-address=10.5.130.71

 2 src-address=1.1.1.1/32 src-port=1701 dst-address=0.0.0.0/0
dst-port=any protocol=udp action=discard level=unique
ipsec-protocols=esp tunnel=yes sa-src-address=1.1.1.1
sa-dst-address=0.0.0.0 proposal=default manual-sa=none

在 Peer 配置下手动指定 local-address 参数

使用不同的路由表

IPsec 与 RouterOS 中的任何其他服务一样,无论 Peer 配置使用什么 local-address 参数,都使用主路由表。你必须对 IKE 和 IPSec 流量都应用路由标记。

考虑以下示例。存在两条默认路由 —— 一条在主路由表中,另一条在路由表 "backup" 中。你必须将 backup 链路用于 IPsec 站点到站点隧道。

[admin@pair_r1] > /ip/route/print detail 
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit 
 0 A S dst-address=0.0.0.0/0 gateway=10.155.107.1 gateway-status=10.155.107.1 reachable via ether1 distance=1 scope=30 target-scope=10 routing-mark=backup 

 1 A S dst-address=0.0.0.0/0 gateway=172.22.2.115 gateway-status=172.22.2.115 reachable via ether2 distance=1 scope=30 target-scope=10 

 2 ADC dst-address=10.155.107.0/25 pref-src=10.155.107.8 gateway=ether1 gateway-status=ether1 reachable distance=0 scope=10 

 3 ADC dst-address=172.22.2.0/24 pref-src=172.22.2.114 gateway=ether2 gateway-status=ether2 reachable distance=0 scope=10 

 4 ADC dst-address=192.168.1.0/24 pref-src=192.168.1.1 gateway=bridge-local gateway-status=ether2 reachable distance=0 scope=10 

[admin@pair_r1] > /ip/firewall/nat/print 
Flags: X - disabled, I - invalid, D - dynamic 
 0 chain=srcnat action=masquerade out-interface=ether1 log=no log-prefix="" 

 1 chain=srcnat action=masquerade out-interface=ether2 log=no log-prefix="" 

IPsec peer 和 policy 配置,以及 IPsec 隧道流量的 NAT bypass 规则,都使用 backup 链路的源地址创建。

/ip/ipsec/peer
add address=10.155.130.136/32 local-address=10.155.107.8 secret=test
/ip/ipsec/policy
add sa-src-address=10.155.107.8 src-address=192.168.1.0/24 dst-address=172.16.0.0/24 sa-dst-address=10.155.130.136 tunnel=yes
/ip/firewall/nat
add action=accept chain=srcnat src-address=192.168.1.0/24 dst-address=172.16.0.0/24 place-before=0

日志显示 "phase1 negotiation failed due to time up" 错误。这是因为 IPsec 尝试使用主路由表并携带不正确的源地址来访问远程 peer。你必须使用 Mangle 标记 UDP/500、UDP/4500 和 ipsec-esp 数据包:

/ip/firewall/mangle
add action=mark-connection chain=output connection-mark=no-mark dst-address=10.155.130.136 dst-port=500,4500 new-connection-mark=ipsec passthrough=yes protocol=udp
add action=mark-connection chain=output connection-mark=no-mark dst-address=10.155.130.136 new-connection-mark=ipsec passthrough=yes protocol=ipsec-esp
add action=mark-routing chain=output connection-mark=ipsec new-routing-mark=backup passthrough=no

使用同一路由表配合多个 IP 地址

考虑以下示例。公网接口上存在来自同一子网的多个 IP 地址。在 out-interface 上配置了 Masquerade 规则。你必须显式使用其中一个 IP 地址。

[admin@pair_r1] > /ip/address/print 
Flags: X - disabled, I - invalid, D - dynamic 
# ADDRESS NETWORK INTERFACE
0 192.168.1.1/24 192.168.1.0 bridge-local
1 172.22.2.1/24 172.22.2.0 ether1
2 172.22.2.2/24 172.22.2.0 ether1
3 172.22.2.3/24 172.22.2.0 ether1

[admin@pair_r1] > /ip/route/print 
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit 
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
1 A S 0.0.0.0/0 172.22.2.115 1
3 ADC 172.22.2.0/24 172.22.2.1 ether1 0
4 ADC 192.168.1.0/24 192.168.1.1 bridge-local 0

[admin@pair_r1] /ip/firewall/nat> print 
Flags: X - disabled, I - invalid, D - dynamic 
 0 chain=srcnat action=masquerade out-interface=ether1 log=no log-prefix="" 

IPsec peer 和 policy 配置使用其中一个公网 IP 地址创建。

/ip/ipsec/peer
add address=10.155.130.136/32 local-address=172.22.2.3 secret=test
/ip/ipsec/policy
add sa-src-address=172.22.2.3 src-address=192.168.1.0/24 dst-address=172.16.0.0/24 sa-dst-address=10.155.130.136 tunnel=yes
/ip/firewall/nat
add action=accept chain=srcnat src-address=192.168.1.0/24 dst-address=172.16.0.0/24 place-before=0

Phase 1 连接使用的源地址与指定的不同,日志中会显示 "phase1 negotiation failed due to time up" 错误。这是因为 masquerade 正在将连接的源地址改为匹配已连接路由的 pref-src 地址。请将来自该公网 IP 地址的连接排除在 masquerade 之外。

/ip/firewall/nat
add action=accept chain=srcnat protocol=udp src-port=500,4500 place-before=0

应用示例

站点到站点 IPsec (IKEv1) 隧道

考虑如下所示的设置。两个远程办公室路由器连接到互联网,办公室工作站位于 NAT 之后。每个办公室都有自己的本地子网,Office1 为 10.1.202.0/24,Office2 为 10.1.101.0/24。两个远程办公室都需要到路由器后面本地网络的安全隧道。

站点 1 配置

首先创建新的 Phase 1 配置文件和 Phase 2 proposal 条目,使用适合你需求的更强或更弱的加密参数。你应该为每个菜单创建单独的条目,以便它们在每个 peer 上都是唯一的,便于以后调整任何设置。这些参数必须在两个站点之间匹配,否则连接无法建立。

/ip/ipsec/profile
add dh-group=modp2048 enc-algorithm=aes-128 name=ike1-site2
/ip/ipsec/proposal
add enc-algorithms=aes-128-cbc name=ike1-site2 pfs-group=modp2048

接着配置 peer。指定远程路由器的地址。此地址应可通过 UDP/500 和 UDP/4500 端口访问,因此请确保针对路由器防火墙采取了适当的措施。指定此 peer 的名称以及新创建的 profile。

/ip/ipsec/peer
add address=192.168.80.1/32 name=ike1-site2 profile=ike1-site2

下一步是创建 identity。对于基本的预共享密钥保护隧道,你只需设置一个强密钥以及此 identity 所适用的 peer。

/ip/ipsec/identity
add peer=ike1-site2 secret=thisisnotasecurepsk

危险

如果安全性很重要,请考虑使用 IKEv2 和不同的 auth-method。 最后,创建一条 policy,控制应在哪些网络/主机之间加密流量。

/ip/ipsec/policy
add src-address=10.1.202.0/24 src-port=any dst-address=10.1.101.0/24 dst-port=any tunnel=yes action=encrypt proposal=ike1-site2 peer=ike1-site2

站点 2 配置

Office 2 的配置与 Office 1 几乎相同,只是 IP 地址配置不同。首先创建新的 Phase 1 配置文件和 Phase 2 proposal 条目:

/ip/ipsec/profile
add dh-group=modp2048 enc-algorithm=aes-128 name=ike1-site1
/ip/ipsec/proposal
add enc-algorithms=aes-128-cbc name=ike1-site1 pfs-group=modp2048

接下来是 peer 和 identity:

/ip/ipsec/peer
add address=192.168.90.1/32 name=ike1-site1 profile=ike1-site1
/ip/ipsec/identity
add peer=ike1-site1 secret=thisisnotasecurepsk

完成后,创建一条 policy:

/ip/ipsec/policy
add src-address=10.1.101.0/24 src-port=any dst-address=10.1.202.0/24 dst-port=any tunnel=yes action=encrypt proposal=ike1-site1 peer=ike1-site1

此时,隧道应该已建立,并且两台路由器上都应创建两个 IPsec Security Associations:

/ip/ipsec
active-peers print
installed-sa print

NAT 和 Fasttrack 绕过

此时如果你尝试通过 IPsec 隧道发送流量,它不会工作;数据包会丢失。这是因为两台路由器都有 NAT 规则(masquerade),会在数据包被加密之前更改源地址。路由器无法加密该数据包,因为源地址与 policy 配置中指定的地址不匹配。更多信息请参见 IPsec 数据包流示例。

要解决此问题,你需要设置一条 IP/Firewall/NAT bypass 规则。

Office 1 路由器:

/ip/firewall/nat
add chain=srcnat action=accept place-before=0 src-address=10.1.202.0/24 dst-address=10.1.101.0/24

Office 2 路由器:

/ip/firewall/nat
add chain=srcnat action=accept place-before=0 src-address=10.1.101.0/24 dst-address=10.1.202.0/24

警告

如果你在添加 NAT bypass 规则之前曾尝试建立 IP 连接,则必须从连接表中清除现有连接,或重启两台路由器。 确保 bypass 规则位于所有其他 NAT 规则之上。

另一个问题是,如果你启用了 IP/Fasttrack,数据包会绕过 IPsec policy。因此你需要在 FastTrack 之前添加一条 accept 规则。

/ip/firewall/filter
add chain=forward action=accept place-before=1
src-address=10.1.101.0/24 dst-address=10.1.202.0/24 connection-state=established,related
add chain=forward action=accept place-before=1
src-address=10.1.202.0/24 dst-address=10.1.101.0/24 connection-state=established,related

但是,如果有相当数量的隧道且每个隧道上有大量流量,这会给路由器的 CPU 增加显著负载。

解决方案是使用 IP/Firewall/Raw 绕过连接跟踪,从而无需上面列出的 filter 规则,并将 CPU 负载降低约 30%。

/ip/firewall/raw
add action=notrack chain=prerouting src-address=10.1.101.0/24 dst-address=10.1.202.0/24
add action=notrack chain=prerouting src-address=10.1.202.0/24 dst-address=10.1.101.0/24

使用 DNS 的基于 IPsec (IKEv2) 的站点到站点 GRE 隧道

本示例说明当其中一个或两个站点没有静态 IP 地址时,如何在两台 RouterOS 设备之间建立安全且加密的 GRE 隧道。在此配置可行之前,你必须为其中一台充当 responder(服务器)的设备分配 DNS 名称。为简单起见,本示例使用 RouterOS 内置的 DDNS 服务 IP/Cloud。

站点 1(服务器)配置

此侧监听入站连接并充当 responder。使用 mode config 为第二个站点提供 IP 地址。首先,创建一个 loopback(空白)bridge 并为其分配一个 IP 地址,稍后将用于建立 GRE 隧道。

/interface/bridge 
add name=loopback
/ip/address
add address=192.168.99.1 interface=loopback

继续配置 IPsec,首先创建新的 Phase 1 配置文件和 Phase 2 proposal 条目,使用适合你需求的更强或更弱的加密参数。此配置示例监听所有入站 IKEv2 请求,这意味着该 profile 配置与所有其他配置(例如 RoadWarrior)共享。

/ip/ipsec/profile
add dh-group=ecp256,modp2048,modp1024 enc-algorithm=aes-256,aes-192,aes-128 name=ike2
/ip/ipsec/proposal
add auth-algorithms=null enc-algorithms=aes-128-gcm name=ike2-gre pfs-group=none

接下来,创建一个新的 mode config 条目,设置 responder=yes。这为另一个站点提供 IP 配置,以及用于 policy 生成的主机(loopback 地址)。

/ip/ipsec/mode-config
add address=192.168.99.2 address-prefix-length=32 name=ike2-gre split-include=192.168.99.1/32 system-dns=no

你应该创建一个新的 policy 组,将此配置与任何现有或未来的 IPsec 配置区分开。

/ip/ipsec/policy/group
add name=ike2-gre

现在设置一个新的 policy 模板,匹配远程 peer 的新动态地址和 loopback 地址。

/ip/ipsec/policy
add dst-address=192.168.99.2/32 group=ike2-gre proposal=ike2-gre src-address=192.168.99.1/32 template=yes

下一步是创建一个 peer 配置,监听所有 IKEv2 请求。如果你已有此类条目,可以跳过此步骤。

/ip/ipsec/peer
add exchange-mode=ike2 name=ike2 passive=yes profile=ike2

最后,设置一个 identity,通过使用特定密钥的预共享密钥认证来匹配远程 peer。

/ip/ipsec/identity
add generate-policy=port-strict mode-config=ike2-gre peer=ike2 policy-template-group=ike2-gre secret=test

服务器侧现已配置完成并正在监听所有 IKEv2 请求。确保防火墙没有阻止 UDP/4500 端口。

最后一步是创建 GRE 接口本身。这也可以在稍后从客户端侧建立 IPsec 连接时完成。

/interface/gre
add local-address=192.168.99.1 name=gre-tunnel1 remote-address=192.168.99.2

配置 IP 地址和通过 GRE 接口到远程网络的路由。

/ip/address
add address=172.16.1.1/30 interface=gre-tunnel1
/ip/route
add dst-address=10.1.202.0/24 gateway=172.16.1.2

站点 2(客户端)配置

与服务器配置类似,首先创建新的 Phase 1 配置文件和 Phase 2 proposal 配置。由于此站点是 initiator,你可以使用更具体的 profile 配置来控制确切使用哪些加密参数,只需确保它们与服务器侧配置的有重叠即可。

/ip/ipsec/profile
add dh-group=ecp256 enc-algorithm=aes-256 name=ike2-gre
/ip/ipsec/proposal
add auth-algorithms=null enc-algorithms=aes-128-gcm name=ike2-gre pfs-group=none

接下来,创建一个新的 mode config 条目,设置 responder=no。这确保 peer 向服务器请求 IP 和拆分网络配置。

/ip/ipsec/mode-config
add name=ike2-gre responder=no

你还应该创建一个新的 policy 组,将此配置与任何现有或未来的 IPsec 配置区分开。

/ip/ipsec/policy/group
add name=ike2-gre

也在客户端侧创建一个新的 policy 模板。

/ip/ipsec/policy
add dst-address=192.168.99.1/32 group=ike2-gre proposal=ike2-gre src-address=192.168.99.2/32 template=yes

继续进行 peer 配置。在 address 参数下指定服务器的 DNS 名称。你也可以使用 IP 地址。

/ip/ipsec/peer
add address=n.mynetname.net exchange-mode=ike2 name=p1.ez profile=ike2-gre

最后,为新建的 peer 创建一个 identity。

/ip/ipsec/identity
add generate-policy=port-strict mode-config=ike2-gre peer=p1.ez policy-template-group=ike2-gre secret=test

如果一切配置正确,会出现一条新的动态 policy。

/ip/ipsec/policy/print 
Flags: T - template, X - disabled, D - dynamic, I - invalid, A - active, * - default 
 0 T * group=default src-address=::/0 dst-address=::/0 protocol=all proposal=default template=yes

 1 T group=ike2-gre src-address=192.168.99.2/32 dst-address=192.168.99.1/32 protocol=all proposal=ike2-gre template=yes

 2 DA src-address=192.168.99.2/32 src-port=any dst-address=192.168.99.1/32 dst-port=any protocol=all action=encrypt level=unique ipsec-protocols=esp 
 tunnel=yes sa-src-address=192.168.90.1 sa-dst-address=(current IP of n.mynetname.net) proposal=ike2-gre ph2-count=1 

现在两个站点之间已建立一条安全隧道,它加密 192.168.99.2 <=> 192.168.99.1 地址之间的所有流量。使用这些地址创建 GRE 隧道。

/interface/gre
add local-address=192.168.99.2 name=gre-tunnel1 remote-address=192.168.99.1

配置 IP 地址和通过 GRE 接口到远程网络的路由。

/ip/address
add address=172.16.1.2/30 interface=gre-tunnel1
/ip/route
add dst-address=10.1.101.0/24 gateway=172.16.1.1

使用 IKEv2 和 RSA 认证的 Road Warrior 设置

本示例说明如何在连接到互联网的设备(road warrior 客户端)与运行 RouterOS 充当服务器的设备之间建立安全的 IPsec 连接。

RouterOS 服务器配置

在配置 IPsec 之前,你必须设置证书。你可以使用单独的 Certificate Authority 进行证书管理;不过在本示例中,自签名证书在 RouterOS System/Certificates 菜单中生成。要将各种设备连接到服务器,必须满足一些证书要求:

  • common name 必须包含服务器的 IP 或 DNS 名称。
  • SAN (subject alternative name) 必须具有服务器的 IP 或 DNS 名称。
  • EKU (extended key usage) 需要 tls-server 和 tls-client。

考虑到上述要求,生成 CA 和服务器证书:

/certificate
add common-name=ca name=ca
sign ca ca-crl-host=2.2.2.2
add common-name=2.2.2.2 subject-alt-name=IP:2.2.2.2 key-usage=tls-server name=server1
sign server1 ca=ca

在路由器上创建有效证书后,添加新的 Phase 1 配置文件和 Phase 2 proposal 条目,并设置 pfs-group=none:

/ip/ipsec/profile
add name=ike2
/ip/ipsec/proposal
add name=ike2 pfs-group=none

Mode config 用于从 IP/Pools 分配地址:

/ip/pool
add name=ike2-pool ranges=192.168.77.2-192.168.77.254
/ip/ipsec/mode-config
add address-pool=ike2-pool address-prefix-length=32 name=ike2-conf

由于 policy 模板必须调整以仅允许特定的网络 policy,你应该创建单独的 policy 组和模板。

/ip/ipsec/policy/group
add name=ike2-policies
/ip/ipsec/policy
add dst-address=192.168.77.0/24 group=ike2-policies proposal=ike2 src-address=0.0.0.0/0 template=yes

创建一个新的 IPsec peer 条目,监听所有入站 IKEv2 请求。

/ip/ipsec/peer
add exchange-mode=ike2 name=ike2 passive=yes profile=ike2
Identity 配置

identity 菜单允许匹配特定的远程 peer 并为每个 peer 分配不同的配置。首先,创建一个默认 identity,接受所有 peer,但使用其对端证书验证 peer 的身份。

/ip/ipsec/identity
add auth-method=digital-signature certificate=server1 generate-policy=port-strict mode-config=ike2-conf peer=ike2 policy-template-group=ike2-policies

警告

如果 peer 的 ID (ID_i) 与其发送的证书不匹配,identity 查找会失败。请参见 identities 部分中的 remote-id。 例如,要为使用证书 "rw-client1" 向服务器认证的用户 "A" 分配不同的 mode config,首先确保已创建并准备好供该特定用户使用的新 mode config。

/ip/ipsec/mode-config
add address=192.168.66.2 address-prefix-length=32 name=usr_A split-include=192.168.55.0/24 system-dns=no

使用 match-by=certificate 为用户 "A" 应用此配置,并通过 remote-certificate 指定证书。

/ip/ipsec/identity
add auth-method=digital-signature certificate=server1 generate-policy=port-strict match-by=certificate mode-config=usr_A peer=ike2 policy-template-group=ike2-policies remote-certificate=rw-client1
(可选)拆分隧道配置

拆分隧道是一种允许 road warrior 客户端仅访问特定的受保护网络,同时根据其内部路由表发送其余流量(而不是通过隧道发送所有流量)的方法。要配置拆分隧道,请更改 mode config 参数。

例如,仅允许 road warrior 客户端访问 10.5.8.0/24 网络。

/ip/ipsec/mode-conf
set [find name="rw-conf"] split-include=10.5.8.0/24

你也可以发送特定的 DNS 服务器供客户端使用。默认情况下使用 system-dns=yes,它会发送路由器自身在 IP/DNS 中配置的 DNS 服务器。使用 static-dns 参数强制客户端使用不同的 DNS 服务器。

/ip/ipsec/mode-conf
set [find name="rw-conf"] system-dns=no static-dns=10.5.8.1

虽然可以调整 IPsec policy 模板以仅允许 road warrior 客户端为 split-include 参数配置的网络生成 policy,但这会与不同厂商的实现产生兼容性问题(参见已知限制)。与其调整 policy 模板,不如在 IP/Firewall/Filter 中允许访问受保护网络并丢弃其他所有内容。

/ip/firewall/filter
add action=drop chain=forward src-address=192.168.77.0/24 dst-address=!10.5.8.0/24

警告

拆分网络不是一种安全措施。客户端(initiator)仍然可以请求不同的 Phase 2 traffic selector。

生成客户端证书

要为客户端生成新证书并使用之前创建的 CA 对其进行签名。

/certificate
add common-name=rw-client1 name=rw-client1 key-usage=tls-client
sign rw-client1 ca=ca

大多数客户端实现都接受 PKCS12 格式,因此在导出证书时,请确保指定 PKCS12。

/certificate
export-certificate rw-client1 export-passphrase=1234567890 type=pkcs12

此时路由器 System/File 部分中会出现一个名为 cert_export_rw-client1.p12 的文件。此文件应安全地传输到客户端的设备。

PKCS12 捆绑包中也包含 CA 证书,但某些厂商不会安装此 CA,因此必须以 PEM 格式单独导出自签名 CA 证书。

/certificate
export-certificate ca type=pem

此时路由器 System/File 部分中会出现一个名为 cert_export_ca.crt 的文件。此文件也应安全地传输到客户端的设备。

PEM 是另一种证书格式,用于不支持 PKCS12 的客户端软件。原理大致相同。

/certificate
export-certificate ca
export-certificate rw-client1 export-passphrase=1234567890

此时路由器 Files 部分中会出现三个文件:cert_export_ca.crt、cert_export_rw-client1.crt 和 cert_export_rw-client1.key,它们应安全地传输到客户端设备。

已知限制

以下是流行客户端软件 IKEv2 实现的已知限制列表。

  • Windows 总是忽略 split-include 接收的网络,并请求目标为 0.0.0.0/0 (TSr) 的 policy。当 IPsec-SA 生成后,Windows 请求 DHCP option 249,RouterOS 会自动以配置的 split-include 网络进行响应。

  • Apple macOS 和 iOS 都只接受第一个 split-include 网络。

  • Apple macOS 和 iOS 都仅在使用了 0.0.0.0/0 split-include 时才使用 system-dns 和 static-dns 参数中的 DNS 服务器。

  • 虽然某些实现可以为 phase 2 使用不同的 PFS 组,但请使用 proposals 下的 pfs-group=none,以避免任何兼容性问题。

RouterOS 客户端配置

在 RouterOS 中导入 PKCS12 格式证书。

/certificate/import file-name=cert_export_RouterOS_client.p12 passphrase=1234567890

自签名 CA 证书和客户端证书现在会出现在 Certificate 菜单中。找到客户端证书的名称。

/certificate/print

cert_export_RouterOS_client.p12_0 是客户端证书。

你应该创建单独的 Phase 1 配置文件和 Phase 2 proposal 配置,以免干扰任何现有的 IPsec 配置。

/ip/ipsec/profile
add name=ike2-rw
/ip/ipsec/proposal
add name=ike2-rw pfs-group=none

虽然你可以使用默认 policy 模板来生成 policy,但请创建新的 policy 组和模板,以便将此配置与任何其他 IPsec 配置区分开。

/ip/ipsec/policy/group
add name=ike2-rw
/ip/ipsec/policy
add group=ike2-rw proposal=ike2-rw template=yes

创建一个新的 mode config 条目,设置 responder=no,以向服务器请求配置参数。

/ip/ipsec/mode-config
add name=ike2-rw responder=no

最后,创建 peer 和 identity 配置。

/ip/ipsec/peer
add address=2.2.2.2/32 exchange-mode=ike2 name=ike2-rw-client
/ip/ipsec/identity
add auth-method=digital-signature certificate=cert_export_RouterOS_client.p12_0 generate-policy=port-strict mode-config=ike2-rw peer=ike2-rw-client policy-template-group=ike2-rw

验证连接是否成功建立。

/ip/ipsec
active-peers print
installed-sa print
启用动态源 NAT 规则生成

生成的动态 policy 表明,只有具有特定源地址(由 mode config 接收)的流量才会通过隧道发送。在大多数情况下,路由器需要将特定设备或网络路由通过隧道。在这种情况下,使用源 NAT 将数据包的源地址改为与 mode config 地址匹配。由于 mode config 地址是动态的,你无法创建静态源 NAT 规则。在 RouterOS 中,你可以为 mode config 客户端生成动态源 NAT 规则。

例如,路由器后面有一个本地网络 192.168.88.0/24,该网络的所有流量都应通过隧道发送。首先,创建一个由该本地网络组成的 IP/Firewall/Address list。

/ip/firewall/address-list
add address=192.168.88.0/24 list=local

完成后,将新创建的 IP/Firewall/Address list 分配给 mode config 配置。

/ip/ipsec/mode-config
set [ find name=ike2-rw ] src-address-list=local

验证隧道建立时是否动态生成了正确的源 NAT 规则。

[admin@MikroTik] > /ip/firewall/nat/print 
Flags: X - disabled, I - invalid, D - dynamic 
 0 D ;;; ipsec mode-config
chain=srcnat action=src-nat to-addresses=192.168.77.254 src-address-list=local dst-address-list=!local

危险

确保动态 mode config 地址不属于本地网络的一部分。

Windows 客户端配置

在 Windows 计算机上打开 PKCS12 格式的证书文件。按照说明安装证书。选择 Local Machine 存储位置。 现在你可以继续进入 Network and Internet settings -> VPN 并添加新配置。填写 Connection name、Server name 或 address 参数。在 VPN type 下选择 IKEv2。完成后,选择 "Use machine certificates"。这可以在 Network and Sharing Center 中,通过单击 VPN 连接的 Properties 菜单完成。该设置位于 Security 选项卡下。

Windows 10 与以下 Phase 1(profiles)和 Phase 2(proposals)proposal 集兼容:

Phase 1
哈希算法加密算法DH 组
SHA13DESmodp1024
SHA2563DESmodp1024
SHA1AES-128-CBCmodp1024
SHA256AES-128-CBCmodp1024
SHA1AES-192-CBCmodp1024
SHA256AES-192-CBCmodp1024
SHA1AES-256-CBCmodp1024
SHA256AES-256-CBCmodp1024
SHA1AES-128-GCMmodp1024
SHA256AES-128-GCMmodp1024
SHA1AES-256-GCMmodp1024
SHA256AES-256-GCMmodp1024
Phase 2
哈希算法加密算法PFS 组
SHA1AES-256-CBCnone
SHA1AES-128-CBCnone
SHA13DESnone
SHA1DESnone
SHA1nonenone

macOS 客户端配置

在 macOS 计算机上打开 PKCS12 格式的证书文件,并将证书安装到 "System" 钥匙串中。由于 CA 证书是自签名的,请手动将其标记为受信任。在 macOS Keychain Access 应用的 System 选项卡下找到该证书,并将其标记为 Always Trust。

现在你可以继续进入 System Preferences -> Network,并通过单击 + 按钮添加新配置。选择 Interface: VPN、VPN Type: IKEv2 并为连接命名。Remote ID 必须设置为与服务器证书的 common-name 或 subjAltName 相等。Local ID 可以留空。在 Authentication Settings 下选择 None 并选择客户端证书。现在你可以测试连通性。

macOS 与以下 Phase 1(profiles)和 Phase 2(proposals)proposal 集兼容:

Phase 1
哈希算法加密算法DH 组
SHA256AES-256-CBCmodp2048
SHA256AES-256-CBCecp256
SHA256AES-256-CBCmodp1536
SHA1AES-128-CBCmodp1024
SHA13DESmodp1024
Phase 2
哈希算法加密算法PFS 组
SHA256AES-256-CBCnone
SHA1AES-128-CBCnone
SHA13DESnone

iOS 客户端配置

通常,PKCS12 捆绑包中也包含 CA 证书,但 iOS 不会安装此 CA,因此必须以 PEM 格式单独安装自签名 CA 证书。在 iOS 设备上打开这些文件,并按照说明安装两个证书。在 iOS 设备上将自签名 CA 证书标记为受信任。这可以在 Settings -> General -> About -> Certificate Trust Settings 菜单中完成。完成后,在 Settings -> General -> Profiles 菜单下检查两个证书是否都标记为 "verified"。

现在你可以继续进入 Settings -> General -> VPN 菜单并添加新配置。Remote ID 必须设置为与服务器证书的 common-name 或 subjAltName 相等。Local ID 可以留空。

iOS 与以下 Phase 1(profiles)和 Phase 2(proposals)proposal 集兼容:

Phase 1
哈希算法加密算法DH 组
SHA256AES-256-CBCmodp2048
SHA256AES-256-CBCecp256
SHA256AES-256-CBCmodp1536
SHA1AES-128-CBCmodp1024
SHA13DESmodp1024
Phase 2
哈希算法加密算法PFS 组
SHA256AES-256-CBCnone
SHA1AES-128-CBCnone
SHA13DESnone

警告

如果你通过 WiFi 连接到 VPN,iOS 设备可能会进入睡眠模式并与网络断开连接。

Android (strongSwan) 客户端配置

Android 没有原生 IKEv2 支持,但你可以使用 Google Play Store 中的 strongSwan,它将 IKEv2 带到 Android。StrongSwan 接受 PKCS12 格式的证书,因此在 strongSwan 中设置 VPN 连接之前,请将 PKCS12 捆绑包下载到你的 Android 设备。完成后,在 strongSwan 中创建新的 VPN 配置文件,输入服务器 IP,并选择 "IKEv2 Certificate" 作为 VPN Type。选择 User certificate 时,按 Install 并按照证书提取流程指定 PKCS12 捆绑包。保存配置文件,并通过按下 VPN 配置文件测试连接。

你可以通过勾选 "Show advanced settings" 复选框在 strongSwan 中指定自定义加密设置。默认情况下,StrongSwan 与以下 Phase 1(profiles)和 Phase 2(proposals)proposal 集兼容:

Phase 1
哈希算法加密算法DH 组
SHA*AES-*-CBCmodp2048
SHA*AES-*-CBCecp256
SHA*AES-*-CBCecp384
SHA*AES-*-CBCecp521
SHA*AES-*-CBCmodp3072
SHA*AES-*-CBCmodp4096
SHA*AES-*-CBCmodp6144
SHA*AES-*-CBCmodp8192
SHA*AES-*-GCMmodp2048
SHA*AES-*-GCMecp256
SHA*AES-*-GCMecp384
SHA*AES-*-GCMecp521
SHA*AES-*-GCMmodp3072
SHA*AES-*-GCMmodp4096
SHA*AES-*-GCMmodp6144
SHA*AES-*-GCMmodp8192
Phase 2
哈希算法加密算法PFS 组
noneAES-256-GCMnone
noneAES-128-GCMnone
SHA256AES-256-CBCnone
SHA512AES-256-CBCnone
SHA1AES-256-CBCnone
SHA256AES-192-CBCnone
SHA512AES-192-CBCnone
SHA1AES-192-CBCnone
SHA256AES-128-CBCnone
SHA512AES-128-CBCnone
SHA1AES-128-CBCnone

Linux (strongSwan) 客户端配置

下载 PKCS12 证书捆绑包并将其移动到 /etc/ipsec.d/private 目录。

将导出私钥的 passphrase 添加到 /etc/ipsec.secrets 文件中,其中 "strongSwan_client.p12" 是文件名,"1234567890" 是 passphrase。

: P12 strongSwan_client.p12 "1234567890"

向 /etc/ipsec.conf 文件添加新连接

conn "ikev2"
keyexchange=ikev2
ike=aes128-sha1-modp2048
esp=aes128-sha1
leftsourceip=%modeconfig
leftcert=strongSwan_client.p12
leftfirewall=yes
right=2.2.2.2
rightid="CN=2.2.2.2"
rightsubnet=0.0.0.0/0
auto=add

现在你可以重启(或启动)ipsec 守护进程并初始化连接。

ipsec restart
ipsec up ikev2

使用 IKEv2 和由 User Manager 处理的 EAP-MSCHAPv2 认证的 Road Warrior 设置(RouterOS v7)

本示例说明如何在连接到互联网的设备(road warrior 客户端)与运行 RouterOS 充当 IKEv2 服务器和 User Manager 的设备之间建立安全的 IPsec 连接。你可以在网络中的单独设备上运行 User Manager,但在本示例中,User Manager 和 IKEv2 服务器都在同一台设备(Office)上配置。

RouterOS 服务器配置

前提条件

要使此设置正常工作,必须满足以下先决条件:

  1. 路由器的 IP 地址必须具有有效的公共 DNS 记录 —— IP Cloud 可以提供此记录。
  2. 必须可以通过互联网经 TCP/80 端口访问路由器 —— 如果服务器位于 NAT 之后,请配置端口转发。
  3. 必须安装 User Manager 软件包。
生成 Let's Encrypt 证书

EAP-MSCHAPv2 认证需要 TLS 握手,因此服务器必须具有客户端可以验证的证书。为简化此步骤,请使用大多数操作系统无需用户干预即可验证的 Let's Encrypt 证书。要生成证书,请在 Certificates 菜单下启用 SSL 证书。默认情况下,该命令使用 IP Cloud 提供的动态 DNS 记录,但也可以指定自定义 DNS 名称。DNS 记录应指向该路由器。

/certificate/enable-ssl-certificate

如果证书生成成功,Let's Encrypt 证书会显示在 Certificates 菜单下并已安装。

/certificate/print detail where name~"letsencrypt"
配置 User Manager

首先,允许来自 localhost(路由器自身)的 RADIUS 请求:

/user-manager/router
add address=127.0.0.1 comment=localhost name=local shared-secret=test

启用 User Manager 并指定 Let's Encrypt 证书(将证书名称替换为你设备上安装的证书),用于对用户进行身份验证。

/user-manager
set certificate="letsencrypt_2021-04-09T07:10:55Z" enabled=yes

最后添加用户及其凭据,供客户端用于向服务器进行身份验证。

/user-manager/user
add name=user1 password=password
配置 RADIUS 客户端

为了让路由器使用 RADIUS 服务器进行用户认证,你必须添加一个新的 RADIUS 客户端,其共享密钥与 User Manager 上已配置的相同。

/radius
add address=127.0.0.1 secret=test service=ipsec
IPsec (IKEv2) 服务器配置

添加新的 Phase 1 配置文件和 Phase 2 proposal 条目,并设置 pfs-group=none:

/ip/ipsec/profile
add name=ike2
/ip/ipsec/proposal
add name=ike2 pfs-group=none

Mode config 用于从 IP/Pools 分配地址。

/ip/pool
add name=ike2-pool ranges=192.168.77.2-192.168.77.254
/ip/ipsec/mode-config
add address-pool=ike2-pool address-prefix-length=32 name=ike2-conf

由于 policy 模板必须调整以仅允许特定的网络 policy,你应该创建单独的 policy 组和模板。

/ip/ipsec/policy/group
add name=ike2-policies
/ip/ipsec/policy
add dst-address=192.168.77.0/24 group=ike2-policies proposal=ike2 src-address=0.0.0.0/0 template=yes

创建一个新的 IPsec peer 条目,监听所有入站 IKEv2 请求。

/ip/ipsec/peer
add exchange-mode=ike2 name=ike2 passive=yes profile=ike2

最后,创建一个新的 IPsec identity 条目,匹配所有尝试使用 EAP 认证的客户端。必须指定生成的 Let's Encrypt 证书。

/ip/ipsec/identity
add auth-method=eap-radius certificate="letsencrypt_2021-04-09T07:10:55Z" generate-policy=port-strict mode-config=ike2-conf peer=ike2 \
policy-template-group=ike2-policies
(可选)拆分隧道配置

拆分隧道是一种允许 road warrior 客户端仅访问特定的受保护网络,同时根据其内部路由表发送其余流量(而不是通过隧道发送所有流量)的方法。要配置拆分隧道,请更改 mode config 参数。

例如,仅允许 road warrior 客户端访问 10.5.8.0/24 网络。

/ip/ipsec/mode-conf
set [find name="rw-conf"] split-include=10.5.8.0/24

你也可以发送特定的 DNS 服务器供客户端使用。默认情况下使用 system-dns=yes,它会发送路由器自身在 IP/DNS 中配置的 DNS 服务器。使用 static-dns 参数强制客户端使用不同的 DNS 服务器。

/ip/ipsec/mode-conf
set [find name="rw-conf"] system-dns=no static-dns=10.5.8.1

警告

拆分网络不是一种安全措施。客户端(initiator)仍然可以请求不同的 Phase 2 traffic selector。

(可选)为用户分配静态 IP 地址

可以使用 RADIUS Framed-IP-Address 属性为任何用户分配静态 IP 地址。

/user-manager/user
set [find name="user1"] attributes=Framed-IP-Address:192.168.77.100 shared-users=1

危险

为避免任何冲突,该静态 IP 地址应排除在其他用户的 IP 池之外,并且应针对该特定用户将 shared-users 设置为 1。

(可选)计费配置

要跟踪每个用户的在线时长、下载和上传统计信息,可以使用 RADIUS accounting。默认情况下,IPsec 的 RADIUS accounting 已启用,但你应该配置 Interim Update 计时器,以定期向 RADIUS 服务器发送统计信息。如果路由器处理许多并发会话,请增大更新计时器以避免 CPU 使用率过高。

/ip/ipsec/settings
set interim-update=1m

基本 L2TP/IPsec 设置

本示例演示如何在 RouterOS 上轻松设置 L2TP/IPsec 服务器以用于 road warrior 连接(适用于 Windows、Android、iOS、macOS 以及其他厂商的 L2TP/IPsec 实现)。

RouterOS 服务器配置

第一步是启用 L2TP 服务器:

/interface/l2tp-server/server
set enabled=yes use-ipsec=required ipsec-secret=mySecret default-profile=default

use-ipsec 设置为 required,以确保仅接受 IPsec 封装的 L2TP 连接。

这会启用 L2TP 服务器并创建一个具有指定密钥的动态 IPsec peer。

[admin@MikroTik] /ip/ipsec/peer> print 
0 D address=0.0.0.0/0 local-address=0.0.0.0 passive=yes port=500 
auth-method=pre-shared-key secret="123" generate-policy=port-strict 
exchange-mode=main-l2tp send-initial-contact=yes nat-traversal=yes 
hash-algorithm=sha1 enc-algorithm=3des,aes-128,aes-192,aes-256 
dh-group=modp1024 lifetime=1d dpd-interval=2m dpd-maximum-failures=5 

警告

如果存在静态 IPsec peer 配置,必须格外小心。 下一步是创建 VPN 池并添加一些用户。

/ip/pool/add name=vpn-pool range=192.168.99.2-192.168.99.100

/ppp/profile
set default local-address=192.168.99.1 remote-address=vpn-pool

/ppp/secret
add name=user1 password=123
add name=user2 password=234

现在路由器已准备好接受 L2TP/IPsec 客户端连接。

RouterOS 客户端配置

要让 RouterOS 作为 L2TP/IPsec 客户端工作,只需添加一个新的 L2TP 客户端即可。

/interface/l2tp-client
add connect-to=1.1.1.1 disabled=no ipsec-secret=mySecret name=l2tp-out1 \
password=123 use-ipsec=yes user=user1

这会自动创建动态 IPsec peer 和 policy 配置。

故障排除/FAQ

Phase 1 获取有效 proposal 失败

[admin@MikroTik] /log> print
(..)
17:12:32 ipsec,error no suitable proposal found. 
17:12:32 ipsec,error 10.5.107.112 failed to get valid proposal. 
17:12:32 ipsec,error 10.5.107.112 failed to pre-process ph1 packet (side: 1, status 1). 
17:12:32 ipsec,error 10.5.107.112 phase1 negotiation failed. 
(..)

Peer 无法协商加密参数,导致连接中断。要解决此问题,请启用 IPSec 调试日志,查明远程 peer 提议了哪些参数,并相应地调整配置。

[admin@MikroTik] /system/logging> add topics=ipsec,!debug
[admin@MikroTik] /log> print
(..)
17:21:08 ipsec rejected hashtype: DB(prop#1:trns#1):Peer(prop#1:trns#1) = MD5:SHA 
17:21:08 ipsec rejected enctype: DB(prop#1:trns#2):Peer(prop#1:trns#1) = 3DES-CBC:AES-CBC 
17:21:08 ipsec rejected hashtype: DB(prop#1:trns#2):Peer(prop#1:trns#1) = MD5:SHA 
17:21:08 ipsec rejected enctype: DB(prop#1:trns#1):Peer(prop#1:trns#2) = AES-CBC:3DES-CBC 
17:21:08 ipsec rejected hashtype: DB(prop#1:trns#1):Peer(prop#1:trns#2) = MD5:SHA 
17:21:08 ipsec rejected hashtype: DB(prop#1:trns#2):Peer(prop#1:trns#2) = MD5:SHA 
17:21:08 ipsec,error no suitable proposal found. 
17:21:08 ipsec,error 10.5.107.112 failed to get valid proposal. 
17:21:08 ipsec,error 10.5.107.112 failed to pre-process ph1 packet (side: 1, status 1). 
17:21:08 ipsec,error 10.5.107.112 phase1 negotiation failed. 
(..)

在本示例中,远程端要求使用 SHA1 作为哈希算法,但本地路由器上配置的是 MD5。冒号 (:) 符号之前的设置是在本地侧配置的,冒号 (:) 符号之后的参数是在远程侧配置的。

"phase1 negotiation failed due to time up" 是什么意思?

Peer 之间存在通信问题。可能的原因包括 —— Phase 1 IP 地址配置错误;防火墙阻止 UDP 端口 500 和 4500;peer 之间的 NAT 未正确转换 IPsec 协商数据包。当 local-address 参数未正确使用时,也可能出现此错误消息。

隧道上出现随机丢包或连接非常慢,启用 packet sniffer/torch 后问题消失?

问题在于封装之前,数据包被发送到 Fasttrack/FastPath,从而绕过了 IPsec policy 检查。解决方案是将需要封装/解封装的流量排除在 Fasttrack 之外。

如何启用 ike2?

要为基本配置启用 ike2,请在 peer 设置中将 exchange-mode 改为 ike2。

fatal NO-PROPOSAL-CHOSEN 通知消息?

远程 peer 发送了通知,表示它无法接受提议的算法。要查明问题的确切原因,请查看远程 peer 的调试日志或配置,并验证客户端和服务器是否具有相同的算法集。

我只能单向 ping 通?

此类情况下的典型问题是严格的防火墙:防火墙规则仅允许向一个方向创建新连接。解决方案是重新检查防火墙规则,或显式接受所有应被封装/解封装的流量。

我可以仅允许加密流量吗?

可以,请参见 "仅允许 IPsec 封装的流量" 示例。

我在 StrongSwan 上启用了 IKEv2 REAUTH,并收到错误 'initiator did not reauthenticate as requested'

RouterOS 不支持 rfc4478,必须在 StrongSwan 上禁用 reauth。