3

我有一个相当大的 IP 和 IP 块列表,我想禁止它们。我的列表是按块完成的,目前采用这样的格式:

1.2.3.4-1.2.3.54
5.6.7.8-5.6.7.8
2.3.4.5-2.3.4.116

我试图通过某种方式将它们放入 MySQL 数据库来找到阻止这些 IP 的最有效方法。当然,我可以将所有块分成单独的 IP,并将它们放在自己的 MySQL 记录中,但是对于大量 IP,这将是非常低效的。阻止整个范围,例如“1.2.3.*”也会导致不必要地禁止大量用户。

有没有办法有效地做到这一点?

4

3 回答 3

5

为什么不使用网络掩码

  • 192.168.1.0/24 块 192.168.1.0 - 182.168.1.255
  • 1.0.0.0/8 块 1.0.0.0 - 1.255.255.255

这样,IPv4 地址只需要 5 个字节。如果您想巧妙地使用掩码,请制作 8 个字节。

这样做的好处是可以非常快速地进行比较,只需将掩码与 IP 进行 OR-ing。这就是 IP 路由的工作原理。

此外,您可以使用 MySQL 函数INET_NTOAINET_ATON将点格式的 IP 地址转换为其数字形式,然后再转换回来,从而使存储高效且易于使用。

于 2012-06-07T19:56:23.283 回答
1

我会有一张这样的桌子:

range | start_number | end_number
------+--------------+-----------

这将分别持有(例如):1.2.3、、454

然后您可以轻松检查连接的 IP 地址是否在该范围内,以及最后一部分是否在start_number和之间end_number

于 2012-06-07T19:57:54.617 回答
1

您可以使用 MySQL INET_ATON() 和 INET_NTOA() 函数。请记住,这些是特定于 MySQL 的,但您也可以使用 php 来实现它们。

这些函数将 IP 地址从点表示法转换为整数。然后,您可以将它们存储在具有“start_ip”和“end_ip”列的表中。当您查询某个 IP 是否被禁止时,您可以使用带有 BETWEEN 的查询。

SELECT * FROM bans WHERE INET_ATON("127.0.0.1") BETWEEN start_ip AND end_ip
于 2012-06-07T20:07:07.727 回答