青

一言

通过 FRP 转发端口的 IKEv2 远程局域网访问方案

通过 FRP 转发端口的 IKEv2 远程局域网访问方案

AI 生成说明

本文 超过50% 内容使用 LLM 生成,使用的模型包括: Gemini-3-pro-preview
在发布之前已进行人工整理修正,过程中尽可能确保信息真实可信,但还请在参考采用前更多进行验证。

前言

遇到了一些需求,需要远程访问一个没有公网的局域网,并需要远程唤醒 PC,整理确认现有情况后,确定了本文所述的技术方案。

IKEv2 (Internet Key Exchange version 2) 是一种现代、安全且高效的虚拟局域网协议。它的最大优势在于:

  1. 原生支持:iOS、macOS、Windows 和 Android 均内置客户端,无需安装第三方 App。
  2. 网络切换平滑:在 4G/5G 和 Wi-Fi 之间切换时连接不易断开(MOBIKE 特性)。
  3. 安全性高:支持高强度的加密算法和证书认证。

架构

场景

  • **本地环境 (Local)**:一台 Linux 服务器(如树莓派、软路由),位于家庭光猫/路由器后,无公网 IP。
  • **公网环境 (VPS)**:一台带有公网 IP 的云服务器(阿里云、腾讯云、AWS 等)。
  • **客户端 (Client)**:手机、笔记本电脑等移动设备。

流量转发逻辑

由于家庭宽带没有公网 IP,我们不能直接连接到家中的 VPN Server。我们需要利用 FRP 将所需要的 UDP 端口进行映射。

数据流向:
客户端 (iPhone) -> [UDP 500/4500] -> VPS (FRP Server) -> [FRP Tunnel] -> 本地服务器 (FRP Client) -> [UDP 500/4500] -> StrongSwan

环境

  1. VPS 一台:Ubuntu 24.04,开放防火墙 UDP 500, 4500 和 FRP 通信端口(默认 7000)。
  2. 本地服务器:Linux 系统,根据实际情况选择,本文中使用的同样是一台 Ubuntu 24.04 系统的树莓派。
  3. 域名:用于申请免费 TLS 生成证书,这样就不需要在客户端安装并信任自签名的证书。

部署

VPS 端

部署和启动 FRP 服务端 (frps),不过多赘述。

本地服务端

FRP 部分

配置并启动 FRP 客户端 (frpc),将 UDP 500 和 4500 端口转发到 VPS。

1
2
3
4
5
6
7
8
9
10
11
12
13
[[proxies]]
name = "ipsec500"
type = "udp"
localIP = "10.0.150.202"
localPort = 500
remotePort = 500

[[proxies]]
name = "ipsec4500"
type = "udp"
localIP = "10.0.150.202"
localPort = 4500
remotePort = 4500

这里需要注意: 绑定的 IP 是本地服务器的内网 IP 地址,而不是127.0.0.1,这样可以避免 StrongSwan 检测NAT并连接的时候的一些问题。

FRP就绪后,使用 StrongSwan 搭建 IKEv2 服务端。

生成证书

使用 ACME 工具申请免费的 TLS 证书,并将证书和私钥放到 /etc/ipsec.d/certs//etc/ipsec.d/private/ 目录下,分别妥善命名。

为了避免后续问题,申请尽量申请单域名证书,不使用多域名/通配符证书,在测试的版本下,通配符证书会无法正确匹配导致连接失败。

StrongSwan 部分

1
2
sudo apt update
sudo apt install strongswan libcharon-extra-plugins libcharon-extauth-plugins

配置文件 /etc/ipsec.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
config setup
charondebug="ike 1, knl 1, cfg 1"
uniqueids=no

conn %default
keyexchange=ikev2
ike=aes256-sha256-modp2048,aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha256,aes256-sha1,3des-sha1!
dpdaction=clear
dpddelay=300s
rekey=no

conn ikev2-vpn
left=%any
leftid={{这里是你的域名,例如 vpn.example.com,正常情况下不需要加 @ 符号,如果失败可以尝试加上}}
leftcert=fullchain.pem # 公钥文件
leftsendcert=always
leftsubnet=10.0.0.0/8

right=%any
rightauth=eap-mschapv2
rightsourceip=10.0.178.60-10.0.178.68 # 分配给客户端的 IP 段
rightdns=119.29.29.29,223.5.5.5
rightsendcert=never

eap_identity=%identity
auto=add

在这里,rightsourceip 定义了客户端连接后分配的 IP 段,在本次实践中直接使用了内网可用的地址,在 StrongSwan 中通过 Proxy ARP (ARP 代理) 机制来实现。

