1 背景和需求
家庭网络中存放大量的数据和虚拟机以及个人网盘功能,加之最近运营商对IPV6的部分端口进行封禁导致无法正常使用家庭文件服务,需要在保证尽可能的安全下搭建VPN实现隧道网络环境。而基于开源的 OpnSense搭配 OpenVPN 则可以在可控性、可扩展性和审计性上提供明显优势。
在家庭网络中,连接上层光猫的路由器为TP-Link路由器,连接所有的服务都运行在Proxomx中,所以我的OpnSense也部署在虚拟机中,我的拓扑图如下。

其中左下角黄色区域为Proxmox虚拟机环境,虚拟机环境有两条网络,第一条是172.16.100.0/24网络,这条网络跟上层的物理机和开发机器都由TP-Link提供地址。另一个网络为192.168.90.0/24网段是下层虚拟机的隔离网段,由虚拟机Opnsense提供NAT服务,所以连接OpnSense的LAN接口。
右上角为云服务器,本文在配置的时候需要使用到云服务器的一个端口,隧道的转发。最后右下角绿色区域是模拟互联网的任意终端进行拨号接入。
我的IP和地址配置如下表
| IP地址 | 接口 | 网关/设备 | 备注 |
| 172.16.100.0/24 | 内网物理机 | 172.16.100.254 | 内网的所有物理设备,由TP-Link提供服务 |
| 192.168.90.0/24 | 虚拟机(服务段) | 192.168.90.254 | 内网的所有虚拟机服务段,由OpnSense提供服务 |
| 172.16.100.254 | Gi0/0 | Cmcc-optical-modem | 模拟TP-Link |
| 192.168.1.1 | Gi0/1 | Cmcc-optical-modem | 模拟光猫 |
| 192.168.1.2 | eth2 | Internet-AR1 | 模拟互联网 |
| 192.168.2.1 | eth2 | Internet-AR1 | 模拟互联网 |
| 192.168.2.2 | eth0 | Internet-AR2 | 模拟互联网 |
| 192.168.3.254 | eth1 | Internet-AR2 | 模拟互联网云服务商段 |
| 192.168.4.254 | eth2 | Internet-AR2 | 模拟互联网用户段 |
2 所需要的环境
- OpnSense虚拟机
- 共享IP的云主机,需要一个开放端口
- 互联网环境
3 服务运行架构
- OpnSense虚拟主机:作为边界防火墙与 VPN 服务承载端,部署在虚拟机中。
- OpenVPN 服务:运行在OpnSense上,提供隧道加密、客户端认证与流量转发。
- 证书与密钥管理:使用OpnSense自带的 CA 与证书系统,决定认证方式(证书+密码/动态验证)。
- 路由与防火墙规则:确保隧道网段与目标网段之间的流量通路,以及允许管理访问。
- 客户端:Windows/macOS/Linux/移动端,需要配置对应的证书、密钥和服务器信息。
4 配置步骤
4.1 基础环境配置
1.环境准备好了之后,虚拟机中的隔离网段192.168.90.0/24段接入到Opnsense的Lan接口上,然后将桥接到172.16.100.0/24的网段介入到Opnsense的WAN口上。

2.然后在内网的Windows上就可以直接使用http://192.168.90.254就可以直接进行登录Opnsense了。
4.2 用户证书配置
1.登录系统,选择设置一次点击证书,点击办法机构,创建一个内部的证书颁发机构,用于内部用户的用户证书功能。

2.然后在证书中创建一个内部服务器证书,用于OpenVPN的绑定证书。

3.然后点击访问,在认证中创建一个本地认证中心。

4.点击添加,开始设置认证服务器,设置认证类型为本地+基于时间的一次性密码认证,这种方式主要可以实现动态验证码的二次认证,实现动态令牌的接入。为服务器设置一个名称,然后在令牌长度中选择长度为6,其余默认即可。

4.3 OpenVPN服务配置
1.开始配置OpenVPN服务,进入VPN选项卡,然后选择OpenVPN服务开始配置服务。

2.点击添加,然后创建一个VPN服务,进入到设置界面,设置服务器模式为远程接入模式,其中认证方式为SSL+用户认证的模式。

