3 min read

OpenVPN系列 - 解决1小时准时掉线问题

OpenVPN系列 -  解决1小时准时掉线问题

背景

使用OpenVPN客户端在刚好1个小时准时断开。

问题排查

服务器端配置如下:

port 1194
proto tcp
user nobody
group nogroup
dev tun

### 证书相关配置
ca              certs/ca.crt
cert            certs/server.crt
key             certs/server.key
dh              certs/dh.pem
crl-verify      certs/crl.pem
tls-auth        certs/ta.key 0
tls-version-min 1.2
data-ciphers    AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
cipher          AES-256-GCM
data-ciphers    AES-256-GCM
auth            SHA256
persist-key
persist-tun
### 证书相关配置

# TLS 会话的重新协商时间,默认 3600秒,0为禁用
reneg-sec 0
server 10.255.0.0 255.255.255.0

# 客户端IP持久化文件
ifconfig-pool-persist ipp.txt

# 表示每 15 秒发送心跳Ping包,120秒无响应则断开
keepalive 15 120

### 拓扑模式
# net30:默认模式,每个客户端分配一个/30 的子网,C/S之间点对点实现
# subnet: C/S 之间共享一个子网
# p2p: 点对点模式,服务器和客户端之间直接通信
topology subnet

# 客户端之间相互通信
;client-to-client

### 日志级别
# 0	除了严重错误外不输出任何内容。
# 1	输出启动信息、连接初始化消息以及非致命的加密和网络错误。
# 2	显示 TLS 协商和路由信息。
# 3	默认级别,显示警告和错误信息。
# 4	显示参数信息。
# 5	显示每个从 TCP/UDP 或 tun/tap 发送和接收的数据包信息。
# 6-11	逐渐增加详细程度的调试消息,最高级别(11)会输出所有日志信息。
verb 3

# 客户端断开时,向服务器发送退出通知
explicit-exit-notify 1

# 允许多个客户端使用相同的CN证书连接
#duplicate-cn

# 自定义用户配置路径
client-config-dir /etc/openvpn/ccd

# 状态日志输出路径
status /var/log/openvpn-status.log

# 推送给客户端的路由表
;push "route 10.0.0.0 255.255.255.0"

# 强制客户端将所有网络流量通过 VPN 隧道发送
;push "redirect-gateway def1 bypass-dhcp"

# 推荐客户端DNS地址
;push "dhcp-option DNS 192.168.255.1"
dhcp-option DOMAIN vqiu.cn

# 引用外部插件
plugin /usr/local/openvpn/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
# 不使用客户端证书
verify-client-cert none
username-as-common-name

客户端配置

client
dev tun
proto udp
remote XXX 1194
resolv-retry infinite
nobind
persist-key
persist-tun
key-direction 1
auth-nocache
remote-cert-tls server
ignore-unknown-option block-outside-dns
auth SHA256
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305:AES-256-CBC
verb 3
auth-user-pass
...<省略若干行>...

原因分析

其中客户端侧有个auth-nocache参数。该参数用来防止客户端在重新连接时使用旧的TLS密钥,这意味着会阻止OpenVPN缓存TLS密钥,但每次连接时都会生成新的密钥对,所以就中断了。

问题解决

客户端侧拿掉auth-nocache 参数,同时服务器侧Server.conf文件新增以下配置:


# TLS 会话的重新协商时间,默认 3600秒,0为禁用,这里配置24小时
reneg-sec 86400

# 认证令牌有效时间,单位秒
auth-gen-token 86400

# 推送TLS 会话重新协商时间
push "reneg-sec 86400"