Хеширование диапазонов IP-адресов - PullRequest
1 голос
/ 30 марта 2011

Предположим, я хочу заблокировать IP-адреса, которые соответствуют любому диапазону из набора диапазонов. Например, я хочу заблокировать IP-адреса в любом из следующих диапазонов: 207.154.0.0 - 207.154.63.255, 216.27.0.0 - 216.27.95.255, 209,59,0,0 - 209,59,31,255

Я думаю, что неэффективно и невозможно хранить все возможные IP-адреса в этих диапазонах в памяти. Если я храню все диапазоны в хэше, мне нужно пройти по всем из них и посмотреть, находится ли IP в каком-либо из диапазонов, так что это кажется неэффективным, так как, вероятно, может быть более 100 000 диапазонов.

Есть ли способ преобразовать IP-адрес в ключ, представляющий диапазон? Так что, если у меня есть IP 207.154.1.0 и 207.154.2.0, они оба отображаются на один и тот же ключ, который представляет диапазон 207.154.0.0 - 207.154.63.255?

Игнорирование проблем / альтернативных решений для блокировки IP-адресов ... Я знаком с iptable, htaccess, подстановочными знаками, регулярными выражениями и т. Д. Какой эффективный способ хранить эти диапазоны IP-адресов в хэше?

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Помня, что каждый IP-адрес (для IPv4) представляет собой группу из 4 8-битных чисел, вы можете просто оставить первые два числа (самые левые 16 бит).Как простое решение.

123.123.xx.yyy -> 123.123 -> двоичное представление этих двух чисел.Это первое число, умноженное на 256 плюс второе число.

// IP address is n1.n2.n3.n4
myHash = n1*256+n2;  // integer value between 0 and 65535
0 голосов
/ 30 марта 2011

Вы можете хешировать IP-адрес в число: для IP-адреса:

aaa.bbb.ccc.ddd

перевести его в нечто вроде: aaabbbcccddd

тогда вам просто нужно сохранить диапазон в памяти:

aaabbbcccddd - eeefffggghhh

, чтобы проверить, заблокирован ли ip, просто хешируйте его в номери сравните с диапазоном в памяти.

0 голосов
/ 30 марта 2011

В зависимости от того, на каком языке вы программируете;Я бы предложил что-то похожее на inet_aton , которое преобразует текстовый IP-адрес ascii в 32-битное целочисленное значение.Вероятно, было бы проще хранить их как целые числа.

Если вы не можете этого сделать, используйте этот псевдокод.

Split IP by octect.
For each octect
  convert octect from ascii to integer.
  shift bits by 4 * (octect number) and add total
aton answer in total.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...