如何获取OpenVPN客户端的IP地址。

OpenVPN服务器会为连接到网络外部的每个客户端分配内部IP地址。我希望在分配完后将这些IP地址存储到数据库中。有没有简单的方法可以知道是哪些IP地址由OpenVPN服务器分配出去了?
感谢您的帮助。

你有查看过OpenVPN服务器的日志吗?这只是一个简单的问题,你只需要使用grep命令找到成功登录的日志行,并将其导入到你的数据库工具中。 - tudor -Reinstate Monica-
您可以在ccd目录中使用条目为每个客户端预定义一个IP地址。 - Organic Marble
地址是动态分配的。 - taybinakh
2个回答

如果这些IP地址没有被静态分配,除了从日志文件中提取它们之外,没有其他好的方法来做到这一点,因为连接将随机分配IP地址。
如果这些IP地址是静态分配的,并且您使用的是Open VPN AccessServer,可以按照以下方式操作:
sudo /usr/local/openvpn_as/scripts/sacli UserPropGet

应该返回一个输出中的IP地址列表,大致如下所示:
{
  "<< name_of_user_profile >>": {
    ...
    "conn_ip": "xxx.xxx.xxx.xxx",
    ...
  },
  ...
}

其中 conn_ip 是连接的 IP 地址。


如果你只是想记录用户的IP地址并将该信息存入数据库,那你可以看看这个链接:

OpenVPN连接日志和配置文件在哪里?

在这种情况下,如果你正在使用OpenVPN Access Server,你可能想尝试:
grep "primary virtual IP" /var/log/openvpnas.log** > output_file_name

这将为您提供一个包含与所有用户关联的所有IP地址的文件。从那里,您可以进一步修改输出,以从文件中获取您想要的部分。

谢谢,是的,他的地址是动态分配的。 我会尝试这样做,我的目标是为每个用户应用一条规则,只允许连接某些设备,例如,用户X只能连接到设备X。另外,我必须首先了解每个用户拥有哪些设备,并将其存储在数据库中。 - taybinakh
我已经修改了答案,以便在您的情况下尽可能地满足您的要求 - 它应该适用于几乎任何OpenVPN服务器 - 不仅仅是专业版(需要进行一些修改,例如您的日志名称可能会有所不同)。如果这样就可以了,请将其标记为“已回答”。 - Penguino
谢谢,我会尝试一下。我的情况是当客户端连接时获取IP地址,当他们断开连接时获取已断开连接的IP地址,并且对于任何更改都要更新数据库。我想使用选项: --client connect /path/script_parsing_connected_IP.sh -- client disconnecz /path/script_parsing_disconnected_IP.sh当我尝试后,我会告诉你是否有效。 - taybinakh
1嗨,我按照你告诉我的方法尝试了一下,确实有效。我还编写了一个名为client-connect的脚本,并且可以通过变量env.common_name和ip_config_pool来获取IP地址,也是可以正常工作的...现在我将继续开发我的脚本,在运行时(接收通知)时能够知道客户端连接或断开,并将其存储在数据库中。 - taybinakh
cat /var/log/openvpnas.log | grep "primary virtual IP" 对我来说完美地运行了。 - Sean McCarthy

你应该查看 /etc/openvpn/openvpn-status.log:
OpenVPN CLIENT LIST
Updated,Fri Sep  4 11:07:18 2020
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,11.12.13.14:44444,50000,25000,Fri Sep  4 11:00:54 2020
client2,11.12.13.15:44444,27000,5500,Fri Sep  4 11:00:52 2020
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.7,client1,11.12.13.14:44444,Fri Sep  4 11:06:13 2020
10.8.0.6,client2,client2,11.12.13.15:44444,Fri Sep  4 11:03:56 2020
GLOBAL STATS
Max bcast/mcast queue length,2
END

1我使用了OpenVPN的钩子"--client-connect"和"--learn-address"。通过公共名称和虚拟地址,当用户连接OpenVPN时,脚本会返回这些值。 - taybinakh