Генерация файла базы ip-адресов, подобный тому, что был на сайте ipgeobase.ru

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

Подготовка почвы для реализации конвертера базы адресов

До поры до времени, а именно вплоть до 31-10-2017 база предоставлялась на сайте ipgeobase.ru. И вот уже практически два года этот сервис не обновляется. Поэтому было предпринято решение реализовать конвертер, который бы генерировал подобный файл из исходной базы адресов, которую использовал ipgeobase.

ipgeobase

Перейдя в раздел «Помощь» все на том же сайте я обнаружил, что сайт, который предоставляет исходную базу называется ripe.net.

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

Поэтому я начал изучать тематические статьи, в основе своей на сайте habr.com. И как итог нашел, кто ищет, тот всегда найдет. Вот в этой статье, рассказывающая про то, как один человек определял провайдера по ip, была ссылка на постоянно обновляемую базу адресов. Вот сама ссылка.

baza-ripe

Перейдя по ссылке, перед собой вы увидите 24 файла, нам понадобится лишь один из них, ripe.db.inetnum. Я, разумеется, понял, что нужен именно этот файл не сразу, однако, было логично догадаться, ведь там указан размер каждого файла и ripe.db.inetnum был самым большим из них (его объем составляет 229МБ). Я скачал и открыл его, дабы убедиться, действительно ли его надо использовать в качестве входного файла. При помощи стандартных программ Windows, notepad++  или браузера файл нормально не открывается, поэтому пришлось воспользоваться специальной программой, благо их очень много и  скачать ее было не сложно. Называется она EmEditor.

Интересные статьи:

Сколько IP-адресов существует в сети

Как изменить свой IP-адрес?

Назначение IP Адресов

Типы IP Адресов

Распределение ip-адресов

Итак, ripe.db.inetnum имеет следующую повторяющуюся структуру.

Структура файла ripe.db.inetnum:

#
# The contents of this file are subject to
# RIPE Database Terms and Conditions
#
# http://www.ripe.net/db/support/db-terms-conditions.pdf
#

inetnum: 217.141.187.32 — 217.141.187.35
netname: NETECONOMY-MG38594
descr: SCUOLE PUBBLICHE SCUOLE MEDIE
country: IT
admin-c: DUMY-RIPE
tech-c: DUMY-RIPE
status: ASSIGNED PA
notify: neteconomy.rete@telecomitalia.it
mnt-by: INTERB-MNT
created: 1970-01-01T00:00:00Z
last-modified: 2001-09-21T22:08:01Z
source: RIPE
remarks: ****************************
remarks: * THIS OBJECT IS MODIFIED
remarks: * Please note that all data that is generally regarded as personal
remarks: * data has been removed from this object.
remarks: * To view the original object, please query the RIPE Database at:
remarks: * http://www.ripe.net/whois
remarks: ****************************

% Tags relating to ‘217.141.187.32 — 217.141.187.35’
% RIPE-USER-RESOURCE

inetnum: 213.225.111.0 — 213.225.111.63
netname: NO-SONG-TRH-PMI
descr: PM-International
country: NO
admin-c: DUMY-RIPE
tech-c: DUMY-RIPE
status: ASSIGNED PA
notify: registry-no@songnetworks.no
mnt-by: TELE1-NO-MNT
created: 1970-01-01T00:00:00Z
last-modified: 2005-05-24T13:04:47Z
source: RIPE
remarks: ****************************
remarks: * THIS OBJECT IS MODIFIED
remarks: * Please note that all data that is generally regarded as personal
remarks: * data has been removed from this object.
remarks: * To view the original object, please query the RIPE Database at:
remarks: * http://www.ripe.net/whois
remarks: ****************************

Постановка задачи для реализации конвертера.

Необходимо реализовать конвертер, который на входе будет обрабатывать ripe.db.inetnum и сгенерирует файл, подобный тому, который был скачен с сайта ipgeobase из не обновляемого архива. Его пример ниже.

