设备 MikroTik RB750Gr3

系统 RouterOS 7.16.*

配置

参考1

配置结构

flowchart TD
    %% 节点声明
    A[Group]
    B[Peer]
    C[Mode Config]
    D[Identity]
    E[Profile]
    F[Proposal]
    G[Policy]
    H[Pool]

    %% 节点连线
    A --> G
    B --> D
    C --> D
    E --> B
    H --> C
    F --> G
    A --> D

★ 1 Groups

IP -> IPSec -> Groups

新建项

Name: ikev2-group

Snipaste_2025-05-15_03-30-08

命令式:

/ip ipsec policy add group=ikev2-group proposal=ikev2-proposal template=yes

★ 2 Proposals

IP -> IPSec -> proposal

新建项

Name: ikev2-proposal

Auth.Algorithms:

  • sha1
  • sha256

Encr.Algorithms:

  • aes-256 cbc

PFS Group: modp2048

Snipaste_2025-05-15_03-09-07

命令式:

/ip ipsec proposal add auth-algorithms=sha256,sha1 enc-algorithms=aes-256-cbc name=ikev2-proposal pfs-group=modp2048

★ 3 Profiles

IP -> IPSec -> Profiles

新建项

Name: ikev2-profile

Hash Algorithms: sha256

PRF Algorithms: auto

Encyption Algorithm:

  • aes-256

DH Group:

  • modp1024
  • nodp2048

Proposal Check: obey

  • NAT Traversal

DPD Interval: 30

DPD Maximum Failures: 10

Snipaste_2025-05-15_03-11-05

DPD Interval

  • 作用:指定检测报文发送的间隔时间。
  • 单位:秒(seconds)
  • 例子:如果设置为 10,表示每 10 秒发送一次 DPD 检测包。

DPD Maximum Failures

  • 作用:指定在连续多少次未收到对端响应后,认为连接失效。
  • 例子:如果设置为 5,表示连续 5 次未收到回应就判定对端已经掉线。
/ip ipsec profile add dpd-interval=1m dpd-maximum-failures=10 enc-algorithm=aes-256 hash-algorithm=sha256 name=ikev2-profile

★ 4 Peers

IP -> IPSec -> Peers

新建项

Name: ikve2-peer

Profile:ikev2-profile

Exchange Mode:IKE2

  • Passive
  • Send INITIAL_CONTACT

Snipaste_2025-05-15_03-19-37

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

★ 5 Policies

IP -> IPSec -> Policies

新建项

  • template

Group: ikev2-group

Proposal: ikev2-proposal

Snipaste_2025-05-15_03-31-48

/ip ipsec policy add group=ikev2-group proposal=ikev2-proposal template=yes

★ 6 Mode Configs

IP -> IPSec -> Mode Configs

Name: ikev2-mode

  • Responder

Address Pool: 地址池

Address Prefix Length: 24

Split Include:

  • 192.168.8.0/24
  • 192.168.89.0/24

Split DNS:

  • xyh.moe

  • System DNS

Static DNS:

  • 192.168.8.1

System DNS: 勾选的话终端会继承路由器的 DNS IP,也就是IP -> DNS -> Servers 的值,不会从路由器解析 DNS。

/ip ipsec mode-config add address-pool=地址池 name=ikev2-cfg split-dns=xyh.moe split-include=192.168.8.0/24,192.168.89.0/24 static-dns=192.168.8.1 system-dns=no

★ 7 Identities

★ PSK (Pre-Shared Key)

[!Note]

Windows 原生不支持 PSK 认证

  • Peer: ikev2-peer
  • Auth.Method: pre shared key
  • Secert: 密码
  • Policy Template Group: ikev2-group
  • My ID Type: fqdn
  • My ID: example.com
  • Remote ID Type: auto
  • Match By: remote id
  • Mode Configuration: ikev2-mode
  • Generate Policy: port strict

★ digital signature (数字签名)

生成证书

参考2

.pri.pem: 私钥文件

.crt: 证书文件

pfx: 同时包含证书和私钥的文件

生成 CA 证书及密钥

openssl req -new -x509 -utf8 \
    -days 3650 \
    -newkey rsa:2048 -noenc -keyout Example-CA.pri.pem \
    -subj "/CN=示例公司" \
    -addext basicConstraints=critical,CA:TRUE,pathlen:1 \
    -addext keyUsage=critical,digitalSignature,keyCertSign,cRLSign \
    -addext subjectKeyIdentifier=hash \
    -addext authorityKeyIdentifier=none \
    -out Example-CA.crt

