iOS 原生客户端接入 IPSec(IKEv2 用户名/密码 + 预共享密钥认证)
iOS 原生客户端接入 IPSec(IKEv2 用户名/密码 + 预共享密钥认证)
重要
本文基于 iOS 16.3 编写。
网络需求
通过 iOS 原生客户端(IKEv2 用户名/密码 + 预共享密钥认证)连接 FortiGate 的 IPSec,并访问 VPN 内部资源。
网络拓扑

配置步骤
FortiGate 配置
配置 FortiGate 的接口 IP。

创建本地 VPN 用户和用户组,参考 用户与认证 → 本地用户和用户组章节(如需使用远程认证,请参考 用户与认证 → LDAP 认证 → LDAP 认证配置与排错或 用户与认证 → Radius 认证 → Radius 认证配置与排错章节)。

config user local edit "vpn_user" set type password set passwd xxxxxxxx next end
config user group edit "VPN" set member "vpn_user" next end该种方式的 IPSec 需要使用 CLI 方式配置,分别配置 IPSec 一阶段和二阶段。
IPSec一阶段配置: config vpn ipsec phase1-interface edit "IKEv2_User_PSK" set type dynamic set interface "port2" set ike-version 2 //IKE协议2 set peertype any set net-device disable set mode-cfg enable //开启为客户端分配IP set ipv4-dns-server1 10.10.1.2 //为客户端分配的DNS地址 set proposal aes256-sha256 set negotiate-timeout 300 set dpd on-idle set dhgrp 14 5 2 set eap enable //需要开启EAP做用户密码认证 set eap-identity send-request //开启EAP主动发送认证请求 set authusrgrp "VPN" //选择认证的用户组 set ipv4-start-ip 10.10.100.1 set ipv4-end-ip 10.10.100.100 //客户端分配地址范围 set ipv4-netmask 255.255.255.0 set psksecret xxxxxxxx set dpd-retryinterval 60 next end IPSec二阶段配置: config vpn ipsec phase2-interface edit "IKEv2_User_PSK" set phase1name "IKEv2_User_PSK" set proposal aes256-sha256 set keepalive enable next end配置防火墙策略,允许客户端访问内网 VPN 资源。

VPN资源地址对象: config firewall address edit "LAN_10.10.1.0/24" set subnet 10.10.1.0 255.255.255.0 next end 客户端地址对象: config firewall address edit "VPN_10.10.100.0/24" set subnet 10.10.100.0 255.255.255.0 next end 防火墙策略: config firewall policy edit 1 set name "IKEv2_User_PSK" set srcintf "IKEv2_User_PSK" set dstintf "port3" set action accept set srcaddr "VPN_10.10.100.0/24" set dstaddr "LAN_10.10.1.0/24" set schedule "always" set service "ALL" next end
制作和安装描述文件
重要
想要使用 IKEv2 用户名/密码 + 预共享密钥方式的 VPN 认证,需要使用 Apple Configurator 工具为 iOS/macOS 制作描述文件,该工具可以在 macOS 下的 App Store 中下载。
打开 Apple Configurator,点击菜单栏的“文件 → 新建描述文件”(或使用快捷键 Command + N)。

在弹出的配置文件编辑器中,配置描述文件的名称。

选择 VPN 选项卡,点击配置按钮。

配置描述文件,选择连接类型为 IKEv2,填写服务器 IP 地址,远程标识符和局部标识符随意填写,填写预共享密钥,开启 EAP,选择 EAP 鉴定为用户名/密码模式,其他配置保持默认即可(或根据实际需求更改)。


选择菜单栏的“文件 → 存储”按钮(或使用快捷键 Command + S),保存该描述文件到本地。

通过邮件等方式,将描述文件发送至 iPhone。
iPhone 通过邮件 App 收取该描述文件后,点击该描述文件,会弹出提示进入设置中查看描述文件。

进入设置,点击“已下载描述文件”。

选择制作的描述文件并安装(需要输入手机密码)。

根据提示输入用户名和密码,点击完成按钮安装描述文件。

VPN 列表中自动生成 VPN 配置。

客户端配置
打开设置 → VPN,点击创建的 VPN 连接,确保该连接被选中(连接前有一个✅)。

可根据实际需要修改 VPN 连接中的用户名或密码。
结果验证
在客户端点击连接按钮,查看连接状态,点击 VPN 连接右侧的信息按钮,可以看到连接的具体信息,获取的 IP 为 FortiGate 配置的网段。

在 FortiGate 侧查看连接状态。

