使用 OpenVPN 连接家庭局域网
服务端系统:Debian 13
客户端系统:Windows 11 24H2
OpenVPN 版本:2.6.14
EasyRSA 版本:3.2.2
服务端配置
以下命令推荐直接切换到 root 用户下进行操作
安装
2026.02.09 更新:在 Debian13 直接通过 APT 的方式安装 openvpn 和 easyrsa 即可
apt install openvpn easy-rsa
生成证书
从严格意义来说,CA 需要是另外一台安全的主机,但个人使用就不考虑这么多了。
在 openvpn 中建立 easy-rsa 目录
make-cadir /etc/openvpn/easy-rsa
修改 easyrsa 配置
vim /etc/openvpn/easy-rsa/vars
主要是两点:
- 修改证书有效时间:删除
set_var EASYRSA_CA_EXPIRE和set_var EASYRSA_CERT_EXPIRE注释,并把后面的数字都修改成 36500(100年)。 - 配置系统使用椭圆曲线加密算法:删除
set_var EASYRSA_ALGO注释,并修改内容为ec,再删除下方set_var EASYRSA_CURVE的注释。
进入 easyrsa 目录
cd /etc/openvpn/easy-rsa/
初始化 PKI
./easyrsa init-pki
创建证书颁发机构(CA),这里为了方便没有设置密码(生产环境请设置密码,后文不再赘述),创建过程中直接回车使用默认 CA 名称即可。
./easyrsa build-ca nopass
生成服务器秘钥和证书,server 是自定义的服务端名称,可以按需修改,生成过程中需要输入 yes。
./easyrsa build-server-full server nopass
生成客户端秘钥和证书,参数 client1 是自定义的服务端名称,可以按需修改,生成过程中需要输入 yes。
./easyrsa build-client-full client1 nopass
生成服务端 TLS Crypt v2 密钥,用于控制平面加密
cd /etc/openvpn/server/
openvpn --genkey tls-crypt-v2-server tc2-server.key
生成客户端 client1 的 TLS Crypt v2 密钥
openvpn --tls-crypt-v2 tc2-server.key --genkey tls-crypt-v2-client tc2-client1.key
经过以上流程,得到 7 个文件,分别是
- /etc/openvpn/easy-rsa/pki/ca.crt:CA 证书文件
- /etc/openvpn/easy-rsa/pki/issued/server.crt:服务端证书文件
- /etc/openvpn/easy-rsa/pki/private/server.key:服务端私钥文件
- /etc/openvpn/server/tc2-server.key:服务端 TLS Crypt v2 密钥
- /etc/openvpn/easy-rsa/pki/issued/client1.crt:客户端 client1 证书文件
- /etc/openvpn/easy-rsa/pki/private/client1.key:客户端 client1 私钥文件
- /etc/openvpn/server/tc2-client1.key:客户端 client1 TLS Crypt v2 密钥
服务端配置文件
接下来就是用上面生成的证书文件设置 openvpn 的配置文件,先处理服务端配置文件。
复制配置文件模板
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
编辑 /etc/openvpn/server/ 文件
必须修改的:
-
ca:修改成 CA 证书文件路径 /etc/openvpn/easy-rsa/pki/ca.crt
-
cert:修改成服务端证书文件路径 /etc/openvpn/easy-rsa/pki/issued/server.crt
-
key:修改成服务端私钥文件路径 /etc/openvpn/easy-rsa/pki/private/server.key
-
dh:由于使用椭圆曲线算法,因此修改为
none -
tls-crypt-v2:加入该字段以启用 TLS Crypt v2,后面跟文件目录,即在配置文件中加入:
tls-crypt-v2 /etc/openvpn/server/tc2-server.key
按需修改
-
port:服务端口
-
proto:使用 udp 协议还是 tcp 协议(想使用 IPV6 的话,这里要修改成 udp6 或者 tcp6)
-
dev:使用路由模式(tun)还是桥接模式(tap),一般来说推荐 tun
-
server:自定义虚拟 IP 地址范围
-
duplicate-cn:是否允许多个设备同时用同一个证书登录,启用后会带来一定的便利性,但会和固定 IP 记录冲突(无法区分 IP 和设备的对应关系)。
-
push:这里决定是否推送服务器所处的局域网,在家用场景下一般都打开它。举例来说,如果当前服务器的局域网 IP 是 192.168.1.1/24,OpenVPN 虚拟 IP 是 10.8.0.1,连接上 OpenVPN 的客户端 IP 是 10.8.0.2,那么客户端想访问 192.168.1.2 的话,就需要配置这个 push 字段,表示把 192.168.1.0/24 的子网路由推送到客户端。
push "route 192.168.1.0 255.255.255.0"
设置防火墙(如若开启)
在 Ubuntu/Debian 发行版中可以通过以下命令检查防火墙是否有开启(新系统默认不开启):
# 检查 ufw
ufw status
# 检查 iptables
iptables -L
以下命令根据实际修改:比如 enp2s0 也可能是 eth0;自定义的端口和协议等
基础设置:
sudo apt install iptables-persistent
# 允许 OpenVPN 服务端口流量进入(客户端连接服务端)
sudo iptables -A INPUT -i enp2s0 -p udp --dport 1194 -j ACCEPT
# 允许 VPN 虚拟网卡流量进入(客户端连接后通过 tun 访问服务端资源)
sudo iptables -A INPUT -i tun0 -j ACCEPT
# 持久化保存
sudo netfilter-persistent save
如果上述配置文件中开启了 push,则需要进行额外的转发设置
# 检查当前是否启用了 IP 转发
cat /proc/sys/net/ipv4/ip_forward
# 如果返回 0,则需要启用 IP 转发
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ipforward.conf
sysctl --system
# 设置转发白名单
# 允许从局域网网卡(enp2s0)→ VPN(tun0)的流量
sudo iptables -A FORWARD -i enp2s0 -o tun0 -j ACCEPT
# 允许从 VPN(tun0)→ 局域网网卡(enp2s0)的流量
sudo iptables -A FORWARD -i tun0 -o enp2s0 -j ACCEPT
# 设置 NAT,把 VPN 客户端发往局域网的包“伪装成”服务器的本地 IP。
# 否则其他局域网机器不知道 10.8.0.x 的流量应该怎么返回。
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp2s0 -j MASQUERADE
sudo netfilter-persistent save
运行
systemctl start openvpn-server@server
查看日志输出
journalctl -u openvpn-server@server
作者这里的日志输出是:
Feb 09 20:53:42 orangepi3b systemd[1]: Starting openvpn-server@server.service - OpenVPN service for server1...
Feb 09 20:53:42 orangepi3b openvpn[9245]: Note: --cipher is not set. OpenVPN versions before 2.5 defaulted to BF-CBC as>
Feb 09 20:53:42 orangepi3b openvpn[9245]: NOTICE: --explicit-exit-notify ignored for --proto tcp
Feb 09 20:53:42 orangepi3b openvpn[9245]: Note: Kernel support for ovpn-dco missing, disabling data channel offload.
Feb 09 20:53:42 orangepi3b openvpn[9245]: OpenVPN 2.6.14 aarch64-unknown-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] >
Feb 09 20:53:42 orangepi3b openvpn[9245]: library versions: OpenSSL 3.5.4 30 Sep 2025, LZO 2.10
Feb 09 20:53:42 orangepi3b openvpn[9245]: DCO version: N/A
Feb 09 20:53:42 orangepi3b openvpn[9245]: net_route_v4_best_gw query: dst 0.0.0.0
Feb 09 20:53:42 orangepi3b openvpn[9245]: net_route_v4_best_gw result: via 192.168.1.1 dev end1
Feb 09 20:53:42 orangepi3b openvpn[9245]: NOTE: your local LAN uses the extremely common subnet address 192.168.0.x or >
Feb 09 20:53:42 orangepi3b systemd[1]: Started openvpn-server@server.service - OpenVPN service for server1.
Feb 09 20:53:42 orangepi3b openvpn[9245]: TUN/TAP device tun0 opened
Feb 09 20:53:42 orangepi3b openvpn[9245]: net_iface_mtu_set: mtu 1500 for tun0
Feb 09 20:53:42 orangepi3b openvpn[9245]: net_iface_up: set tun0 up
Feb 09 20:53:42 orangepi3b openvpn[9245]: net_addr_v4_add: 10.188.188.1/24 dev tun0
Feb 09 20:53:42 orangepi3b openvpn[9245]: Could not determine IPv4/IPv6 protocol. Using AF_INET
Feb 09 20:53:42 orangepi3b openvpn[9245]: Socket Buffers: R=[131072->131072] S=[16384->16384]
Feb 09 20:53:42 orangepi3b openvpn[9245]: Listening for incoming TCP connection on [AF_INET][undef]:1194
Feb 09 20:53:42 orangepi3b openvpn[9245]: TCPv4_SERVER link local (bound): [AF_INET][undef]:1194
Feb 09 20:53:42 orangepi3b openvpn[9245]: TCPv4_SERVER link remote: [AF_UNSPEC]
Feb 09 20:53:42 orangepi3b openvpn[9245]: MULTI: multi_init called, r=256 v=256
Feb 09 20:53:42 orangepi3b openvpn[9245]: IFCONFIG POOL IPv4: base=10.188.188.2 size=253
Feb 09 20:53:42 orangepi3b openvpn[9245]: MULTI: TCP INIT maxclients=1024 maxevents=1029
Feb 09 20:53:42 orangepi3b openvpn[9245]: Initialization Sequence Completed
首先最后看到 Initialization Sequence Completed 就说明服务已经启动了,然后这里有几个提示和警告解释一下:
- 没有后备加密算法:这个主要是软件版本和加密算法支持问题,如果服务端和客户端都采用较新的版本,忽略即可。
- 在 TCP 模式下不支持断线通知:忽略即可。
- 没有安装加速模块:DCO 是 OpenVPN Data Channel Offload,可以将数据加密/解密从用户空间转移到操作系统内核,显著提升了 VPN 的性能、速度和降低延迟。但考虑到目前是 ARM 平台,以及家用场景下并发与速率都不高,因此暂时不折腾开启这个模块。
- 证书管理冲突:因为作者启用了 duplicate-cn,所以这和 ifconfig-pool-persist 冲突了。
- IP 网段冲突(需要重点关注):因为作者开启了 push,将 192.168.1.0/24 网段进行了路由推送,但这个 IP 网段太常见了,很容易和客户端当前局域网发生冲突,因此这里出现了一个提示。如果产生冲突,解决办法是修改家里局域网的网段,比如改成 192.168.55.0/24
可以再使用 enable 设置开机自启
systemctl enable openvpn-server@server
客户端配置
安装
在此处下载 https://openvpn.net/community-downloads/ 官方社区版客户端
客户端配置文件
可以从服务器上拷贝示例文件:
scp [username]@[ip]:/usr/share/doc/openvpn/examples/sample-config-files/client.conf client1.ovpn
编辑 client1.ovpn 文件**(不要双击导入)**
基础配置
将以下字段修改成实际的服务器配置
- dev:使用路由模式(tun)还是桥接模式(tap)
- proto:使用 udp 协议还是 tcp 协议
- remote:修改为实际的 Hostname/IP 和端口。
证书配置
默认是填写文件路径,也可以使用内联方式,这里推荐使用内联方式,这样只需要保存一个配置文件即可。
将原来的 ca/cert/key 三行内容删除,粘贴服务器上 /etc/openvpn/easy-rsa/pki/inline/private/client1.inline 中的所有内容
cat /etc/openvpn/easy-rsa/pki/inline/private/client1.inline
<cert>
xxxxxxxxxxxxxxxx
</cert>
<key>
xxxxxxxxxxxxxxxx
</key>
<ca>
xxxxxxxxxxxxxxxx
</ca>
再粘贴客户端 client1 TLS Crypt v2 密钥内容(需要手动使用 <tls-crypt-v2></tls-crypt-v2> 进行包裹),即
cat /etc/openvpn/server/tc2-client1.key
得到
<tls-crypt-v2>
xxxxxxx
</tls-crypt-v2>
连接
保存后,双击 client1.ovpn 文件导入配置。在任务栏右键 openvpn 图标后可以选择配置进行连接。连接成功后,客户端分配到的 IP 应该为 10.8.0.2,此时可以通过 10.8.0.1 来访问服务器上的服务。
配置文件参考
已删去注释
服务端
port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
tls-crypt-v2 /etc/openvpn/server/tc2-server.key
dh none
topology subnet
server 10.188.188.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
duplicate-cn
keepalive 10 120
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1
客户端
client
dev tun
proto tcp
remote frp-fog.com 13972
resolv-retry infinite
nobind
persist-key
persist-tun
<cert>
Certificate:
Data:
xxx
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END PRIVATE KEY-----
</key>
<ca>
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
</ca>
remote-cert-tls server
verb 3
<tls-crypt-v2>
-----BEGIN OpenVPN tls-crypt-v2 client key-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OpenVPN tls-crypt-v2 client key-----
</tls-crypt-v2>
运维相关
查看已签发的证书
cat /etc/openvpn/easy-rsa/pki/index.txt
第一列 V 说明证书有效,R 说明证书已吊销。
第二列为过期日期,比如 271229085734Z 即过期时间是 2027-12-29 08:57:34(UTC)
第三列是证书序列号
第四列是客户端名称
查看当前连接的客户端
cat /var/log/openvpn/openvpn-status.log
这里可以看到客户端证书名称,客户端的实际连接 IP 和虚拟局域网中的 IP,接收/发送的流量,连接时间以及加密算法等信息。
参考资料
- https://community.openvpn.net/openvpn/wiki/HOWTO
- https://community.openvpn.net/openvpn/wiki/EasyRSA3-OpenVPN-Howto
- https://community.openvpn.net/openvpn/wiki/IPv6
- https://community.openvpn.net/openvpn/wiki/Systemd
- https://blog.nineya.com/archives/102.html
- https://openwrt.org/zh/docs/guide-user/services/vpn/openvpn/server
本站不记录浏览量,但如果您觉得本内容有帮助,请点个小红心,让我知道您的喜欢。