编辑:我知道learn-address
我需要使用它来调用脚本(如项目中所指定openvpn-netfilter
)来设置防火墙规则。我想我的问题与脚本更相关config.ovpn
。如何配置client.ovpn
文件以同时了解用户需要哪些路由,同时保持 Internet 流量流向用户的 ISP?
我有一个问题,关于如何制定每个用户的防火墙规则,同时不是通过 OpenVPN 服务器路由互联网流量。我正在尝试为一群朋友和我设置 VPN 服务器,因为我们在做一个项目。我将实现类似这个 Github 项目的东西:https://github.com/gdestuynder/openvpn-netfilteriptables
。这将使 VPN 服务器能够查找用户的 ACL,并在服务器端使用它们。所有其他流量将被丢弃。
对于我自己的家庭 VPN,我知道我可以在配置中使用以下client.ovpn
内容不是通过 VPN 路由互联网流量:
route-nopull
route 192.168.1.0 255.255.255.0
192.168.1.0/24
我的家庭子网在哪里,适配器10.8.0.0/24
的 DHCP IP 范围(未显示)在哪里tun
。我知道将其放置在客户端的配置中会覆盖服务器设置push "redirect-gateway def1 bypass-dhcp"
。
这就是我感到困惑的地方:我已经知道我的家庭子网是192.168.1.0/24
,所以我可以轻松地将其放在client.ovpn
文件中。但如果我不知道我可以访问的子网/IP(大多数用户都不知道),OpenVPN 如何动态地将每个用户的 VPN 规则推送到客户端?
换句话说,如果user1
有权限访问10.0.0.2
和10.0.2.10
并且user2
有权限访问10.0.2.10
和10.0.3.4
,那么在使用相同的通用配置的情况下,OpenVPN 如何知道向每个用户推送正确的路由client.ovpn
?
答案1
您可以使用 client-config-dir 中客户端特定的配置文件将单独的 openvpn 指令推送到您的客户端。
在服务器配置文件中包含指令:
client-config-dir ccd
如果您的 openvpn 路径中不存在此目录,请创建它,例如:
/etc/openvpn/ccd
现在在目录中为每个客户端创建一个配置文件,其名称与客户端的X509ccd
通用名称相同。以下选项在特定于客户端的上下文中是合法的:push
、、、和。push-reset
iroute
ifconfig-push
config
例如将路由推送到user1
证书中带有 CN 的客户端:
echo 'push "route 10.0.0.2 255.255.255.255 10.8.0.1"' >> /etc/openvpn/ccd/user1
echo 'push "route 10.0.2.10 255.255.255.255 10.8.0.1"' >> /etc/openvpn/ccd/user1
为了使其工作,您需要使用指令从服务器拉取客户端上的配置指令pull
。
您可能在客户端配置中有该指令client
,它是一个辅助指令,其扩展如下:
pull
tls-client
不要route-nopull
组合使用,因为它会阻止客户端拉取路由。如果您需要redirect-gateway
在某些客户端上将所有流量路由到 VPN 子网,则可以将此指令仅放在这些客户端配置文件中,而不是放在所有客户端的服务器配置文件中。该redirect-gateway
指令会自动执行路由命令,以使所有传出的 IP 流量通过 VPN 重定向。请参阅男人页。
答案2
对于任何想知道替代答案的人来说,以下内容也应该有用。当您使用脚本时client-connect
,OpenVPN 会将一个参数传递给您的脚本:临时文件的路径,您可以在其中添加push "route 192.168.10.0 255.255.255.0"
类似语句。这可以用作动态 CCD 类文件,而无需生成静态 CCD 文件。