虚拟局域网通常会分配一个独立的虚拟网段(如 10.10.10.x),然后通过 NAT 让外部连入的设备访问内网,在本次需求中,考虑到使用人员均为技术人员,且并无保密需求,因此直接分配内网地址。

这样可以让 StrongSwan 直接分配 10.0.178.x 的地址给客户端,例如 10.0.178.215(不在上述配置文件范围内,仅示例说明),
当局域网内的其他设备(如打印机、NAS)想找 10.0.178.215(客户端)时,它们会发送 ARP 广播。由于客户端实际上在互联网的另一端,无法收到广播。此时,Ubuntu 服务器必须“举手”代为应答:“我就是 .215,发给我吧”,然后服务器再通过隧道把数据转发给客户端。

配置 /etc/ipsec.secrets

1
2
3
4
5
# 服务器私钥引用
: RSA "privkey.pem"

# 用户名和密码格式: 用户名 : EAP "密码"
myuser : EAP "MySuperSecretPassword"

重启服务

1
sudo ipsec restart

查看日志

1
sudo tail -f /var/log/syslog

配置 IP 转发和防火墙

编辑 /etc/sysctl.conf

1
2
3
4
net.ipv4.conf.all.proxy_arp = 1
net.ipv4.conf.eth0.proxy_arp = 1

net.ipv4.ip_forward=1

(将 eth0 替换为你实际的网卡名称)

执行 sudo sysctl -p 使配置生效。

是否还需要 NAT 规则,取决于需求:
对于纯局域网互访:不再需要 NAT 规则(Masquerade)。因为局域网内的设备看到源 IP 是 10.0.178.215,它们认为这是同网段设备,会直接回包(回给 Ubuntu 服务器,因为 Ubuntu 做了 ARP 代理)。
对于需要代理访问互联网:如果客户端要访问外部网络,流量会从 Ubuntu 出去。此时 Ubuntu 仍然充当路由器的角色,可以配置 NAT。

实际上,在使用 Proxy ARP 模式时,很多时候你可以完全移除 NAT 规则(如果主路由器足够智能)。但为了稳妥,保留 NAT 不会错。

潜在风险与注意事项
IP 冲突:这是最大的风险。需要配置 DHCP 分配池中排除分配给客户端的 IP 地址,或者设置为静态保留。
网段冲突 (Split Horizon): 如果你的客户端所在的外部网络(例如咖啡厅 WiFi)恰好也是 10.0.178.x 网段,VPN 将无法工作。

客户端连接设置

iOS / macOS 设置

添加连接

  • 类型:IKEv2
  • 描述:任意名称,如“Home”
  • 服务器:v.example.com (或 VPS IP)
  • 远程 ID:v.example.com (必须与 ipsec.conf 中的 leftid 一致)
  • 用户认证:用户名
  • 用户名/密码:填入 ipsec.secrets 中的账号密码。
  • 代理:关闭(除非你有特殊需求)。

Windows 设置

  1. 新建连接,类型选择 IKEv2,输入服务器地址和账号密码。
    1PowerShell 补丁(Windows 默认不支持 NAT 后的 IKEv2 Server):
    打开管理员 PowerShell,运行:
    1
    Set-VpnConnectionIPsecConfiguration -ConnectionName "名称" -AuthenticationTransformConstants GCMAES128 -CipherTransformConstants GCMAES128 -EncryptionMethod AES128 -IntegrityCheckMethod SHA256 -PfsGroup None -DHGroup Group14 -PassThru
    (注:如果连接报错,可能需要修改注册表 AssumeUDPEncapsulationContextOnSendRule 值为 2)

Android 设置

安卓系统原生支持 IKEv2,但界面和选项可能因设备和系统版本不同而有所差异。特别是一些国产定制的系统,可能添加了服务但没有开启开关,需要自行探索,这里推荐
使用 StrongSwan 官方客户端 App,配置方法类似 iOS。

结语

通过 FRP + StrongSwan (IKEv2) 的组合,我们成功绕过了没有公网 IP 的限制,构建了一个安全、原生且体验极佳的远程访问通道。

这种方案适用于个人用户和小型企业或团队,尤其是在远程办公日益普及的今天。希望本文能为有类似需求的读者提供参考和帮助。

本文作者:
本文链接:https://tdh6.top/%E8%BF%90%E7%BB%B4/ikev2-with-frp/
版权声明:本站文章采用 CC BY-NC-SA 3.0 CN 协议进行许可,翻译文章遵循原文协议。
图片来源:本站部分图像来源于网络,前往查看 相关说明。