Разделение диапазонов

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

Разделение диапазонов — хитрая программа для разбиения одного диапазона на несколько.

Как бы пора

Описание[править]

Как известно, каждый регистр IP-адреса содержит в себе как бы два подрегистра вдвое меньшего размера, например в подсети /16 имеется две подсети размером в /17, четыре подсети /18 и так далее. Но руками раскурлыкивать это напряжно.

Но в том возникла надобность из-за вандальных атак со стороны дятла, который стал назойливо долбить в стиле вонючей мухи. При этом он использовал очень разные диапазоны, но была проблема, а именно в части диапазонов могли сидеть нормальные русские аноны.

Встал вопрос о проверке, которую надо было проводить по диапазонам. Был оперативно найден программист, который стал внимательно изучать диапазон на предмет наличия определённых стран, которые не следует блокировать надолго. В итоге появилось целое семейство скриптов для разделения.

Работает это всё на Python, запуск можно спокойно сделать из Power Shell или даже крестьянского cmd.

Код[править]

split_16_to_19.py[править]

import sys
import ipaddress

def clean_cidr(raw_line):
    """
    Fixes two common problems in your .txt file:
    1. UTF-16 encoding → removes \x00 null bytes
    2. Spaces between every character → "1 2 8 . 2 2 5 . 0 . 0 / 1 6" becomes "128.225.0.0/16"
    """
    if not raw_line:
        return ""
    
    # Remove null bytes (UTF-16 artifact)
    cleaned = raw_line.replace('\x00', '')
    
    # Remove ALL whitespace and join the characters back together
    cleaned = ''.join(cleaned.split())
    
    return cleaned

def split_16_to_19(input_file, output_file=None):
    """
    Reads your .txt file (even if it's UTF-16 or has weird spacing)
    and expands every /16 into 8 /19 subnets.
    """
    output_lines = []
    
    # Try multiple encodings until one works (your file is likely UTF-16)
    encodings = ['utf-8', 'utf-16', 'utf-16-le', 'windows-1252']
    content = None
    used_encoding = None
    
    for enc in encodings:
        try:
            with open(input_file, 'r', encoding=enc, errors='replace') as f:
                content = f.readlines()
            used_encoding = enc
            print(f"✅ Successfully opened file using {enc} encoding.")
            break
        except Exception:
            continue
    
    if content is None:
        # Fallback: read as raw bytes and clean
        with open(input_file, 'rb') as f:
            raw = f.read()
        content = raw.decode('utf-8', errors='replace').splitlines()
        print("✅ Opened file with fallback raw decoding.")

    for line_num, line in enumerate(content, 1):
        cidr = clean_cidr(line)
        
        if not cidr or cidr.startswith('#'):
            continue  # skip empty lines and comments
        
        try:
            net = ipaddress.ip_network(cidr, strict=False)
            
            if net.version != 4:
                print(f"Warning: Line {line_num} is not IPv4 - skipping", file=sys.stderr)
                continue
                
            if net.prefixlen != 16:
                print(f"Warning: Line {line_num} '{cidr}' is not a /16 (found /{net.prefixlen})", file=sys.stderr)
            
            # Split into exactly 8 /19 subnets
            for subnet in net.subnets(new_prefix=19):
                output_lines.append(str(subnet) + '\n')
                
        except ValueError as e:
            print(f"Error on line {line_num} after cleaning '{cidr}': {e}", file=sys.stderr)

    if not output_lines:
        print("❌ No valid /16 ranges found after cleaning. Check your file.")
        return

    if output_file:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.writelines(output_lines)
        print(f"✅ Done! Wrote {len(output_lines)} /19 ranges to '{output_file}'")
    else:
        sys.stdout.writelines(output_lines)
        print(f"✅ Done! Printed {len(output_lines)} /19 ranges to console")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage:")
        print("  python split_16_to_19_fixed.py your_ranges.txt")
        print("  python split_16_to_19_fixed.py your_ranges.txt output_19s.txt")
        print("\n(The script now automatically fixes UTF-16 null bytes and spaces between digits.)")
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2] if len(sys.argv) > 2 else None
    split_16_to_19(input_file, output_file)

split_19_to_21.py[править]

import sys
import ipaddress

