Мир меняется. И в текущей ситуации становится полезным список IP-адресов, условно принадлежащих автономным системам той или иной страны.

Зачем?

Ну, во-первых, можно сделать так, чтобы трафик на эти адреса гарантированно не отправлялся в VPN.

Во-вторых, вполне себе вариант, чтобы трафик на все адреса, кроме российских, отправлялся в VPN. В условиях, когда всё больше и больше ресурсов блокируют подключение по принадлежности вашего адреса к России, вполне себе удобной тактикой может быть дефолтное хождение в нероссийский мир через VPN.

В-третьих, если ваш сервис предназначен только для российских клиентов, вы можете закуклиться и ограничить к нему доступ по IP (российские клиенты, находящиеся за рубежом, и пользователи VPN вам спасибо, конечно, не скажут - но это ваш добровольный выбор).

Да и мало ли других применений.

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

Как решил я

У нас есть два основных источника, хорошо помогающих в решении.

  1. RIPE публикует актуальный список автономных систем с привязкой к стране.

  2. 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), поэтому частые обновления будут поедать ваш трафик, да и смысла в них нет.

У меня скрипты работают раз в сутки.

UPD. Версия получения из RIPE

Чем хорошо комьюнити - всегда находятся опытные люди, которые знают еще какие-нибудь варианты. Один из таких умных людей (спасибо!) принес ссылку на ресурс RIPE, который отдает список ASN, префиксов IPv4 и префиксов IPv6 в json. Чем я немедленно и воспользовался. Код ниже и в github.

#!/usr/bin/env python3
# coding: utf-8
# version: 0.4
from ipaddress import IPv4Address, IPv4Network, ip_address, summarize_address_range
import sys
import os
import json
import requests
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])
result = filepath + '/ip_' + country_code + '.lst'
url = 'https://stat.ripe.net/data/country-resource-list/data.json?resource='+country_code
ripe_ip = json.loads(requests.get(url).content)['data']['resources']['ipv4']

with open(result, 'w') as out_file:
    for record in ripe_ip:
#        try:
            if record.find('-') > -1:
                ips = record.split('-')
                ipaddr = list(summarize_address_range(IPv4Address(ips[0]),IPv4Address(ips[1])))
            else:
                ipaddr = [IPv4Network(record)]
            networks.extend(ipaddr)
#        except:
#            pass
    for line in list(aggregate_prefixes(networks)):
        print(str(line), file=out_file)

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

Комментарии (10)


  1. edo1h
    08.04.2022 06:41
    +1

    RIPE публикует актуальный список автономных систем с привязкой к стране.

    а насколько ему можно верить? AFAIK никаких ограничений по использованию выделенных AS в конкретных странах нет.
    посмотрел diff между используемой у меня базой ip2location.com и тем, что накачал ваш скрипт, в целом очень похоже, конечно, но вот ткнул в первое различие 194.87.67.0/24: AS2118 в RIPE считается чешской, но на этот блок адресов whois говорит:


    inetnum:        194.87.67.0 - 194.87.67.255
    netname:        RELCOM_GROUP
    country:        RU

    и пинг до 194.87.67.1 в 17 мс тоже намекает, что трафик не выходит за пределы РФ


    1. ramyalexis
      08.04.2022 08:06

      Не на сколько) Там и страну любую можно указать. +Варианты аренды кусков маленьких их большого. Маленький кусок физически может быть в другой стране, но числется по большому куску. Ну и так далее. В общем это очень условно. Нельзя и регионам верить, так как сети ARIN скажем могут использоваться в регионах RIPE.

      В общем кто и что там указывает - никто не проверяет.


  1. karambaso
    08.04.2022 12:36
    -1

    Как информация для бывалых сисадминов - наверно кому-то поможет, но обычно они про это знают не меньше автора.

    Как информация для нечасто сталкивающихся с сетевыми проблемами технарей - не поможет никак, поскольку не дано понимание сути вопроса (что такое asn, какова его роль в сетевой инфраструктуре, какова его взаимосвязь с ip-адресами и т.д.).

    Как информация для ищущей развлечений в виде занимательных околотехнических текстов публики - полностью бесполезная статья.

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


    1. Furriest Автор
      08.04.2022 14:05
      +1

      Не буду спорить, хотя у нас с вами явно разное понимание отношения упомянутых вами групп к топику.

      В моем понимании для первой группы, которая всё и так знает, есть большая разница между "я знаю, как это сделать" и "я это уже сделал". Лично у меня хватает компетенций для решения огромного количества задач, но когда мне нужно решить конкретный кейс - я сначала ищу готовое решение, а свое пилю, когда не находится подходящее. Потому что клиенту важен результат, а не процесс. И поэтому некоторые знакомые мне коллеги из первой группы уже используют мое решение, хотя могли бы написать свое без существенных затруднений.

      Для второй группы не нужно понимание того, что такое ASN - им нужен "список российских IP-адресов". И статья дает им код, который можно запустить и получить такой список.

      Для третьей группы, действительно, статья бесполезна.

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


  1. LESHIY_ODESSA
    08.04.2022 17:24

    По теме есть еще такой ресурс. За актуальность данных неручаюсь.


  1. romanuld
    08.04.2022 17:27

    Во-вторых, вполне себе вариант, чтобы трафик на все адреса, кроме российских, отправлялся в VPN

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


    1. Furriest Автор
      08.04.2022 17:28
      +2

      Тут каждый сам кузнец своих грабель. Исходя из целей, надо определять методику применения.


  1. 4ervyak
    08.04.2022 20:46

    Очень условно можно доверять данным из RIPE. Крупные корпорации зачастую владеют ASками, зарегистрированными на штаб-квартиру где-нибудь в одной стране, но реально эти AS используются в других странах.


    1. Furriest Автор
      08.04.2022 20:48

      Конечно. Но в текущих условиях я не очень представляю себе крупную корпорацию, у которой AS зарегистрирована в России, а префиксы с ней она анонсирует не в России. Можете привести пример?


      1. romanuld
        08.04.2022 21:25

        хоть и не прямой ответ, на данный вопрос, но если взять гугловские, клаудфдейровские и другие глобальные dns сервисы, то их префиксы анонсятся с разных ас-ок с разным физическим расположением сервиса. ripe вообще скажет, что эти ip не в их компетенции, идите в arin...