生成 Server 证书及密钥

openssl req -new -x509 -utf8 \
    -days 365 \
    -CA Example-CA.crt \
    -CAkey Example-CA.pri.pem \
    -newkey rsa:2048 -noenc -keyout Example-Server.pri.pem \
    -subj "/CN=IKEv2 Server" \
    -addext basicConstraints=critical,CA:FALSE \
    -addext authorityKeyIdentifier=keyid \
    -addext subjectKeyIdentifier=hash \
    -addext keyUsage=critical,digitalSignature,keyEncipherment \
    -addext extendedKeyUsage=serverAuth \
    -addext subjectAltName=DNS:ikev2.Example-.com \
    -out Example-Server.crt

openssl pkcs12 -export \
  -out Example-Server.pfx \
  -inkey Example-Server.pri.pem \
  -certfile Example-CA.crt \
  -passout pass: \
  -in Example-Server.crt

生成 Client 证书及密钥

openssl req -new -x509 -utf8 \
    -days 365 \
    -CA Example-CA.crt \
    -CAkey Example-CA.pri.pem \
    -newkey rsa:2048 -noenc -keyout Example-Client.pri.pem \
    -subj "/CN=IKEv2 Server" \
    -addext basicConstraints=critical,CA:FALSE \
    -addext authorityKeyIdentifier=keyid \
    -addext subjectKeyIdentifier=hash \
    -addext keyUsage=critical,digitalSignature,keyEncipherment \
    -addext extendedKeyUsage=clientAuth \
    -addext subjectAltName=DNS:ikev2.Example-.com \
    -out Example-Client.crt

openssl pkcs12 -export \
    -inkey Example-Client.pri.pem \
    -in Example-Client.crt \
    -certfile Example-CA.crt \
    -passout pass: \
    -out Example-Client.pfx

routeros 中,点击 Files -> Upload...

Example-CA.crt

Example-Server.pfx

Example-Client.crt

routeros -> System -> Certificates -> Import 导入刚刚上传的3个文件

配置

IP -> IPSec -> Identities

  • Peer:ikev2-peer
  • Auth Method: digital signature
  • Certificate: 服务端证书
  • Remote Certificate: 客户端证书
  • Policy Template Group:ikev2-group
  • Notrack Chain:
  • My ID Type:auto
  • Remote ID Type:ignore
  • Match By: certificate
  • Mode Configuration:ikev2-cfg
  • Generate Policy:port strict

内网域名解析

参考3

默认情况下 IP 解析出来还是公网的地址

IP -> Firewall -> FilterRules

/ip firewall address-list
add address=192.168.0.0/24 list=LAN
add address=192.168.13.0/24 list=LAN
/ip firewall filter add action=accept chain=input protocol=tcp src-address-list=LAN comment="Internal Router access"
/ip firewall filter add action=accept chain=input protocol=udp src-address-list=LAN comment="Internal Router access"

将规则位置调整到 allow IKE 旁边

终端连接

windows IKEv2 + 证书

双击 Example-CA.crt -> 安装证书 -> 本地计算机 -> 将所有的证书都放入下列存储 -> 浏览 -> 受信任的根证书颁发机构 -> 下一步 -> 完成

双击 Example-Client.pfx -> 本地计算机 -> 下一步 -> 下一步 -> 下一步 -> 将所有的证书都放入下列存储 -> 浏览 -> 个人 -> 下一步 -> 完成

设置 -> 网络 -> VPN -> 添加 VPN 连接

  • VPN 提供商: Windows (内置)

  • 连接名称: 连接名称

  • 服务器名称或地址: IP 或域名

  • VPN 类型: IKEv2

  • 登录信息的类型: 证书

  • 用户名(可选): 不填

  • 密码(可选): 不填

Windows 客户端证书必须安装到计算机个人,当前用户个人不行,原因未知

修改控制面板网络中该连接

控制面板 -> 网络和 Internet -> 网络和共享中心 -> 更改适配器设置 -> 连接名称右键 -> 安全 身份验证 切换为 使用计算机证书

Android IKEv2 + PSK

  • 名称: 名称
  • VPN 类型: IKEV2/IPSec PSK
  • 服务器地址: IP 或域名
  • IPSec 标识符: example.com # Identities My ID 值
  • IPSec 预共享密钥: 密码 # Identities Secret 值

后记

参考1建立好了连接,但是完全无法访问内网任何地址,给chatgpt看了配置后,他告诉我 Policies 不能用 Template.于是在他的帮助下,新建了一个非 Template Policy 就能正常访问了。