jklincn


使用 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_EXPIREset_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 个文件,分别是

  1. /etc/openvpn/easy-rsa/pki/ca.crt:CA 证书文件
  2. /etc/openvpn/easy-rsa/pki/issued/server.crt:服务端证书文件
  3. /etc/openvpn/easy-rsa/pki/private/server.key:服务端私钥文件
  4. /etc/openvpn/server/tc2-server.key:服务端 TLS Crypt v2 密钥
  5. /etc/openvpn/easy-rsa/pki/issued/client1.crt:客户端 client1 证书文件
  6. /etc/openvpn/easy-rsa/pki/private/client1.key:客户端 client1 私钥文件
  7. /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,接收/发送的流量,连接时间以及加密算法等信息。

参考资料

  1. https://community.openvpn.net/openvpn/wiki/HOWTO
  2. https://community.openvpn.net/openvpn/wiki/EasyRSA3-OpenVPN-Howto
  3. https://community.openvpn.net/openvpn/wiki/IPv6
  4. https://community.openvpn.net/openvpn/wiki/Systemd
  5. https://blog.nineya.com/archives/102.html
  6. https://openwrt.org/zh/docs/guide-user/services/vpn/openvpn/server

本站不记录浏览量,但如果您觉得本内容有帮助,请点个小红心,让我知道您的喜欢。