руководство как сделать GeoIP базу ip2city

slach

Новичок
руководство как сделать GeoIP базу ip2city

помнится с пол годика назад, или даже еще раньше меня интересовала проблема составления GeoIP базы, т.е. соответсвие подсетки конкретному региону, городу.

тогда я вроде даже дал конкретный способ как поиметь ip2country базу данных на халяву =)
теперь это вообще можно сделать не напрягаясь: http://ip-to-country.directi.com/
теперь пришел черед рассказать как сделать ip2city

есть такое понятие как ASN ;) точнее - Autonomous Systems Number, как я понял это чтото региона, в общем не важно

єервоначальное соответвие AS -> город выкачивается с http://netgeo.caida.org/aslatlong.txt

далее выкачиваются RPSL базы данных

Европа - RIPE
ftp://ftp.ripe.net/ripe/dbase/split/ripe.db.route.gz
Америка - ARIN (American Registry for Internet Numbers)
ftp://ftp.arin.net/pub/rr/arin.db
Азия - APNIC (Asia Pacific Network Information Centre) - Asia/Pacific Region
http://ftp.apnic.net/apnic/whois-data/APNIC/split/apnic.db.route.gz

Россия
ftp://ripn.net/ но чего то не робит
Есть также WHOIS базы отдельно для японии
http://nori.apnic.net/apnic/whois-data/JPIRR/split/


там формат типа такого

route: 203.124.212.0/24 (отсюда начальный и конечный адрес)
descr: Tata Nova, Customer of Estel
origin: AS9238

потом по этому AS можно узнать город из aslatlong.txt
если он ОТСУТВУЕТ в aslatlong.txt, тогда надо лезть в

http://ftp.apnic.net/apnic/whois-data/APNIC/split/apnic.db.aut-num.gz
ftp://ftp.ripe.net/ripe/dbase/split/ripe.db.aut-num.gz
к сожалению ничего не смог найти подобного для ARIN ;(

и пытаться распарсить содержимое поля descr: а также export: и import: (для кеширования)
причем делать это надо будет интерактивно, c помощью пользователя!
т.е. выводится весь DESCR а дальше юзер выбирает страну по коду и вводит город???

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

Есть платные базы и специализированные продукты, как они построены ? ума не приложу...

http://www.maxmind.com/
http://www.geobytes.com/


жду принципиальных возражений
а также поправок с терминами...
 

KBI

Guest
Re: руководство как сделать GeoIP базу ip2city

Тут уже сразу вопросы по первому пункту (страны).

1) ip-to-country.directi.com сильно отстаёт от реальности. Месяца этак на два в среднем. Плохая база по APNIC. Остальные базы тоже далеко не идеальны.

2) Да, а почему в списке не присутствует такой регион, как Латинская Америка (LACNIC) ?

RIR (Regional Internet Registry) list: http://www.iana.org/ipaddress/ip-addresses.htm

3) Вот один реальный случай сбора данных и возникающие по ходу дела проблемы:

Изначально собираются последние данные у 4 региональных регистрантов (RIR):

APNIC: ftp://ftp.apnic.net/pub/stats/apnic/
ARIN: ftp://ftp.arin.net/pub/stats/arin/
RIPE: ftp://ftp.ripe.net/ripe/stats/
LACNIC: ftp://ftp.lacnic.net/pub/stats/lacnic/

Но и это ещё не всё, поскольку то, что выкладывается по вышеприведённым адресам - это к сожалению НЕПОЛНАЯ и зачастую пересекающаяся база. К примеру некоторые совершенно идентичные группы адресов из зоны .pl присутствуют как в RIPE (что нормально), так и в ARIN (?).

Чем это вызвано - не знаю. Возможно плохим парсингом полной WHOIS DB и даже возможно некоторым бардаком в ней самой. К примеру такие мамонты, как "UK" там встречаются сплошь и рядом (хотя давно бы пора уже "GB").

А вот ip-to-country скорее всего парсят полную WHOIS DB самостоятельно (и более правильно, нежели сами владельцы), потому что лично я знаю как минимум пару мест, где ip-to-country имеет гораздо более правильные данные (в основном это касается мелких подсетей мелких государств, находящихся в адресном пространстве более крупных сетей США).

Поэтому приходится складывать всё, apnic,arin,ripe,lacnic и ip-to-country, чтобы получить более-менее правдоподобную картину (бо самостоятельно пропарсить полную базу WHOIS - задачка нетривиальная).

