为什么OpenVPN中客户端静态IP分配会失败?

为什么OpenVPN中客户端静态IP分配会失败?

我正在运行 OpenVPN 服务器,并且想要为特定客户端分配一个静态 IP。

这是我的 server.conf。我思考这会将虚拟 IP 池配置为从 10.5.24.209 到 10.5.24.223。

port 443
proto tcp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-auth ta.key 0
topology subnet
server 10.5.24.208 255.255.255.240
#This netmask should span IPs .208-.223.
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 168.xx.xx.xx"
keepalive 10 120
cipher AES-256-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem
client-to-client
client-config-dir ccd

这是 的内容/etc/openvpn/ccd/W7LocalVM,其中 W7LocalVM 是我的客户端的通用名称。我不太明白这个指令的作用,但我认为第一个 IP 应该是我的客户端所需的静态 IP,第二个 IP 应该是我的服务器的 IP。

ifconfig-push 10.5.24.210 10.5.24.209

但是,当我尝试使用此服务器配置连接我的客户端时,出现以下错误:

Mon Aug 07 14:07:34 2017 Set TAP-Windows TUN subnet mode network/local/netmask = 10.5.24.208/10.5.24.210/10.5.24.209 [SUCCEEDED]
Mon Aug 07 14:07:34 2017 MANAGEMENT: Client disconnected
Mon Aug 07 14:07:34 2017 ERROR: --ip-win32 dynamic [offset] : offset is outside of --ifconfig subnet
Mon Aug 07 14:07:34 2017 Exiting due to fatal error

我以为 IP 10.5.24.210 应该在服务器端定义的子网内,但我不明白为什么会出现此错误。有人能帮我解决这个问题吗?

答案1

出现此问题的原因是 openvpn 试图将您的 ifconfig 选项解析为 ip 后跟子网掩码。

根据手册页:

--拓扑模式

...

子网 - 通过使用本地 IP 地址和子网掩码配置 tun 接口来使用子网而不是点对点拓扑,类似于 --dev tap 和以太网桥接模式中使用的拓扑。此模式为每个连接客户端分配一个 IP 地址,并且也适用于 Windows。仅当服务器和客户端是 OpenVPN 2.1 或更高版本,或已使用 --topology 指令代码手动修补的 OpenVPN 2.0.x 时才可用。在 Windows 上使用时,需要 TAP-Win32 驱动程序 8.2 或更高版本。在 *nix 上使用时,要求 tun 驱动程序支持 ifconfig(8) 命令,该命令设置子网而不是远程端点 IP 地址。

该选项存在于 OpenVPN 2.1 或更高版本中。

注意:使用 --topology subnet 会将 --ifconfig 参数的解释更改为“地址网络掩码”,不再是“本地远程”。

--ifconfig l rn

设置 TUN/TAP 适配器参数。l 是本地 VPN 端点的 IP 地址。对于点对点模式下的 TUN 设备,rn 是远程 VPN 端点的 IP 地址。对于 TAP 设备,或与 --topology subnet 一起使用的 TUN 设备rn 是正在创建或连接到的虚拟网段的子网掩码. 对于促进虚拟点对点 IP 连接的 TUN 设备(在 --topology net30 或 p2p 模式下使用时),--ifconfig 的正确用法是使用两个私有 IP 地址,这两个地址不是任何现有正在使用的子网的成员。IP 地址可以是连续的,并且应该在远程对等端上反转它们的顺序。建立 VPN 后,通过 ping rn,您将跨 VPN 进行 ping。

对于 TAP 设备,它提供....

在您的服务器代码中,您将拓扑设置为subnet,然后使用server语句将其推送到客户端。

根据上述文档,您不需要使用“本地”、“远程”地址推送 ifconfig,而是需要将以下内容添加到“/etc/openvpn/ccd/W7LocalVM”:

ifconfig-push 10.5.24.210 255.255.255.252
push route 10.5.24.210 255.255.255.252
# ifconfig 10.5.24.209 255.255.255.252

最后一行可能不需要,但留下来作为 ifconfig-push 在服务器端“应该”做什么以使连接正常工作的示例。

相关内容