voglio fare due cose: Convertire ingressi indirizzo IP in CIDR Qui ci sono alcuni input di esempio:Intervallo IP su 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
Verificare se un dato indirizzo IP rientra in una CIDR. Questa deve essere una query molto veloce, in quanto è una ricerca molto comune nella mia app web. Sto pensando di fare qualcosa di simile:
def matches?(request)
valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) }
!valid.empty?
end
Penso convertire intervalli di indirizzi IP in CIDR lascerò che le ricerche più veloce di quello che stiamo facendo ora, che sta rompendo in ottetti interi del IP. Quindi indicizziamo i primi due set di ottetti parzialmente corrispondenti agli IP. Un'altra opzione potrebbe essere la conversione di tutto in int e fare confronti in questo modo. Mi piacerebbe convertire in int con qualcosa di simile a questo IPAddr.new("1.1.1.1").to_i
ma poi avrei bisogno di memorizzare un IP superiore e inferiore per ogni intervallo invece di un solo CIDR.
Per favore fatemi sapere se sto trascurando qualsiasi approccio tradizionale, gemme popolari o repo. Grazie!
+1 per NetAddr. È molto bello. –
Grazie per questo. Ho finito per convertire tutto in int, indicizzando gli intervalli di ip superiore e inferiore come ints per fare confronti veramente veloci.Il tuo consiglio di usare NetAddr mi ha aiutato a portarmi nella giusta direzione. Il problema con il nostro ambiente è che gli input dell'utente di specifici intervalli ip e caratteri jolly renderebbero la ricerca CIDR molto più complicata di quanto pensassi inizialmente. – John
la conversione di un intervallo in single ips è di "conversione in CIDR (blocchi)", ma non molto efficiente. – Stefan