通过 FRP 转发端口的 IKEv2 远程局域网访问方案
AI 生成说明
本文
超过50%内容使用 LLM 生成,使用的模型包括:Gemini-3-pro-preview。
在发布之前已进行人工整理修正,过程中尽可能确保信息真实可信,但还请在参考采用前更多进行验证。
前言
遇到了一些需求,需要远程访问一个没有公网的局域网,并需要远程唤醒 PC,整理确认现有情况后,确定了本文所述的技术方案。
IKEv2 (Internet Key Exchange version 2) 是一种现代、安全且高效的虚拟局域网协议。它的最大优势在于:
- 原生支持:iOS、macOS、Windows 和 Android 均内置客户端,无需安装第三方 App。
- 网络切换平滑:在 4G/5G 和 Wi-Fi 之间切换时连接不易断开(MOBIKE 特性)。
- 安全性高:支持高强度的加密算法和证书认证。
架构
场景
- **本地环境 (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
环境
- VPS 一台:Ubuntu 24.04,开放防火墙 UDP 500, 4500 和 FRP 通信端口(默认 7000)。
- 本地服务器:Linux 系统,根据实际情况选择,本文中使用的同样是一台 Ubuntu 24.04 系统的树莓派。
- 域名:用于申请免费 TLS 生成证书,这样就不需要在客户端安装并信任自签名的证书。
部署
VPS 端
部署和启动 FRP 服务端 (frps),不过多赘述。
本地服务端
FRP 部分
配置并启动 FRP 客户端 (frpc),将 UDP 500 和 4500 端口转发到 VPS。
1 | [[proxies]] |
这里需要注意: 绑定的 IP 是本地服务器的内网 IP 地址,而不是127.0.0.1,这样可以避免 StrongSwan 检测NAT并连接的时候的一些问题。
FRP就绪后,使用 StrongSwan 搭建 IKEv2 服务端。
生成证书
使用 ACME 工具申请免费的 TLS 证书,并将证书和私钥放到 /etc/ipsec.d/certs/ 和 /etc/ipsec.d/private/ 目录下,分别妥善命名。
为了避免后续问题,申请尽量申请单域名证书,不使用多域名/通配符证书,在测试的版本下,通配符证书会无法正确匹配导致连接失败。
StrongSwan 部分
1 | sudo apt update |
配置文件 /etc/ipsec.conf
1 | config setup |
在这里,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 | # 服务器私钥引用 |
重启服务
1 | sudo ipsec restart |
查看日志
1 | sudo tail -f /var/log/syslog |
配置 IP 转发和防火墙
编辑 /etc/sysctl.conf:
1 | net.ipv4.conf.all.proxy_arp = 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 设置
- 新建连接,类型选择 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 的限制,构建了一个安全、原生且体验极佳的远程访问通道。
这种方案适用于个人用户和小型企业或团队,尤其是在远程办公日益普及的今天。希望本文能为有类似需求的读者提供参考和帮助。