FortiGate # diagnose vpn ike gateway list vd: root/0 name: IKEv2_User_PSK_0 version: 2 interface: port2 4 addr: 202.103.12.2:4500 -> 202.103.23.2:64916 tun_id: 10.10.100.1/::10.0.0.17 remote_location: 0.0.0.0 network-id: 0 created: 194s ago eap-user: vpn_user 2FA: no peer-id: client peer-id-auth: no assigned IPv4 address: 10.10.100.1/255.255.255.0 nat: peer PPK: no IKE SA: created 1/1 established 1/1 time 90/90/90 ms IPsec SA: created 1/1 established 1/1 time 10/10/10 ms id/spi: 13 d5ae11369c1b3d95/68eb5a2b96838488 direction: responder status: established 194-194s ago = 90ms proposal: aes256-sha256 child: no SK_ei: 5f2946151d12c26b-0ca7ea2a894ba835-a6a5c9a24d44caa8-e11178ab9a2cd6f5 SK_er: fe330d4fbd3f7753-77748964618e4a94-4bf4f7baeedcca70-ba645a3fc31f2265 SK_ai: 488d6b7d9df75b01-d2c8bdc7049e552a-0c17d452a8b4ebe8-631caa5abacaa0c6 SK_ar: 782bdd0189841d1c-fc202aa4598d009e-056e04417ae4ad9b-da9ede3c92250546 PPK: no message-id sent/recv: 0/6 lifetime/rekey: 86400/85935 DPD sent/recv: 00000000/00000000 peer-id: client FortiGate # diagnose vpn tunnel list list all ipsec tunnel in vd 0 ------------------------------------------------------ name=IKEv2_User_PSK ver=2 serial=14 202.103.12.2:0->0.0.0.0:0 tun_id=10.0.0.9 tun_id6=::10.0.0.9 dst_mtu=0 dpd-link=on weight=1 bound_if=4 lgwy=static/1 tun=intf mode=dialup/2 encap=none/552 options[0228]=npu frag-rfc role=primary accept_traffic=1 overlay_id=0 proxyid_num=0 child_num=1 refcnt=3 ilast=43039746 olast=43039746 ad=/0 stat: rxp=1723 txp=337 rxb=127170 txb=41184 dpd: mode=on-idle on=0 idle=60000ms retry=3 count=0 seqno=0 natt: mode=none draft=0 interval=0 remote_port=0 run_tally=0 ------------------------------------------------------ name=IKEv2_User_PSK_0 ver=2 serial=1a 202.103.12.2:4500->202.103.23.2:64916 tun_id=10.10.100.1 tun_id6=::10.0.0.17 dst_mtu=1500 dpd-link=on weight=1 bound_if=4 lgwy=static/1 tun=intf mode=dial_inst/3 encap=none/9128 options[23a8]=npu rgwy-chg rport-chg frag-rfc run_state=0 role=primary accept_traffic=1 overlay_id=0 parent=IKEv2_User_PSK index=0 proxyid_num=1 child_num=0 refcnt=5 ilast=12 olast=12 ad=/0 stat: rxp=113 txp=38 rxb=7546 txb=3581 dpd: mode=on-idle on=1 idle=60000ms retry=3 count=0 seqno=1 natt: mode=silent draft=0 interval=10 remote_port=64916 proxyid=IKEv2_User_PSK proto=0 sa=1 ref=10 serial=1 add-route src: 0:0.0.0.0-255.255.255.255:0 dst: 0:10.10.100.1-10.10.100.1:0 SA: ref=3 options=20683 type=00 soft=0 mtu=1422 expire=42991/0B replaywin=2048 seqno=27 esn=0 replaywin_lastseq=00000071 qat=0 rekey=0 hash_search_len=1 life: type=01 bytes=0/0 timeout=43190/43200 dec: spi=7b8ba378 esp=aes key=32 e2651b177effa8747d930eacb965a527f5758f5f0a6503225f2d21eac7d549fe ah=sha256 key=32 1f86d1b2efb0dbe0511f2c0b79257ab6b76c3f42aa9ddbafde6f8f4c7b13eb27 enc: spi=0846436d esp=aes key=32 87d133ec91eccd6c9b10671111bd07242f9560ba62c4735c5a8dffc52ededf59 ah=sha256 key=32 792ce83e7dce6fdfdb8df9edf286a206023b236a263fa9ab09cdd3b819064386 dec:pkts/bytes=226/15092, enc:pkts/bytes=76/10133 npu_flag=00 npu_rgwy=202.103.23.2 npu_lgwy=202.103.12.2 npu_selid=f dec_npuid=0 enc_npuid=0在 FortiGate 侧查看路由 kernel 表,可以看到 FortiGate 已经自动添加了到客户端的路由。
FortiGate # get router info kernel ... tab=254 vf=0 scope=0 type=1 proto=11 prio=1 0.0.0.0/0.0.0.0/0->10.10.100.1/32 pref=0.0.0.0 gwy=10.10.100.1 dev=27(IKEv2_User_PSK) ...使用客户端访问 VPN 内网资源(Ping 和 HTTP 访问)。

重要
实际测试 iOS/macOS 使用 IKEv2,无法使用隧道分割功能,VPN 建立后,所有流量被送入 VPN 隧道。