如何在 OpenVPN 中设置静态 IP(客户端)?

Mor*_*ski 13 openvpn linux-networking

我正在建立一个带有很多小设备(运行 OpenWRT)的 VPN 网络。在我的用例中,设备都由一个数字标识,我希望它们的 ip 地址与它们的 ID 匹配(例如:设备编号 6 将在 XXX6 中有一个 ip)。

我知道的client-config-dirifconfig-push,而是因为我所有的设备都使用相同的证书(我不能使用它们duplicate-cn启用)。这是一个要求,因为为每个设备生成一个证书会过于受限(此外,如果我们在系统中添加设备,我们不想更改 VPN 服务器的配置)

是否可以在客户端配置文件中设置 IP 地址?我在文档中没有找到关于该特定主题的任何内容......而且我尝试的一切都没有成功。

基本上,我想到的是以下内容:

  • 客户端连接到 VPN 服务器并询问特定地址(“给我 ip:172.16.0.22”)
  • 如果地址已经被占用,则握手失败。如果是免费的,客户会得到他之前问过的地址

小智 10

假设我们正在建立一个公司 VPN,我们想为 3 类不同的用户建立单独的访问策略:

System administrators -- full access to all machines on the network
Employees -- access only to Samba/email server
Contractors -- access to a special server only
Run Code Online (Sandbox Code Playgroud)

我们将采用的基本方法是 (a) 将每个用户类别隔离到其自己的虚拟 IP 地址范围中,以及 (b) 通过设置关闭客户端虚拟 IP 地址的防火墙规则来控制对机器的访问。

在我们的示例中,假设我们有可变数量的员工,但只有一名系统管理员和两名承包商。我们的IP分配方式是将所有员工放入一个IP地址池中,然后为系统管理员和承包商分配固定的IP地址。

请注意,此示例的先决条件之一是您在 OpenVPN 服务器计算机上运行了软件防火墙,这使您能够定义特定的防火墙规则。对于我们的示例,我们假设防火墙是 Linux iptables。

首先,让我们根据用户类别创建一个虚拟 IP 地址映射:

Class   Virtual IP Range    Allowed LAN Access  Common Names  

Employees   10.8.0.0/24     Samba/email server at 10.66.4.4     [variable]

Sys Admins  10.8.1.0/24     Entire 10.66.4.0/24 subnet  sysadmin1

Contractors 10.8.2.0/24     Contractor server at 10.66.4.12     contractor1, contractor2
Run Code Online (Sandbox Code Playgroud)

接下来,让我们将此映射转换为 OpenVPN 服务器配置。首先,请确保您已按照上述步骤将 10.66.4.0/24 子网提供给所有客户端(虽然我们将配置路由以允许客户端访问整个 10.66.4.0/24 子网,然后我们将强加访问限制使用防火墙规则来实现上述策略表)。

首先,为我们的 tun 接口定义一个静态单元号,以便我们稍后在防火墙规则中引用它:

dev tun0
Run Code Online (Sandbox Code Playgroud)

在服务器配置文件中,定义Employee IP地址池:

server 10.8.0.0 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

为系统管理员和承包商 IP 范围添加路由:

route 10.8.1.0 255.255.255.0
route 10.8.2.0 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

因为我们将为特定的系统管理员和承包商分配固定的 IP 地址,所以我们将使用客户端配置目录ccd

client-config-dir ccd
Run Code Online (Sandbox Code Playgroud)

现在将特殊配置文件放在ccd子目录中,为每个非员工 VPN 客户端定义固定 IP 地址,如下所示。

ccd/sysadmin1 文件:

    ifconfig-push 10.8.1.1 10.8.1.2
Run Code Online (Sandbox Code Playgroud)

ccd/contractor1 文件:

    ifconfig-push 10.8.2.1 10.8.2.2
Run Code Online (Sandbox Code Playgroud)

ccd/contractor2 文件:

    ifconfig-push 10.8.2.5 10.8.2.6
Run Code Online (Sandbox Code Playgroud)

每对 ifconfig-push 地址代表虚拟客户端和服务器 IP 端点。它们必须取自连续的 /30 子网才能与 Windows 客户端和 TAP-Windows 驱动程序兼容。具体来说,每个端点对的 IP 地址中的最后一个八位字节必须从这个集合中获取:

[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
Run Code Online (Sandbox Code Playgroud)

这样就完成了 OpenVPN 的配置。最后一步是添加防火墙规则以最终确定访问策略。

来源:https : //openvpn.net/index.php/open-source/documentation/howto.html#policy


小智 8

您应该可以使用ifconfig-pool-persistconfig 选项执行此操作。您可以预先配置该文件并设置seconds = 0为告诉 OpenVPN 仅读取该文件。

我们使用它来确保在通过 VPN 连接时为同一用户分配相同的 IP 以进行审计。

手册页

--ifconfig-pool-persist file [seconds] 将 ifconfig-pool 数据持久化/取消持久化到文件,以秒为间隔(默认值 = 600),以及在程序启动和关闭时。此选项的目标是在客户端(由它们的通用名称表示)和从 ifconfig-pool 分配给它们的虚拟 IP 地址之间提供长期关联。保持长期关联对客户端有好处,因为它允许他们有效地使用 --persist-tun 选项。

file 是一个逗号分隔的 ASCII 文件,格式为 ,。

如果 seconds = 0,文件将被视为只读。如果您想将文件视为配置文件,这将非常有用。

请注意,此文件中的条目仅被 OpenVPN 视为建议,基于公共名称和 IP 地址之间的过去关联。他们不保证给定的通用名称将始终接收给定的 IP 地址。如果您想要保证分配,请使用 --ifconfig-push


小智 6

我在配置@jas_raj 时遇到了一些问题。现在我正在做下一个:

1) 在 /etc/openvpn 中创建一个新文件夹。例如“目录

2) server.conf 添加行“ client-config-dir dir/

3)在“dir”中,您需要创建一个与您在证书中写入的名称相同的新文件**并键入:

ifconfig-push IP MASK

例如: ifconfig-push 10.0.0.10 255.0.0.0