如何向Ubuntu 22.04上的OpenVPN服务器发送自定义环境变量以获取更多客户端设备日志信息
看起来你已经走对了一半路——用client-connect/disconnect脚本来捕获客户端事件,但在自定义变量的传输上踩了几个小坑。我来帮你梳理正确的配置步骤,让自定义变量能顺利从客户端传到服务端脚本里:
1. 先把服务端配置的基础项补全
首先,服务端得明确允许接收客户端的peer信息,还要指定脚本路径。打开你的OpenVPN服务端配置文件(一般是/etc/openvpn/server.conf),确保添加以下配置:
# 告诉客户端要发送peer信息给服务端 push-peer-info # 客户端连接时触发的脚本路径 client-connect /etc/openvpn/scripts/connect-handler.sh # 客户端断开时触发的脚本路径 client-disconnect /etc/openvpn/scripts/disconnect-handler.sh
别忘了给脚本加上执行权限,不然服务端跑不了:
chmod +x /etc/openvpn/scripts/connect-handler.sh chmod +x /etc/openvpn/scripts/disconnect-handler.sh
2. 客户端配置:自定义变量必须加IV_前缀
这是你之前的核心问题——OpenVPN客户端只会主动传输以IV_开头的变量到服务端,非IV_前缀的(比如你用的UV_TEST)会被忽略,所以日志里根本看不到。
修改你的客户端.ovpn配置,把自定义变量改成IV_前缀:
# 自定义测试变量,必须以IV_开头 setenv IV_TEST "test1" # 可以再加一个比如设备ID的变量 setenv IV_DEVICE_TAG "office-win-laptop"
另外,push-peer-info不需要写在客户端配置里,这个是服务端推给客户端的指令,让客户端知道要发peer信息,所以放在服务端配置里就够了。
3. 在脚本里获取自定义变量
当客户端连接时,服务端会把客户端发送的IV_*变量转换成以peer_info_为前缀的环境变量,供client-connect脚本使用。比如客户端的IV_TEST,在脚本里就是$peer_info_IV_TEST。
给你个示例脚本connect-handler.sh,用来记录这些信息:
#!/bin/bash # 日志文件路径,确保OpenVPN进程有写入权限 LOG_FILE="/var/log/openvpn/client-activity.log" # 记录连接时间、客户端CN、公网IP和自定义变量 echo "$(date '+%Y-%m-%d %H:%M:%S') - 客户端连接: CN=$common_name, 公网IP=$trusted_ip, 测试变量=$peer_info_IV_TEST, 设备标签=$peer_info_IV_DEVICE_TAG" >> $LOG_FILE
脚本里还能用到OpenVPN默认提供的环境变量,比如$common_name(客户端证书的通用名)、$trusted_ip(客户端的公网IP),这些都能帮你更详细地记录客户端信息。
4. 验证配置是否生效
重启OpenVPN服务让配置生效:
systemctl restart openvpn@server
然后用客户端连接VPN,之后查看服务端的OpenVPN主日志:
tail -f /var/log/openvpn/server.log
现在你应该能看到自定义的peer info条目了:
2024-09-11 07:31:09 us=326572 192.168.175.1:49395 peer info: IV_TEST=test1
2024-09-11 07:31:09 us=326583 192.168.175.1:49395 peer info: IV_DEVICE_TAG=office-win-laptop
再看看脚本生成的日志:
tail -f /var/log/openvpn/client-activity.log
就能看到你需要的自定义信息已经被记录下来啦!
备注:内容来源于stack exchange,提问作者dzboot02