def clean_cidr(raw_line):
    """
    Fixes two common problems in .txt files:
    1. UTF-16 encoding → removes \x00 null bytes
    2. Spaces between every character → "1 2 8 . 2 2 5 . 0 . 0 / 1 9" becomes "128.225.0.0/19"
    """
    if not raw_line:
        return ""
    
    # Remove null bytes (UTF-16 artifact)
    cleaned = raw_line.replace('\x00', '')
    
    # Remove ALL whitespace and join the characters back together
    cleaned = ''.join(cleaned.split())
    
    return cleaned

def split_19_to_21(input_file, output_file=None):
    """
    Reads a .txt file containing one IPv4 /19 CIDR per line
    (even if it's UTF-16 or has weird spacing)
    and expands each into its 4 corresponding /21 subnets.
    """
    output_lines = []
    
    # Try multiple encodings until one works (your previous file was likely UTF-16)
    encodings = ['utf-8', 'utf-16', 'utf-16-le', 'windows-1252']
    content = None
    used_encoding = None
    
    for enc in encodings:
        try:
            with open(input_file, 'r', encoding=enc, errors='replace') as f:
                content = f.readlines()
            used_encoding = enc
            print(f"✅ Successfully opened file using {enc} encoding.")
            break
        except Exception:
            continue
    
    if content is None:
        # Fallback: read as raw bytes and clean
        with open(input_file, 'rb') as f:
            raw = f.read()
        content = raw.decode('utf-8', errors='replace').splitlines()
        print("✅ Opened file with fallback raw decoding.")

    for line_num, line in enumerate(content, 1):
        cidr = clean_cidr(line)
        
        if not cidr or cidr.startswith('#'):
            continue  # skip empty lines and comments
        
        try:
            net = ipaddress.ip_network(cidr, strict=False)
            
            if net.version != 4:
                print(f"Warning: Line {line_num} is not IPv4 - skipping", file=sys.stderr)
                continue
                
            if net.prefixlen != 19:
                print(f"Warning: Line {line_num} '{cidr}' is not a /19 (found /{net.prefixlen})", file=sys.stderr)
            
            # Split into exactly 4 /21 subnets
            for subnet in net.subnets(new_prefix=21):
                output_lines.append(str(subnet) + '\n')
                
        except ValueError as e:
            print(f"Error on line {line_num} after cleaning '{cidr}': {e}", file=sys.stderr)

    if not output_lines:
        print("❌ No valid /19 ranges found after cleaning. Check your file.")
        return

    if output_file:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.writelines(output_lines)
        print(f"✅ Done! Wrote {len(output_lines)} /21 ranges to '{output_file}'")
    else:
        sys.stdout.writelines(output_lines)
        print(f"✅ Done! Printed {len(output_lines)} /21 ranges to console")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage:")
        print("  python split_19_to_21.py your_19_ranges.txt")
        print("  python split_19_to_21.py your_19_ranges.txt output_21s.txt")
        print("\n(The script automatically fixes UTF-16 null bytes and spaces between digits if needed.)")
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2] if len(sys.argv) > 2 else None
    split_19_to_21(input_file, output_file)

split_21_to_24.py[править]

import sys
import ipaddress

def clean_cidr(raw_line):
    """
    Fixes two common problems in .txt files:
    1. UTF-16 encoding → removes \x00 null bytes
    2. Spaces between every character → "1 2 8 . 2 2 5 . 0 . 0 / 2 1" becomes "128.225.0.0/21"
    """
    if not raw_line:
        return ""
    
    # Remove null bytes (UTF-16 artifact)
    cleaned = raw_line.replace('\x00', '')
    
    # Remove ALL whitespace and join the characters back together
    cleaned = ''.join(cleaned.split())
    
    return cleaned