А потом ещё надо учитывать всё то, что подсети там как пироги друг на друга наслаиваются и нередки ситуации, когда к примеру подсеть уже принадлежит иному государству, нежели исходная сеть.

Вот это вкратце то, что с определением государства приходится вытворять.

Теперь города.

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

В Латвии по такой схеме вообще всего один город на всю страну получается - Рига ;)

Ну а пытаться вычислять по другим полям WHOIS (inetnum->descr к примеру) - задачка не для слабонервных.
 

slach

Новичок
потому что LACNIC базу RPSL не отдает, а то что вы привели ссылки, там в stats гуано какое то =) хотя ip2country по нему построить конечно можно

IMHO отставание http://ip-to-country.directi.com в два месяца не такое уж сильное

то что наследуются ASN и получается пересечений подсеток IMHO не страшно, все решается простым запросом

SELECT * FROM ip2country WHERE $ip_addr BETWEEN begin_addr AND end_addr ORDER BY (end_addr-begin_addr) LIMIT 1
т.е. выбирается наиболее узкая подсетка =)

по
поводу парсинга inetnum->descr на самом деле
можно взять список городов вот отсюда:
http://www.travelgis.com/world/majorcities.asp
и искать их в descr:
естественно надо думать над тем что есть синонимы городов и города могут быть с одним названием в разных странах

короче, IMHO надо делать комбинацию подходов
первичный проход - парсинг по AS
и дополнение городов

вторичный подход парсинг по списку городов в inetnum
и потом третий проход по всем подсеткам, которые не определились в первых двух проходах...

IMHO вот так...
 

slach

Новичок
кстати в догонку, возможно весьма полезным будет и вот этот FTP

ftp://ftp.radb.net/radb/dbase/

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

Alexxx

Guest
Вероятно, вы ищете вот это

http://www.idefense.com/Intell/CI022702.html
Тут база даже не городам, а по организациям. Возможно, устаревшая.

С другой стороны прикиньте, насколько часто вообще может произойти перевод какой-нибудь подсетки из одного города в другой. Согласитесь, это происходит редко.
 

slach

Новичок
Ухты =) вот спасибо
база действительно не шибко актуальная... за февраль
и гОРОДА там дЕЙСТВИТЕЛЬНО есть... но не все...
в любом случае там есть организация, что даже лучше =)
 

MegaNuke

Guest
ИМХО нужно парсить именно полную базу RIPE ftp://ftp.ripe.net/ripe/dbase/ripe.db.gz и парсить именно в несколько проходов с жесткими regexp'ами т.к. например московские сетки могут выглядеть в description как Moscow, Moskov, Moskva и т.д. При первом проходе по сity сверять в частности принадлежность города стране и т.д. Вобщем писанины много, но самое печальное что остатки все равно приходится додергивать руками из-за ошибок в базе.
 

zaharc

Guest
Возможно кому-то будет проще использовать...

Добрый день,

мне также встретилась задачка - узнать страну по IP. И вообщем-то я нашел самое простое решение, хотя и далеко не оптимальное.

PHP:
// советую выключить сообщения об ошибках на тот случай если не сработает функция.
		error_reporting(0);

