OpenVPN:仅通过 vpn 路由特定子网 - 适用于单个 IP 地址

run*_*g.t 5 vpn routing openvpn subnet

我试图通过开放的 vpn 只路由特定的子网/单个。

我已经在超级用户上阅读了几个这样的问题,甚至找到了 对我的问题的很好的答案

所以我现在可以通过 vpn 路由单个 IP 地址。为此,我在以下内容中添加了类似的内容/etc/openvpn/client.conf

route-nopull

route 1.2.3.4 255.255.255.255
route 5.6.7.8 255.255.255.255
route 9.10.11.12 255.255.255.255
Run Code Online (Sandbox Code Playgroud)

然而,这仅解决了我的问题的一半,因为我想做的是通过 vpn 路由特定的子网,而不仅仅是单个地址。

我试过跟随

route x.y.19.178 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

我相信,这应该通过 vpn 将整个流量路由到 xy19.178/24 子网,但事实并非如此。相反,我可以在系统日志中看到以下错误:

Dec 18 16:11:01 wi-dev ovpn-client[31421]: /sbin/ip route add x.y.19.178/24 via z.a.0.1
Dec 18 16:11:01 wi-dev ovpn-client[31421]: ERROR: Linux route add command failed: external program exited with error status: 2 
Run Code Online (Sandbox Code Playgroud)

知道我的客户端(或服务器)配置可能有什么问题吗?

hea*_*vyd 6

您的网络掩码对于您使用的 IP 地址无效。具体来说,如果你获取你的 IP 地址并将它们转换为二进制,你会得到:

IP   = x.y.19.178            = XXXXXXXX.YYYYYYYY.00010011.10110010
MASK = 255.255.255.252 (/30) = 11111111.11111111.11111111.11111100
Run Code Online (Sandbox Code Playgroud)

为了使 IP 地址对子网有效,IP 必须位于子网的开头,或者以二进制形式,IP 只能有1s,而子网掩码有1s。因此,如果我们1从 IP 中删除最后一个,我们将得到:

IP   = x.y.19.176            = 00001010.00000000.00010011.10110000
Run Code Online (Sandbox Code Playgroud)

因此,您的子网的开头实际上应该是x.y.19.176. 如果您想要一个不同于/30. 我用这个工具做了一些计算。

另请注意:如果您只是在命令行运行日志中给出的命令

/sbin/ip route add x.y.19.178/24 via z.a.0.1
Run Code Online (Sandbox Code Playgroud)

你会得到错误。在我的机器上,我得到了“无效参数”,而这个命令成功了:

/sbin/ip route add 192.168.19.176/24 via 192.168.0.1
Run Code Online (Sandbox Code Playgroud)