tracemap
Материал из Xgu.ru
- Автор: Игорь Чубин
Репозиторий проекта
http://xgu.ru/hg/tracemap
Построение графической карты трассировки к хостам
На этой странице рассказывается каким образом можно выполнить определение пути (трассировку) на несколько Интернет-хостов сразу, и представить полученные данные в виде графической карты.
Содержание |
[править] Инсталляция и запуск
Для выполнения сканирования необходимо наличие:
- traceroute
- graphviz
- libnet-ip-perl (перл-библиотеки. в debian/ubuntu ставится sudo apt-get install libnet-ip-perl)
- программы просмотра PNG-файлов (например, gqview или другой).
%# wget http://xgu.ru/download/tracemap.pl %# echo opennet.ru | perl tracemap.pl %# gqview tracemap.png
На экран будет выведена картинка, напоминающая эту:
Зелёным цветом показан узел до которого от нас 4 хопа. Для того чтобы узлы, отстоящие от нас на заданное количество хопов, были подсвечены, количество хопов можно указать в переменной:
%# grep hops_to_highlight= tracemap.pl our $hops_to_highlight=4;
Для того чтобы построить трассу к нескольким сайтам, можно передать несколько адресов, по одному на строке.
%# (echo flip.kiev.ua; echo bizarre.kiev.ua) | perl tracemap.pl
Результат выполнения:
[править] Опции трассировки
Опции трассировки указаны в переменной
our $traceroute_options="-q1 -n -I";
в коде скрипта.
Опция предполагает что:
- -q1 — выполняется только однократная отправка пакета для каждого TTL;
- -n — не выполняется обратное преобразование DNS;
- -I — выполняется сканирование с помощью ICMP (а не UDP, как по умолчанию).
|
Опция -I может требовать прав суперпользователя, поэтому нужно или отключить её, или запускать скрипт с правами root'а. |
[править] Полученная карта
На полученной карте точками обозначены хосты, а рёбрами каналы.
Узлы:
- (красный) — хост отправитель (откуда выполняется сканирование)
- (синий) — хост назначения
- (зелёный) — хосты, до которых заданное количество хопов
Длина рёбер вычисляется исходя из разницы времени отклика двух соответствующих узлов. (разница в силу погрешности измерения может получиться отрицательной). Длина имеет постоянную составляющую + переменную, которая пропорциональна логарифму разницы времени отклика.
Использованная формула вычисления длины рёбер, где $l — разница времени отклика хостов, соответствующих узлам, которые соединяет ребро:
$l = 0.25 if $l<0.25; return (3+1.2*log($l))*0.3285;
[править] Примеры карт
Для примера при построении карт возьмём сайты различной категории, находящиеся в web-каталоге Bigmir.
Список серверов получить можно следующим образом:
%# lynx -dump 'http://top.bigmir.net/show/industry/' | grep url=http | sed 's/.*%3A%2F%2F//;s/%2F$//' > hostlist3
В результате в файле hostlist3 окажутся наиболее посещаемые web-сервера категории "Промышленность" портала bigmir.
$ head hostlist3 # Generated with this line: lynx -dump 'http://top.bigmir.net/show/industry/' | grep url=http | sed 's/.*%3A%2F%2F//;s/%2F$//' normativ.com.ua www.industrialbrd.kiev.ua www.ukr-print.net www.compitech.ru www.new-garbage.com dnop.com.ua top.dn.ua www.industrialnet.com.ua www.derevo.info
Аналогичным образом сгенерируем файлы:
- hostlist4 для категории Чаты и форумы
- hostlist5 для категории Реклама
После этого можно приступить к генерированию карт.
%# for i in 3 4 5 do cat hostlist$i | perl tracemap.pl && mv tracemap.png tracemap$i.png done
|
|
Трассировка для большого количества удалённых хостов может выполняться длительное время. |
[править] Зачем это нужно?
Построенная карта помогает наглядно
- Оценить время задержки распространения сигнала между различными хостами (и их соотношение);
- Увидеть как сгруппированы разнообразные Интернет-ресурсы, насколько далеко друг от друга они отстоят;
- При построении филиальной сети может служить дополнительным источником информации при выборе провайдера для удалённого филиала;
- Позволяет отфильтровать зафиксированные источники decoy-сканирования (описано на странице Скрытое сканирование nmap, при условии, что ttl не менялся при сканировании;
[править] Другие способы построения трасс
- traceroute
Всем известная классическая программа для построения пути к удалённому хосту.
- tracepath
Похожая на traceroute программа, но может строить асимместричные трассы и имеет некоторые другие отличия.
- mtr
Интерактивная программа, которая постоянно обновляет статистику по трассе.
[править] Идеи для развития
- Раскраска по зонам — сделано (но не задокументировано)
- Сканирование по блоку — сделано (но не задокументировано)
- HTML-страница с подписями
- Распределённый tracemap
- Географическая привязка
[править] Лицензия
Общественное достояние (Public domain)
[править] Дополнительная информация
- Точки обмена трафиком
- RPM: tracemap (англ.) --- скрипт tracemap в репозитории Alt Linux Sisyphus
[править] Код скрипта
Код скрипта находится по адресу:
Mercurial-репозиторий проекта:
Первоначальный код скрипта:
#!/usr/bin/perl -w
#
our $traceroute_options="-q1 -n -I";
our $hops_to_highlight=4;
our $dot_file="tracemap.dot";
our $png_file="tracemap.png";
#our @printed_hops;
our $graph="";
our $hop_id = 0;
our %hop_id;
our $previous_hop;
our $previous_time;
our $hop;
our $time;
our $ttl;
sub print_hop($)
{
$hop = shift;
unless (defined($hop_id{$hop})) {
$hop_id++;
$color="";
if ($ttl == $hops_to_highlight+1) {
$color=",color=green,style=filled"
}
$graph .= "hop$hop_id [ label=\"$hop\"$color];";
$hop_id{$hop} = $hop_id;
}
}
sub time_to_len($$)
{
$a=shift;
$b=shift;
$l=$a-$b;
$l = 0.25 if $l<0.25;
return (3+1.2*log($l))*0.3285;
}
while(<>)
{
my $dest = $_;
chomp ($dest);
next if /^#/;
open (TRACE,"traceroute $traceroute_options $dest|")
or die "Can't run traceroute:$!";
my $hop='';
$ttl=0;
while (<TRACE>) {
chomp;
next if not /ms/;
$ttl++;
s@^\s*@@;
$previous_hop=$hop;
$previous_time=$time;
my $a;
($a, $hop, $time) = split(/\s+/, $_, 3);
$time =~ s/\s*ms\s*$//;
if ($previous_hop eq '') {
print_hop($hop);
$graph =~ s@(\ label=\")[^"]*(\".*?)$@fontsize=14,style=filled,color=red,label="(YOU)$2@;
}
elsif (not defined $hop_id{$hop} ) {
print_hop($previous_hop);
print_hop($hop);
$graph .= "hop".$hop_id{$previous_hop}." -- hop".$hop_id{$hop}.
" [label=\"".sprintf("%1.2f",+$time-$previous_time)."\",len=".time_to_len($time,$previous_time)."];\n";
}
}
$graph =~ s@(\ label=\")[^"]*(\".*?)$@fontsize=14,style=filled,label=\"$dest$2@;
close(TRACE);
}
open (DOT, ">$dot_file")
or die "can;t open dot file file for writing: $!";
print DOT <<EOF;
graph G {
margin =1 ;
node [fontname=times,fontsize=10,shape=circle,width=0.2,height=0.2,fixedsize=true,color=blue];
edge [fontname=times,fontsize=10,color=black];
$graph
}
EOF
close(DOT);
print `neato -o $png_file -Tpng $dot_file > /dev/null 2>&1`
or die "can't run neato: $!;\ngraphviz is installed?\n"



