У меня есть этот 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
).
-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 находится внутри этого списка.
Такой способ организации вашего набора делает время, необходимое для поиска значения, постоянным — независимо от размера вашего набора! Быстрое время отклика всегда важно, когда речь идет о сетевом трафике.
Надеюсь, это поможет лучше понять ситуацию...