// подключаемся к серверу whois.arin.net и узнаем какому регистеру пренадлежит ip.
		$server = "whois.arin.net";

		if (!$ip = gethostbyname($ip)) {
		
		} else {
			if (!$sock = fsockopen($server, 43, $errMainNum, $errorMainDesc, 25)) {
				unset($sock);
			} else {
				fputs($sock, "$forum_topic_ip\n");
				while (!feof($sock)) {
					$buffer .= fgets($sock, 10240); 
				}
				fclose($sock);
				if (eregi("RIPE.NET", $buffer)) {
					$nextServer = "whois.ripe.net";
				} elseif (eregi("whois.apnic.net", $buffer)) {
					$nextServer = "whois.apnic.net";
				} elseif (eregi("nic.ad.jp", $buffer)) {
					$nextServer = "whois.nic.ad.jp";
					#/e suppresses Japanese character output from JPNIC
					$extra = "/e";
				} elseif (eregi("whois.registro.br", $buffer)) {
					$nextServer = "whois.registro.br";
				}
// если был найден регистер для ip то идет запрос к whois этого регистера за данными о ip
				if($nextServer){
					$buffer = "";
					if(!$sock = fsockopen($nextServer, 43, $errNextNum, $errorNextDesc, 25)){
						unset($sock);
					} else {
						fputs($sock, "$forum_topic_ip$extra\n");
						while (!feof($sock)) {
							$line = fgets($sock, 10240);

// выбирается строка в которой указана странна.
							if (eregi("country", $line)) {
								$buffer .= $line;
							}

						}
						fclose($sock);
					}
// удаляются все пробелы
					$buffer = eregi_replace(" ", "", $buffer);
// удаляется слово "country:".  И все теперь мы знаем код. Далее у меня есть определенный список странн которые меня интересуют по этому я заменяю их код на название. Но можно это сделать через sql с полным списком.
					$buffer = eregi_replace("country:", "", $buffer);
					$buffer = eregi_replace("RU", "Россия", $buffer);
					$buffer = eregi_replace("US", "США", $buffer);
					$buffer = eregi_replace("IL", "Израиль", $buffer);
					$buffer = eregi_replace("UK", "Англия", $buffer);
					$buffer = eregi_replace("UA", "Украина", $buffer);
					$msg = $buffer;
				}
			}
		}
		print " $msg";
// если вы отключили ошибки то стоит их вернуть ведь дальше вы хотите знать если у вас ошибки в скрипте.
		error_reporting (E_ALL ^ E_NOTICE);
 

slach

Новичок
ну йО мое... кто ж так пишет ;))
$buffer = eregi_replace(" ", "", $buffer);

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

а вообще работа с whois она простая до безобразия ;)

IMHO легче попробовать написать whois запрос уже непосредственно к INETNUM базе...

кстати... а можно как нибудь скормить все эти ripe и arin базы какой нибудь whoisd софтине ?? чтобы обращаться к локальному серваку?
 

zaharc

Guest
я так пишу. дело в том, что раньше код работал именно как whois но далее я просто его почитстил от того что мне не нужно было.....

ваши советы по ускорению кода?

на самом деле я не знаю на сколько ограничений расчитаны whois сервера но я знаю, что в течение 10 минут столько раз проверил ip этим скриптом, и не разу не было отказа.

дело в том, что базу то можно составить но кто будет за ней следить и пополнять?
 

slach

Новичок
RPSL базы RIPE, ARIN и APNIC пополняются ежемесячно... проблема именно в том, каким именно образом скормить эти базы... какой нибудь софтине (например собственному whois серверу)...
 

zaharc

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

slach

Новичок
cуммарный объем около 100 метров все gzip'овано... да это плюнуть и растереть =) входящий трафик на колокейшене беслпатный обычно...
 

zaharc

Guest
ну тогда в чем проблема?
все бд есть в инете... ты не знаешь где именно?
 

slach

Новичок
если ты внимательно посмотришь, ссылки на базы я привел в первом сообщении... ;)

я не знаю КАК их скормить к.л. СТАНДАРТНОЙ софтине... и можно ли это сделать ВООБЩЕ =)
писать собственный парсер даже имея на руках описание RPSL формата, меня не возбуждает... савсем =)

Тем более при наличии ссылки на готовую базу от idefence.com...
 

zaharc

Guest
да я видел по этому и не понял в чем твои проблемы....

а теперь понятно - "лень матушка...."..

кажется тут простого решения нет придется потратить часик другой (если у тебя есть дока формата)....
 

vasnas

Guest
Господа где серьезные предложения !!!

См. мои тщетные воззвания и искания..(не тщетные)
http://www.phpclub.net/talk/showthread.php?s=&postid=242629#post242629


PHP:
http://netgeo.caida.org/perl/netgeo.cgi?method=getRecord&target=".$ip
очень удобно использовать библиотеку CURL PHP
можно и сокеты.. а можно и просто из браузера...

а еще есть методы getCountry и getLatLong см. класс клиента Net Geo http://www.caida.org/tools/utilities/netgeo/NetGeoClient-1.1.tar.gz.

И не надо ничего парсить и закачивать...
 

slach

Новичок
слыш чувак, netgeo делает все по списку http://netgeo.caida.org/aslatlong.txt

уж лучше пользоваться http://www.idefense.com/Intell/CI022702.html
и потом дополнять его по мере поступления новых IP...
 
Сверху