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

これらの IP をどうにかして 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 を単純に論理和するだけで、非常に高速に比較できるという利点があります。これが IP ルーティングのしくみです。

また、MySQL 関数のINET_NTOAおよびINET_ATONを使用して、ドット形式の IP アドレスを数値形式に変換したり、逆形式に変換したりして、ストレージを効率的かつ簡単に操作できるようにすることができます。

于 2012-06-07T19:56:23.283 に答える
1

私は次のようなテーブルを持っています:

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

どちらが保持されますか (たとえば): 1.2.34、および54それぞれ。

次に、接続している 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 に答える