Как организовать IP-адреса/CIDR при выполнении восстановления ipset?

Как организовать IP-адреса/CIDR при выполнении восстановления ipset?

У меня есть этот bash-скрипт ipset v7.15 (запущен в Ubuntu 22.04), любезно предоставленныйМартин(я внес некоторые изменения в этот вопрос):

ipset create -! blacklist hash:net family inet hashsize 1024
ipset save -! > /tmp/ipset.txt

cat list.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n | while read line; do
    echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset restore -! < /tmp/ipset.txt

содержание list.txt:

125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17

вне /tmp/ipset.txt:

create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
add blacklist 1.0.132.249
add blacklist 125.73.0.0/16
add blacklist 125.74.0.0/15
add blacklist 125.76.0.0/17
add blacklist 130.255.128.0/20

( проблема ipset -L):

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
Size in memory: 696
References: 0
Number of entries: 5
Members:
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17

Как вы можете видеть, IP-адреса/CIDR в blacklistвыводе перепутаны (нет sort).

У Ipset есть такая опция:

-s, -sorted
Sorted output. When listing or saving sets, the entries are listed sorted.

Но я попробовал сделать это с помощью следующей команды, и вывод тот же (без sort. Возможно, я не правильно ее использую):

ipset restore -! -s < /tmp/ipset.txt

А если я уберу -!опцию из restoreкоманды, то получу следующую ошибку:

ipset v7.15: Error in line 1: Set cannot be created: set with the same name already exists

Итак, я думаю, что в моем скрипте есть ошибка, поскольку он добавляет строку, которой, по моему мнению, там быть не должно:

create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6

то я могу удалить saveстроку, чтобы избежать ошибки, оставив ее такой:

ipset -! create blacklist hash:net family inet hashsize 1024
cat list.txt | while read line; do
    echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset -s restore -f /tmp/ipset.txt

Но вывод остается прежним, без сортировки, когда я запускаю ipset -L, так что -sortedопция (-s) не работает вrestore

Как это исправить, чтобы вывод был организован?

решение1

Некоторая справочная информация о ipset: Это инструмент командной строки для управления наборами данных, которые изменяют размер в памяти ядра. Таким образом, ipset — это просто оболочка для вызова фактического кода, который находится внутри ядра — включая код для перечисления содержимого набора. А вот и сложная часть:

Вы передали опцию, что хотели бы иметь вывод набора в сортированном виде - но модуль ядра, отвечающий за это, не знал об этой опции и просто проигнорировал ее. Все функции, которые выполняются в контексте ядра, должны быть быстрыми и могут заморозить вашу систему, если они будут выполняться слишком долго. Вот почему разработчики ядра довольно придирчивы, когда код не является строго необходимым (сортировка затратна с точки зрения процессорного времени и не является необходимой - это можно сделать и в пользовательском пространстве).

Я не знаю, какая версия ядра требуется для "включения" сортированного вывода набора, я тестировал это с версией ядра 6.0.9, где опция сортировки вывода делала то, что должна. Жаль, что они убрали подсказку с некоторых страниц руководства,здесь— это версия страницы руководства, в которой все еще есть эта подсказка.

Набор, находящийся в таком порядке, не является ошибкой, это на самом деле особенность: в списке вам придется пройтись по каждому элементу, чтобы проверить, является ли входящий IP частью этого списка. Это делает каждый поиск зависимым от размера вашего списка. Хэш отличается: Aфункцияиспользуется для вычисления хэш-значения из ваших данных (в данном случае IP). Это хэш-значение используется как ссылка на позицию внутри ваших данных - если там есть запись, IP находится внутри этого списка.

Такой способ организации вашего набора делает время, необходимое для поиска значения, постоянным — независимо от размера вашего набора! Быстрое время отклика всегда важно, когда речь идет о сетевом трафике.

Надеюсь, это поможет лучше понять ситуацию...

Связанный контент