3.然后在认证后端中选择刚才创建的Test的认证后端,为VPN服务提供用户认证的接口,在这种状态下,当用户量较少的时候可以快速实现,当用户量较多的时候需要单独配置认证服务器实现网络用户的认证。
当系统需要只允许本地用户组登录的时候,需要设置强制本地组用户,本地不需要配置,使用默认选项即可。OpenVPN的协议可以选择为TCP和UDP两种模式,当场景对都连接的速度要求较高,对隧道质量的要求较低的时候可以使用UDP协议,如果场景更重视可靠性,那么就选择 TCP 。本文选择使用UDP模式。
在接口的选择上,一般使用WAN口,让服务监听在WAN口的1194端口上,如果在刚才的配置中协议使用了UDP协议,恰巧此处又配置了接口为any的状态下,所有监听的接口,设备则会认为当前的工作状态为多宿主机的状态可能会导致查询IP和回程数据包查询偏慢。
最后在设备模式中使用TUN设备,其中TUN模式是工作在网络层,数据是以路由的形式转发。而TAP模式则是工作在数据链路层,数据是桥接模式进行转发的,这两种模式的区别如下表所示。
| 模式 | 优点 | 缺点 |
| TAP | 行为像一个真正的网络适配器(除了它是一个虚拟网络适配器)可以传输任何网络协议(IPv4、IPv6、Netalk、IPX等)工作在第二层,意味着以太网帧通过VPN隧道传递。可用于桥梁 | 在VPN隧道上造成更多的广播开销。在通过VPN隧道传输的所有数据包上添加以太网报头的开销。鳞片差 |
| TUN | 较低的流量开销,只传输指定给VPN客户端的通信量。只传输第三层IP数据包 | 广播流量通常不被传送。只能传输IPv4 (OpenVPN 2.3添加IPv6)不能用于桥梁 |
对于大多数远程访问场景,建议选择TUN模式配置更简单、效率更高、支持跨网段路由与 NAT。只有在需要在二层广播、NetBIOS 或某些老旧协议互通时才考虑TAP模式。所以在本文中选择使用TUN模式进行转发,并且设置监听端口的接口为默认1194端口,如果不同网络的运营商对该端口由阻塞或者扫描等行为,可以修改成其他端口。

4.在加密选项中使用 AEAD 模式(如 AES-GCM)在保证安全的同时减少 CPU 负载;在硬件性能较差时考虑降低密钥长度,所以本文进行如下配置。
继续设计TLS和加密认证,设置TLS认证为仅限身份验证。设置TLS共享密钥为自动生成。对等证书颁发机构为刚才创建的证书颁发机构。然后为服务器设置服务器证书为刚才创建的证书。加密算法使用AES-128-CBC,认证摘要算法为SHA1,证书深度选择使用服务端加客户端模式。

5.配置完成开始隧道的网络设置,隧道网络中配置隧道地址为172.30.30.0/24,该地址是为VPN客户端分配的地址,所以不能跟网络内的任何地址冲突。本文不需要配置其他重定向网关等。需要配置IPV4本地网络为OpnSense的LAN接口和WAN接口的网络,实现VPN网络跟两个网段之间的互相通讯。其余保持默认设置。

6.最后在客户端这只中,勾选动态IP选项,保证每次服务器下发的地址都不一样。最后设置DNS服务器,本文选择DNS1为服务器本身,用于实现内部域名的解析。第二个192.168.3.200为模拟的公网服务器地址,实现全网的解析。

完成之后保存即可。
4.4 OpenVPN用户配置
1.开始用户配置,在系统,访问,用户选项卡中创建VPN用户,点击创建用户,设置用户名字和密码,然后不允许进行本地登录,所以配置登录shell为/sbin/nologin。

2.然后证书中勾选生成一个新的用户证书。在opt种子选项,点击生成新的opt密码。

3.最后点击保存,完成用户创建。系统自动进入为该用户创建用户证书页面。在方法中选择创建一个内部证书,颁发机构选择刚才创建的颁发证书机构。设置证书类型为客户端证书。

4.证书其余配置保持默认,到下面可辨识名称位置,输入地址以及邮件名称等信息,最后DNS设置为公网的DNS地址,完成之后点击保存即可。

5.此时完成用户的创建进入到该用户界面,找到opt QR码,点击取消隐藏即可看到一个二维码,需要使用动态身份验证器进行绑定,绑定的应用如果可以访问Google play服务,则使用Goole服务,如果不能使用该服务则需要使用stratumauth(国内用户使用),下载连接如下,下载安装。
https://github.com/stratumauth/appCode language: JavaScript (javascript)

6.然后打开打开该应用,扫描刚才opt的二维码,实现动态验证码的接入,此时VPN基本配置完成。

4.5 端口转发配置
配置完成之后开始,此时防火墙的VPN服务运行在内网没法进行连接,但是很多情况下家庭网络运营商是不会分配互联网IP地址的,所以此时就需要利用云服务器端口公网地址实现将OpenVPN的服务转发到公网服务器上。用于给互联网的用户提供服务。
1.首先在Opnsense中开启SSH服务,在系统,设置,服务中开启ssh服务,勾选启用shell,设置登录信息,然后选择保存。

2.此时使用ssh登录到防火墙上去,将FRP上传到该防火墙中。