Выходной файл:
3268321583 3268321583 194.206.161.47 — 194.206.161.47 FR —
3584008192 3584016383 213.159.160.0 — 213.159.191.255 DK —
3269145824 3269145839 194.219.52.224 — 194.219.52.239 GR —
3654053440 3654053503 217.204.110.64 — 217.204.110.127 GB —
3271149056 3271149215 194.249.198.0 — 194.249.198.159 SI —
3649956584 3649956591 217.141.234.232 — 217.141.234.239 IT —
1041962240 1041962495 62.27.21.0 — 62.27.21.255 DE —
3562199600 3562199615 212.82.218.48 — 212.82.218.63 UA —
3560943287 3560943287 212.63.174.183 — 212.63.174.183 NL —
3649944352 3649944355 217.141.187.32 — 217.141.187.35 IT —
3588321024 3588321087 213.225.111.0 — 213.225.111.63 NO —

Этот файл состоит из 5 столбцов. Давайте подробнее разберем каждый из них.

3 столбец (212.82.218.48 — 212.82.218.63) это блок ip-адресов (диапазон). Первые два столбца (3562199600 3562199615) это тоже самое, но в числовом виде. IP-адреса были преобразованы в число по специальной формуле.

IP-адрес имеет вид a.b.c.d, где a-d числа в диапазоне 0-255. Преобразование в число происходит по формуле 256³*a+256²*b+256*c+d

Двузначный код страны (DK RU NL)

Код программы-конвертера на C

Для новичков скажу, выходной файл должен быть пустым. После выполнения программы и запуска компилятора, пустой файл автоматически заполнится нудными нам данными.

Код программы-конвертера:

#include
#include
#include

#pragmawarning(disable:4996)

int parse(constchar* from, constchar* to) {
FILE *pFileIn, *pFileOut;
pFileIn = fopen(from, «r»);
pFileOut = fopen(to, «w»);
if (pFileIn == NULL || pFileOut == NULL) {
returnNULL;
}

inti;
char buff[BUFSIZ];
uint8_tip1[4];
uint8_tip2[4];
char country[3];

while (fscanf(pFileIn, «%s», buff) != EOF) {
if (strcmp(buff, «inetnum:») == 0) {
fscanf(
pFileIn,
» %hhu.%hhu.%hhu.%hhu — %hhu.%hhu.%hhu.%hhu»,
&ip1[0], &ip1[1], &ip1[2], &ip1[3],
&ip2[0], &ip2[1], &ip2[2], &ip2[3]
);
}
elseif (strcmp(buff, «country:») == 0) {
fscanf(pFileIn, «%2s», country);

uint32_t i1 = ((uint32_t)ip1[0] << 24) | ((uint32_t)ip1[1] << 16) | ((uint32_t)ip1[2] << 8) | ip1[3];
uint32_t i2 = ((uint32_t)ip2[0] << 24) | ((uint32_t)ip2[1] << 16) | ((uint32_t)ip2[2] << 8) | ip2[3];
fprintf(pFileOut,
«%zu %zu %hhu.%hhu.%hhu.%hhu — %hhu.%hhu.%hhu.%hhu %s -\n»,
i1, i2,
ip1[0], ip1[1], ip1[2], ip1[3],
ip2[0], ip2[1], ip2[2], ip2[3],
country
);
}
else {
fscanf(pFileIn, «%*[^\n]\n», NULL);
}
}

return 1;
}

int main()
{
if (parse(«D:\\1\\ripe.db.inetnum», «D:\\1\\output.txt») == NULL) {
return 1;
}

return 0;

Программа написана на Visual Studio 2017.

Заключение

Если кому-то потребовалось получить доступ к базе, то вы спокойно можете перейти по ссылке в статье. Если кому-то нужен код программы, который бы создавал файл, который перестали обновлять ребята с сайта ipgeobase, пожалуйста, воспользуйтесь им.

Интересные статьи:

Как узнать провайдера по ip

Как узнать ip адрес чужого компьютера

Как найти человека по ip адресу

Как узнать ip почтового ящика

Как узнать IP адрес своего компьютера

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: