чистка файла списка подсетей от перекрывающихся диапазонов
Коллеги, имея сайт есть потребность отбить посещения ботов. Существуют распространяемые грязные списки подсетей ботов, содержащие в себе частиные дублирования. При попытке скормить такие списки файрволу получаем ошибки вида -
Error: INVALID_ENTRY: Entry '178.ХХХ.240.0/20' overlaps entry '178.ХХХ.248.0/21'
Error: INVALID_ENTRY: Entry 'ХХХ.106.0.0/16' overlaps entry 'ХХХ.106.93.192/26'
приходится ручками открывать файл и удалять дубли. Да, в командной строке я могу отсортировать и оставить только уникальные строки. А вот на очистку от такого рода дублирований знаний не хватает. Подскажите пожалуйста, как это сделать по отношению к файлу kozliki со списком сетей?
Error: INVALID_ENTRY: Entry '178.ХХХ.240.0/20' overlaps entry '178.ХХХ.248.0/21'
Error: INVALID_ENTRY: Entry 'ХХХ.106.0.0/16' overlaps entry 'ХХХ.106.93.192/26'
приходится ручками открывать файл и удалять дубли. Да, в командной строке я могу отсортировать и оставить только уникальные строки. А вот на очистку от такого рода дублирований знаний не хватает. Подскажите пожалуйста, как это сделать по отношению к файлу kozliki со списком сетей?
Вопросы к фаерволу. Ipset берет перекрывающиеся диапазоны без ошибок.При попытке скормить такие списки файрволу получаем ошибки
$: ipset create temp hash:net
$: ipset add temp 178.0.240.0/20
$: ipset add temp 178.0.240.0/21
$: ipset -L
Name: temp
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xa353e61c
Size in memory: 552
References: 0
Number of entries: 2
Members:
178.0.240.0/21
178.0.240.0/20
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE
Можно воспользоваться простеньким скриптом на питоне (важно строго соблюдать отступы). Он подхватит список подсетей из файла ip-listlnx:А вот на очистку от такого рода дублирований знаний не хватает
import ipaddress
import sys
def merge_subnets(ip_list):
# Convert input strings to ipaddress objects (IPv4 or IPv6)
networks = []
for ip_str in ip_list:
try:
networks.append(ipaddress.ip_network(ip_str, strict=False))
except ValueError as e:
print(f"Skipping invalid input: {ip_str} - {e}", file=sys.stderr)
continue
# ipaddress.collapse_addresses automatically handles overlaps and summarization
collapsed = list(ipaddress.collapse_addresses(networks))
return [str(net) for net in collapsed]
if __name__ == "__main__":
with open('ip-list', 'r') as f:
input_list = [line.strip() for line in f.readlines() if line.strip()]
merged_list = merge_subnets(input_list)
print("Original list size:", len(input_list))
print("Cleaned/Merged list:")
for subnet in merged_list:
print(subnet)192.168.1.0/24
192.168.0.0/16
10.0.0.0/24
10.0.1.0/24
10.1.1.1/32Original list size: 5
Cleaned/Merged list:
10.0.0.0/23
10.1.1.1/32
192.168.0.0/16