3.同时打开云服务器,在云服务中开启frps服务,实现防火墙的连接和会话的传输,启动完成云服务器7000端口开放。
/root/frp/frps >> /root/frp/log.txt &Code language: JavaScript (javascript)

4.此时在OpnSense上配置frpc.toml,设置服务器为192.168.3.100,将本地的1194端口转发到远程1194端口上,配置完成启动frpc服务。
/root/frp/frpc -c /root/frp/frpc.toml >> /root/frp/log.txt &Code language: JavaScript (javascript)

5.继续进行防火墙上配置,首先打开防火墙在WAN接口上设置策略,创建一条策略设置,配置策略生效方向为IN方向,设置协议为TCP设置端口为1194端口,设置放行动作为允许,然后完成策略的创建。

6.配置完成WAN口策略,继续打开OpenVPN策略,设置一条方向为IN,源地址源端口以及目标地址目标端口都为any,协议为IPV4协议的策略,策略动作为放行,实现VPN网络到各个区域访问。

4.6 客户端配置下载
1.最后打开VPN,OenVPN,点击客户端导出,设置导出模式为为仅文件,主机名称为云服务的IP,端口为转发到云服务器的端口。勾选使用本地随机端口以及验证服务器主题。最后在自定配置中添加用户认证和信息获取。
auth-user-pass
push-peer-info

2.最后找到对应的用户点击导出,本文导出Test用户的证书,然后将该证书传送到互联网主机上,在互联网主机上的OpenVPN客户端上进行导入。

3.最后在互联网的终端中进行测试,使用该证书文件配合用户名和密码以及动态验证码进行登录,登录的时候首先该证书文件导入到OpenVPN客户端。

4.完成之后点击连接,输入Test用户的用户名和密码,其中密码的格式为验证码+密码的模式,所以在输入密码的时候,前六位为动态验证密码,完成连接网络正常相响应。

5.使用VPN的主机进行访问内网网段进行测试,经过策略发现可以正常访问。

5 搭建的时候注意事项
在部署的时候需要注意以下事项,避免踩坑:
- 时间同步:在所有设备中所有的时间都要保持一致,因为动态密码是基于时间引子变化的,如果时间不一样就会导致认证失败以及隧道无法建立等问题。
- TLS会话协商:在默认情况下openVPN 在1小时后重新协商 TLS 会话时认证失败,导致用户只能连接一小时所以在配置的时候一般在客户端和服务端都加入免认证或者协商会话时间。
reneg-sec 43200 # 12小时
reneg-sec 0 # 关闭该功能Code language: PHP (php)

- 防火墙策略:VPN网络在OpnSense中属于单独的防火墙策略,所以防火墙要放行VPN到其他区域的网络,并且开启自动NAT实现网络的连接。
6 性能与稳定性优化
性能与稳定性往往来自几个层面的优化:
- 加密算法权衡:考虑到算法对硬件的消耗,如果在虚拟机里面以及没有硬件加速考虑使用低复杂密码加密。
- MTU 与分片:VPN 隧道会减小有效 MTU,引发分片与丢包。通过调整客户端/服务器的 tun MTU 或推送 MSS fix 可缓解问题。
- 并发连接限制:检测CPU 与内存,避免超载。必要时增加物理资源。
- 日志与监控:开启合适级别的日志,结合流量监控(RRD、NetFlow/sFlow)观察会话数、速率与异常情况。
- 私有DNS:如果内网中有大量服务,可以考虑使用opnsense的私有DNS,ubound dns服务,实现私有DNS连接。
7 常见故障与排查路线
遇到连接问题时,可以按以下顺序排查:
- 基础连通性:服务器公网 IP/端口是否可达。frp转发是否生效。
- 证书链与有效期:证书是否过期、是否被撤销、客户端是否信任 CA。
- 防火墙规则:是否误阻断了 OpenVPN 服务端口或隧道间流量。
- 路由冲突:客户端被推送的路由是否与本地网络冲突,导致流量走错网关。
- MTU/分片问题:网页加载慢或 VPN 内大文件传输中断,检查是否因分片丢包。
8 安全建议
长期稳定运行的 VPN 不仅是连通性问题,更要考虑安全性:
- 使用强加密与现代协商算法加密设置。
- 实施客户端证书管理与撤销流程(CRL),发生密钥泄露时能快速禁用。
- 限制管理访问,收缩权限,对某些IP进行限制管理页面的访问。
- 定期更新系统与包以修补已知漏洞。
9 高可用性与扩展思路
当用户数量和依赖度增长,可以考虑:
- HA 配置:OpnSense支持HA同步,配合高可用可实现主备切换,并且实现负载分担的功能。
- 集中认证:采用 RADIUS/LDAP 集中用户认证,便于权限管理与审计。
୧(๑•̀⌄•́๑)૭