22

だから私は〜12600のサブネットを持っています:

例えば。123.123.208.0/20

そしてIP。

SQLite データベースや配列などを使用できます

約1か月前に同様の質問がありましたが、1つのサブネットに対して1つのIPをチェックするのではなく、サブネットの束を探しています(明らかに最も効率的な方法で、できればO(合計サブネット)ではありません):)

IP がこれらのサブネットの 1 つであることを確認するにはどうすればよいですか。最適化に役立つ場合は、サブネットではなく true または false が必要です。

現在のリストには同様のサブネットがあります。例: (実際の抜粋)

123.123.48.0/22 <-- not a typo
123.123.48.0/24 <-- not a typo
123.123.90.0/24
123.123.91.0/24
123.123.217.0/24

合計すると、4.xyz から 222.xyz の範囲になります。

4

6 に答える 6

27

最良のアプローチは、ビット単位の演算子を使用する IMO です。たとえば、(=2071670784; これは負の数である可能性があります) を 32 ビットの数値 IP アドレスとして表し、123.123.48.0/22= -1024 をマスクとして表します。これを使用して、同様に、テスト IP アドレスを数値に変換すると、次のことができます。(123<<24)+(123<<16)+(48<<8)+0-1<<(32-22)

(inputIP & testMask) == testIP

たとえば、123.123.49.123 はその範囲にあり、2071671163 & -10242071670784も同様です。

したがって、ここにいくつかのツール機能があります。

function IPnumber(IPaddress) {
    var ip = IPaddress.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
    if(ip) {
        return (+ip[1]<<24) + (+ip[2]<<16) + (+ip[3]<<8) + (+ip[4]);
    }
    // else ... ?
    return null;
}

function IPmask(maskSize) {
    return -1<<(32-maskSize)
}

テスト:

(IPnumber('123.123.49.123') & IPmask('22')) == IPnumber('123.123.48.0')

利回りtrue

マスクが「255.255.252.0」の形式の場合は、マスクに IPnumber 関数も使用できます。

于 2009-02-02T13:37:35.250 に答える
4

ノードネットマスクモジュールを使用してこれを解決できました。次のようにして、IP がサブネットに属しているかどうかを確認できます。

import { Netmask } from 'netmask'

const block = new Netmask('123.123.208.0/20')
const ip = '123.123.208.0'
console.log(block.contains(ip))

ここで印刷しますtrue

次を使用してインストールできます。

npm i --save netmask
于 2015-09-25T14:03:35.593 に答える
3

範囲の下位IPと上位IPを整数に変換し、範囲をデータベースに格納してから、両方の列にインデックスが付けられていることを確認します。

頭のてっぺんから(擬似コード):

function ipmap(w,x,y,z) {
  return 16777216*w + 65536*x + 256*y + z;
}

var masks = array[ipmap(128,0,0,0), ipmap(196,0,0,0), ..., ipmap(255,255,255,255)]

function lowrange(w, x, y, z, rangelength) {
  return ipmap(w, x, y, z) & masks[rangelength]
}

function hirange(w, x, y, z, rangelength) {
  return lowrange(w, x, y, z, ,rangelength) + ipmap(255,255,255,255) - masks[rangelength];
}

それはそれをするべきです。

特定のIPがいずれかの範囲に該当するかどうかを確認するには、それを整数に変換して次のようにします。

SELECT COUNT(*) FROM ipranges WHERE lowrange <= 1234567 AND 1234567 <= highrange

クエリオプティマイザはこれを大幅に高速化できるはずです。

于 2009-02-02T12:42:24.097 に答える