Мир меняется. И в текущей ситуации становится полезным список IP-адресов, условно принадлежащих автономным системам той или иной страны.
Зачем?
Ну, во-первых, можно сделать так, чтобы трафик на эти адреса гарантированно не отправлялся в VPN.
Во-вторых, вполне себе вариант, чтобы трафик на все адреса, кроме российских, отправлялся в VPN. В условиях, когда всё больше и больше ресурсов блокируют подключение по
В-третьих, если ваш сервис предназначен только для российских клиентов, вы можете закуклиться и ограничить к нему доступ по IP (российские клиенты, находящиеся за рубежом, и пользователи VPN вам спасибо, конечно, не скажут — но это ваш добровольный выбор).
Да и мало ли других применений.
Получение такого списка легко автоматизируется, но не все заинтересованные знают как. Поскольку я уже порешал эту задачу, можно воспользоваться моим решением. А можно решить ее как-нибудь по-другому.
Как решил я
У нас есть два основных источника, хорошо помогающих в решении.
-
RIPE публикует актуальный список автономных систем с привязкой к стране.
-
Routeview публикует дампы BGP RIB в формате MRT TABLE DUMP V2, из которых можно дергать реальный набор префиксов, анонсируемых от автономной системы.
А еще для python написана библиотека pyasn, которая позволяет работать с упомянутыми дампами.
Поэтому логика решения проста как блин — тянем первое и второе, из первого получаем список нужных нам ASN, из второго связку IP-ASN, потом пробегаемся по второму результату с первым и получаем искомое. Ну и еще агрегируем, поскольку нам важны не сами анонсы, а анонсируемое пространство IP-адресов.
Код решения
Всё нижеописанное лежит в github. Название radb-tools скорее историческое, поскольку в текущей версии с RADB решение не связано никак. В первых версиях я пытался собирать всю информацию из RADB.
Решение состоит из двух отдельных скриптов, примитивных и не имеющих особой ценности.
renew-db — обновляет базы из описанных выше источников. Использует утилиты, идущие в комплекте с pyasn.
#!/bin/sh rm -f rib*.bz2 wget -N https://ftp.ripe.net/ripe/asnames/asn.txt pyasn_util_download.py --latest pyasn_util_convert.py --single $(find . -maxdepth 1 -name "rib*.bz2" -print0) ipasn.lst
ip-country.py — генерирует на основании хранящихся тут же баз нужный нам список с именем ip_<country code>.lst. И да, разумеется, можно использовать скрипт для генерации списка префиксов любой страны, не только России.
#!/usr/bin/env python3 # coding: utf-8 # version: 0.4 import sys import os import pyasn from aggregate_prefixes import aggregate_prefixes try: country_code = sys.argv[1].upper() except: print('Usage: ', sys.argv[0], ' <two letters country code> ') exit() networks = [] filepath = os.path.dirname(sys.argv[0]) asndb = pyasn.pyasn(filepath+'/ipasn.lst') asnfile = filepath + '/asn.txt' result = filepath + '/ip_' + country_code + '.lst' with open(result, 'w') as out_file, open(asnfile, 'r') as asn_file: asn_list = [ t.split(' ')[0] for t in asn_file if t.split(' ')[-1][:2] == country_code] for asn in asn_list: try: networks.extend(list(asndb.get_as_prefixes(asn))) except: pass for line in list(aggregate_prefixes(networks)): print(str(line), file=out_file)
Поскольку скрипт предназначен в основном для использования в различных автоматизированных системах, никакого интерактива не предусмотрено — после запуска он молча обновляет файл результата.
Что дальше?
А дальше можно, например, подсунуть этот список в bird и отдать по BGP в ваш маршрутизатор, чтобы там на его основании куда-то направлять или не направлять трафик. Или, соответственно, завернуть его в ipset и фильтровать на сервере доступ на его основе.
На данный момент в ip_RU.lst генерируется 10840 префиксов (а в ip_US, btw, 61619).
Размер используемых баз достаточно велик (сейчас где-то 4.5 мегабайта занимает список ASN и 113 мегабайт — упакованный RIB), поэтому частые обновления будут поедать ваш трафик, да и смысла в них нет.
У меня скрипты работают раз в сутки.
ссылка на оригинал статьи https://habr.com/ru/post/659655/
Добавить комментарий