чистка файла списка подсетей от перекрывающихся диапазонов

php, apache, mysql, snort...


Ответить
lnx
Сообщения: 354
Зарегистрирован: 24.08.2022

#

Коллеги, имея сайт есть потребность отбить посещения ботов. Существуют распространяемые грязные списки подсетей ботов, содержащие в себе частиные дублирования. При попытке скормить такие списки файрволу получаем ошибки вида -

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 со списком сетей?
ALiEN
Аватара пользователя
Сообщения: 433
Зарегистрирован: 23.08.2022

#

При попытке скормить такие списки файрволу получаем ошибки
Вопросы к фаерволу. 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

lnx
Сообщения: 354
Зарегистрирован: 24.08.2022

#

ALiEN:Вопросы к фаерволу.
Я так и не смог понять, зачем делать файрволы, когда есть iptable, которым и обошелся. Отмечено, что козлики каждый российский ip простукивают сотню, другую раз. А на иностранные времени не тратят.
ar23n
Сообщения: 2
Зарегистрирован: 08.12.2025

#

lnx:А вот на очистку от такого рода дублирований знаний не хватает
Можно воспользоваться простеньким скриптом на питоне (важно строго соблюдать отступы). Он подхватит список подсетей из файла ip-list
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)
Например ip-list с таким содержанием
192.168.1.0/24
192.168.0.0/16
10.0.0.0/24
10.0.1.0/24
10.1.1.1/32
Будет обработан и выведен в терминал в таком виде
Original list size: 5
Cleaned/Merged list:
10.0.0.0/23
10.1.1.1/32
192.168.0.0/16
Ответить