我有一台 OpenVPN 服务器,其 Inet 地址为 10.8.0.1,服务于子网 10.8.0.0/24。我有两个客户端连接到此服务器,状态日志 (/etc/openvpn/openvpn-status.log) 内容如下:
OpenVPN CLIENT LIST
Updated,Wed Aug 9 15:56:38 2017
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,10.0.0.177:54810,4648,4853,Wed Aug 9 15:56:28 2017
client2,10.0.0.224:53999,4731,4935,Wed Aug 9 15:56:16 2017
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.6,client1,10.0.0.177:54810,Wed Aug 9 15:56:28 2017
10.8.0.10,client2,10.0.0.224:53999,Wed Aug 9 15:56:16 2017
GLOBAL STATS
Max bcast/mcast queue length,0
END
现在,在客户端 2 上运行(ifconfig)时,我获得了 tun 接口的以下信息:
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.10 P-t-P:10.8.0.9 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
PtP inet 地址为 10.8.0.9。此接口位于子网的哪里?是在客户端还是在服务器中?从客户端对此接口进行跟踪路由会得到以下信息:
traceroute to 10.8.0.9 (10.8.0.9), 64 hops max
1 10.8.0.1 0.348ms 0.210ms 0.163ms
2 * * *
3 * * *
4 * * *
5 * ^C
现在,如果这就像一个虚拟的 inet 地址,当 OpenVPN 服务器用完了地址并且达到了 254 个 VPN 客户端的限制时,这个 inet 地址是否可以由 OpenVPN 服务器用于客户端?
提前致谢!
答案1
您的 OpenVPN 服务器似乎是使用拓扑 net30 设置的。此拓扑是与在旧版 Windows 上运行的非常老的客户端兼容所必需的。
此拓扑基本上将/24
您分配给 VPN 的子网分成 64 个子网,每个子网的掩码为 30 位。这意味着您最多可以连接 63 个客户端。
在 net30 中,00
(二进制位)和11
地址未使用,01
地址分配给服务器上的 PTP 连接,10
地址在客户端上使用。
因此,对于10.8.0.6,client1,...
客户端来说,子网为10.8.0.4
。广播地址为10.8.0.7
。属于 OpenVPN 服务器的地址是10.8.0.5
(尽管您实际上不会在服务器上看到它被分配),分配给客户端的地址是10.8.0.6
。
$ ipcalc 10.8.0.4/30
Address: 10.8.0.4 00001010.00001000.00000000.000001 00
Netmask: 255.255.255.252 = 30 11111111.11111111.11111111.111111 00
Wildcard: 0.0.0.3 00000000.00000000.00000000.000000 11
=>
Network: 10.8.0.4/30 00001010.00001000.00000000.000001 00
HostMin: 10.8.0.5 00001010.00001000.00000000.000001 01
HostMax: 10.8.0.6 00001010.00001000.00000000.000001 10
Broadcast: 10.8.0.7 00001010.00001000.00000000.000001 11
如今,您最好将服务器切换为使用topology subnet
。此选项将 OpenVPN10.8.0.0/24
作为一个子网,而不是将其拆分为一堆较小的子网。每个客户端将仅使用子网中潜在的 ~253 个可用地址中的 1 个,而不是 net30 中基本上的 4 个。
拓扑模式
在 --dev tun 模式下运行时配置虚拟寻址拓扑。此指令在 --dev tap 模式下无意义,该模式始终使用子网拓扑。如果您在服务器上设置此指令,--server 和 --server-bridge 指令也会自动将您选择的拓扑设置推送到客户端。此指令也可以手动推送到客户端。与 --dev 指令一样,此指令必须始终在客户端和服务器之间兼容。
模式可以是以下之一:
net30 — 使用点对点拓扑,为每个客户端分配一个 /30 子网。当部分或全部连接客户端可能是 Windows 系统时,这旨在允许点对点语义。这是 OpenVPN 2.0 上的默认设置。
子网 - 通过使用本地 IP 地址和子网掩码配置 tun 接口来使用子网而不是点对点拓扑,类似于 --dev tap 和以太网桥接模式中使用的拓扑。此模式为每个连接客户端分配一个 IP 地址,并且也适用于 Windows。仅当服务器和客户端是 OpenVPN 2.1 或更高版本,或已使用 --topology 指令代码手动修补的 OpenVPN 2.0.x 时才可用。在 Windows 上使用时,需要 TAP-Win32 驱动程序 8.2 或更高版本。在 *nix 上使用时,要求 tun 驱动程序支持 ifconfig(8) 命令,该命令设置子网而不是远程端点 IP 地址。