def split_21_to_24(input_file, output_file=None):
    """
    Reads a .txt file containing one IPv4 /21 CIDR per line
    (even if it's UTF-16 or has weird spacing)
    and expands each into its 8 corresponding /24 subnets.
    """
    output_lines = []
    
    # Try multiple encodings until one works (your previous files were likely UTF-16)
    encodings = ['utf-8', 'utf-16', 'utf-16-le', 'windows-1252']
    content = None
    used_encoding = None
    
    for enc in encodings:
        try:
            with open(input_file, 'r', encoding=enc, errors='replace') as f:
                content = f.readlines()
            used_encoding = enc
            print(f"✅ Successfully opened file using {enc} encoding.")
            break
        except Exception:
            continue
    
    if content is None:
        # Fallback: read as raw bytes and clean
        with open(input_file, 'rb') as f:
            raw = f.read()
        content = raw.decode('utf-8', errors='replace').splitlines()
        print("✅ Opened file with fallback raw decoding.")

    for line_num, line in enumerate(content, 1):
        cidr = clean_cidr(line)
        
        if not cidr or cidr.startswith('#'):
            continue  # skip empty lines and comments
        
        try:
            net = ipaddress.ip_network(cidr, strict=False)
            
            if net.version != 4:
                print(f"Warning: Line {line_num} is not IPv4 - skipping", file=sys.stderr)
                continue
                
            if net.prefixlen != 21:
                print(f"Warning: Line {line_num} '{cidr}' is not a /21 (found /{net.prefixlen})", file=sys.stderr)
            
            # Split into exactly 8 /24 subnets
            for subnet in net.subnets(new_prefix=24):
                output_lines.append(str(subnet) + '\n')
                
        except ValueError as e:
            print(f"Error on line {line_num} after cleaning '{cidr}': {e}", file=sys.stderr)

    if not output_lines:
        print("❌ No valid /21 ranges found after cleaning. Check your file.")
        return

    if output_file:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.writelines(output_lines)
        print(f"✅ Done! Wrote {len(output_lines)} /24 ranges to '{output_file}'")
    else:
        sys.stdout.writelines(output_lines)
        print(f"✅ Done! Printed {len(output_lines)} /24 ranges to console")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage:")
        print("  python split_21_to_24.py your_21_ranges.txt")
        print("  python split_21_to_24.py your_21_ranges.txt output_24s.txt")
        print("\n(The script automatically fixes UTF-16 null bytes and spaces between digits if needed.)")
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2] if len(sys.argv) > 2 else None
    split_21_to_24(input_file, output_file)
Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++ScalaH и Ё+Программист-бетонщик
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)Тернарный операторUnreal MCPИсходный кодSingle-Page ApplicationGiteaForgejoCephIDEДжуниорРепозиторийPostgreSQLSQLiteJQueryБуферWebGLПереполнение буфераХардкодInvoke-WebRequestСкрипт для автоблокировки новых пользователейРазделение диапазоновПроверка диапазоновGeoLite2-Country.mmdbObjective-C
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автоматПроцедурное программированиеПоиск файлов в Unix по содержимомуPetoohФункция активации нейронаПерегрузка операторов в PythonЗерокодинг
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++XenonRecompFuse.jsОптимизацияТестированиеAmbreon866Реверс-инжинирингКроссплатформенностьJSON
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур ПейпертПроблемаK!ockyTypeScriptОтладчикБитЭффективный менеджер (IT)TauriReact NativeWindows APIТипPyTorchTensorFlowПарсерNode.jsFastAPIVue.jsSvelteБэкендElectronBroken Object Level AuthorizationМаппингДжастин ФранкельHex-редакторVisual Basic .NETNext.jsDocker ComposeNode modulesIndexedDBDos2unix
Прочее++i + ++iДедлайн%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодачХукCurl cffiВибе-кодингFlutterАппликативный оператор
Internet2.png Великая сеть, которая переменила течения мира
Это интернет, деткаИнтернетыДаркнетУведомления в браузереВеб-скрейпингWWWПросмотр стрима в фонеWeb ArchiveИнфоповодОткрытый проксиСайтБраузеркаБугагашечкиДейтингЗаработокИдентификация пользователейИмиджбордаИмиджхостингИнтернет-магазинИнтернет-сервисыПокровитель интернетовКаталог сайтовАссоциация блогеров и агентствОлдфагЧебурнетАнкетаАватарИзоляция российских сайтовВидеохостингТильтGoogle дуракИнфобизнесменStalinism.ruРеестр запрещённых сайтовФайлообменникФотобанкХакеры, крекеры, спамы, кукиЗакат эпохи анонимусаТроллингВеб 3.0Интернет-энциклопедияСтриминговый сервисБлокировщики рекламыВеб-камераИнтернет-знаменитостьGoogle ChromeOperaMozilla FirefoxSafariFirefoxHttpHTTPSКритерий ХомакаРейтингИИ уничтожит TikTok, Instagram и OnlyFansСлопRGBOneDriveВсемирная атака на ИнтернетSignal упал во время падения AmazonChatGPT AtlasОшибка 403R:Anon ЧатДефейсингTimewebУничтожение ИнтернетаКиберпандемияБиометрия хуже пароляПодтверждение возрастаVLESSПодтверждение возраста как исполнение пророчеств про начертание ЗверяГеолокация в Твиттере (X)ВконтактеАнонимус не забываетРазновидности VPNБлокировка соцсетей для детейБелый списокVoice Over Translation
ИнтересноеПеревод в онлайнОблачное хранилище404 ошибкаДвухфакторная авторизацияВикипедияЭлектронная почтаРунетX (ранее Твиттер)HTML5Moswar.ruRu-CenterCerberxБизнес 18+ПИОННенавистьПолитика предотвращения распространения ватной чумыЭджлордВидеоПанорамное видео 360Нейтралитет в информационной войнеПервый поток влогеров рунетаЛысый из BrazzersЛагиНиколай ДуровОпараш ДуроваGoodbyeDPIАвтопереводчикКтотут.рфИнформацияМаносфераБесплатный хостингNginxSearxПолитическое ФГМТеперь мы — это медиаUserscriptMemojiМегасталинCulturalVibesПессимизация ИИХейтвотчингРечной крабFurAffinityOurworldoftextИнтернет-цензура в ГерманииСкроллингХорошие SEOшникиОТРЯД САСА – ОСПАТонилайфШизоидная деградация интернетаMeek-clientПоисковикИстория одного разумистаЛешие в интернетеDuckDuckGoКлоудфаерПутин приказал МВД цензурировать интернетСертификатDNSПиксельные войныAmazon Web ServicesDMCAПолучивший куки становится куколдомUDPTCPВеликий Китайский ФайрволUcomПоисковики любят творчество ИИРазделение диапазоновПроверка диапазоновGeoLite2-Country.mmdbФилиал Одноклассников
ТерминыVPNПрокси-сервер (SOCKS-прокси) • Управление репутацией404ADSLDDoSFAQGPONI2PIPv6localhostMediaGetNO CARRIERSEOTorTOSViaWi-FiАккаунтБанБотБотнетВиртуалВордфильтрГолосование ногамиДиалапДомашняя страницаДорвейИнвайтКликбейтКомментКомьюнитиКикКириллические доменыЛесенкаЛинкЛогЛокалкаМемНикОфлайнОффтопикПисьма счастьяПоисковая бомбаПост (Некропост) • ПремодерацияПруфлинкРерайтингСабжСимпафкаСиндром вахтёраСкриншотСмайлСпамСпойлерТрафикТредТроянФлудФорумХотлинкингЭто вашеЮзерпикАнонимностьШок-сайтыПингИКСUser-AgentБраузерWhoisURLДесинкРазметка реддита🤡Перевод в онлайнChat Control.mdБлокировка СтарлинкаTAS-IXСириятелекомKyberQUICПостквантовая криптографияВебсокетSSLWebRTCВиртуальный серверВечная блокировкаGoDaddyАмигоCommand & ControlВагуепостингЮникодICANNLet's EncryptУничтожение Интернета в РоссииРеверс-проксиGoogle AdsSpamCopОтслеживание наличия VPNДолбление серверов ИИВандализм с TorЗапрет VPN для российских сайтовКорпорация ДобраMTProto-проксиШколопиарAS8075 Microsoft CorporationАвтономная системаDrissionPageWebGL
ПонятияЦифровая некромантияЗаднеприводная каптчаЭффект АстольфоКвантовый интернетИнформационный вирусОнлайнЛайкСторисХештегPunycodeЧастный сайтПоддерживатьИнтернет-проектФоркСамосбор (проект)Короткие доменыПиксельный ПатриотизмСтирание личной историиБотофермаЗастолблениеЗасираниеDeep TikTokИстория браузераНижний интернетИнторанетФидонетFirstVDSОбрыв загрузки файла на 99%Блокировка Cloudflare в РФПоисковый экстремизм1.1.1.1Запрет Старлинка в РоссииСкриншотная крысаЗапрет VPN на ЮтубеКотовая рыбаUztelecomCDNКраудфандингАтака боторабкоровКубтелекомУдаление перепискиФишки.нетЗухельВебодизайнГипертекстИИ-боты долбят сайтыМусорные ИИ-статьиЗамечательРаскруткаInternet.bsREG.RUПолянорусьCORSФлуд флудычOAuthПереизбыток информацииContent Security PolicyW3CИнформационная блокадаСтиль для умственно отсталыхБэкдор (Телеграм)Web Environment IntegrityDNSBLPersona (верификация)Персональные данные
МетаВеб 2, или некоторые говорят Веб 2.0Будущее сети