Ich möchte zwei Dinge tun: Wandeln Sie IP-Adresse Eingänge in CIDR Hier sind einige Beispiele Eingänge:IP-Bereich zu CIDR in Ruby/Rails?
1.1.1.1
192.168.*.* #=> 192.168.0-255.0-255
192.168.1.2-20
1.1.1-10.1-100
Überprüfen Sie, ob eine bestimmte IP-Adresse in jede CIDR fällt. Dies muss eine sehr schnelle Abfrage sein, da es sich um eine sehr häufige Suche in meiner Web-App handelt. Ich denke, so etwas wie dies zu tun:
def matches?(request)
valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) }
!valid.empty?
end
Ich denke Umwandlung IP-Bereiche in CIDR wird Lookups sein lassen schneller als das, was wir jetzt tun, die die IP-Adressen in ganzzahlige Oktetts bricht. Wir indexieren dann die ersten zwei Oktettsätze, um sie teilweise mit IPs abzugleichen. Eine andere Option könnte sein, alles in Ints umzuwandeln und Vergleiche auf diese Weise durchzuführen. Ich mag diese IPAddr.new("1.1.1.1").to_i
zu ints mit etwas umwandeln, aber dann würde ich eine obere und untere IP für jeden Bereich anstatt nur einen einzigen CIDR speichern muß.
Bitte lassen Sie mich wissen, ob ich irgendwelche Mainstream-Ansätze bin mit Blick auf beliebte Edelsteine oder Repo. Vielen Dank!
+1 für NetAddr. Es ist sehr cool. –
Danke dafür. Letztendlich konvertierte ich alles in Ints, indexierte die oberen und unteren IP-Bereiche als Ints, um wirklich schnelle Vergleiche zu machen.Dein Tipp, den NetAddr zu benutzen, half mir, in die richtige Richtung zu kommen. Das Problem mit unserer Umgebung ist, dass Benutzereingaben von bestimmten IP-Bereichen und Platzhaltern CIDR-Lookup viel komplizierter als ich ursprünglich dachte. – John
Umwandlung eines Bereichs in einzelne ips ist OFC "Umwandlung in CIDR (Blöcke)", aber nicht sehr effizient. – Stefan