![获取openvpn分配的地址和设备](https://linux22.com/image/94365/%E8%8E%B7%E5%8F%96openvpn%E5%88%86%E9%85%8D%E7%9A%84%E5%9C%B0%E5%9D%80%E5%92%8C%E8%AE%BE%E5%A4%87.png)
OpenVPN客户端可以动态地分配网络接口设备(例如tun0
)用于与服务器的连接,该服务器可以动态地向客户端发布IP地址。
给定一个启动 OpenVPN 客户端(成功建立服务器连接)的 shell 脚本,我如何从脚本中找到网络接口、分配的客户端 IP 地址和服务器的 IP 地址?
理想的答案是提供一种使用 OpenVPN 工具获取这些数据的方法,而无需做出假设和推论。
答案1
您可以使用up
脚本将信息写入文件系统,然后从脚本中读取它。
通过增加
--script-security 2 --up "/path/to/up.sh /path/to/dir"
调用 时,将执行openvpn
at 的脚本。/path/to/up.sh
它将接收命令行参数,第一个参数将是/path/to/dir
明确写入信息的地方,以便调用的 shell 脚本可以找到它。 OpenVPN(请参阅手册页)将以下参数定义为:
tun_dev tun_mtu link_mtu ifconfig_local_ip ifconfig_remote_ip [ init | restart ]
因此,以下示例脚本将所需信息写入给定目录中的文件:
#!/bin/sh
echo $2 > $1/interface
echo $5 > $1/ip
(--script-security
需要该参数才能允许--up
用户定义脚本。)
一旦知道客户端自己的 IP 地址,就可以根据某些假设推断出服务器的地址:
- 它是子网中第一个可用的地址(OpenVPN 文档说明了这一点)
- 服务器使用的子网掩码已知(以 CIDR 表示法)
假设这些,则伊普计算工具可用于返回服务器的地址:
ipcalc $(</path/to/dir/ip)/$netmask | grep HostMin | awk '{print $2}'
目前,网络掩码事实需要提前商定,除非有某种我不知道的方法可以自动发现这一点。很高兴看到任何解决此问题的答案,或者希望有一个更好的方法来回答不需要使用脚本up
或ipcalc
拼凑的问题。