chcę zrobić dwie rzeczy: Konwersja wejść adresowych IP na CIDR Oto kilka przykładowych wejść:Zakres IP do CIDR w 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
Sprawdź, czy dany adres IP wpada w dowolnym CIDR. To musi być bardzo szybkie zapytanie, ponieważ jest to bardzo popularne wyszukiwanie w mojej aplikacji internetowej. Mam na myśli zrobienie czegoś takiego: waha
def matches?(request)
valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) }
!valid.empty?
end
myślę konwersji IP na CIDR pozwoli wyszukiwań być szybsze niż to, co robimy teraz, który włamuje się do całkowitych oktety OD użytkownika. Następnie indeksujemy pierwsze dwa zestawy oktetów, aby częściowo dopasować do adresów IP. Inną opcją może być zamiana wszystkiego na int i porównywanie w ten sposób. Przerobiłem na ints z czymś podobnym do tego: IPAddr.new("1.1.1.1").to_i
, ale wtedy musiałbym przechowywać górny i dolny adres IP dla każdego zakresu zamiast tylko jednego CIDR.
Proszę, daj mi znać, jeśli przeoczyłem jakiekolwiek popularne podejścia, popularne klejnoty lub repozytorium. Dzięki!
+1 dla NetAddr. To jest bardzo fajne. –
Dzięki za to. Skończyło się na tym, że konwertowałem wszystko na int, indeksując górne i dolne zakresy IP jako int do robienia naprawdę szybkich porównań.Twoja wskazówka, aby użyć NetAddr, pomogła mi we właściwym kierunku. Problem z naszym środowiskiem polega na tym, że wprowadzanie przez użytkownika określonych zakresów ip i symboli wieloznacznych sprawiłoby, że wyszukiwanie CIDR było znacznie bardziej skomplikowane, niż początkowo sądziłem. – John
Konwersja zakresu na pojedyncze ips jest "konwertowaniem na CIDR (bloki)", ale niezbyt wydajna. – Stefan