tracemap

Материал из Xgu.ru

Перейти к: навигация, поиск
Автор: Игорь Чубин
Mercurial-logo.png

Репозиторий проекта
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

На экран будет выведена картинка, напоминающая эту:

Tracemap1.png

Зелёным цветом показан узел до которого от нас 4 хопа. Для того чтобы узлы, отстоящие от нас на заданное количество хопов, были подсвечены, количество хопов можно указать в переменной:

%# grep hops_to_highlight= tracemap.pl
our $hops_to_highlight=4;

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

%# (echo flip.kiev.ua; echo bizarre.kiev.ua) | perl tracemap.pl

Результат выполнения:

Tracemap2.png

[править] Опции трассировки

Опции трассировки указаны в переменной

our $traceroute_options="-q1 -n -I";

в коде скрипта.

Опция предполагает что:

  • -q1 — выполняется только однократная отправка пакета для каждого TTL;
  • -n — не выполняется обратное преобразование DNS;
  • -I — выполняется сканирование с помощью ICMP (а не UDP, как по умолчанию).

Icon-caution.gif

Опция -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

Note-icon.gif

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

Карта трассировки на сервера из категории "Промышленные предприятия" на bigmir
Карта трассировки на сервера из категории "Чаты и форумы" на bigmir
Карта трассировки на сервера из категории "Реклама" на bigmir

[править] Зачем это нужно?

Построенная карта помогает наглядно

  1. Оценить время задержки распространения сигнала между различными хостами (и их соотношение);
  2. Увидеть как сгруппированы разнообразные Интернет-ресурсы, насколько далеко друг от друга они отстоят;
  3. При построении филиальной сети может служить дополнительным источником информации при выборе провайдера для удалённого филиала;
  4. Позволяет отфильтровать зафиксированные источники decoy-сканирования (описано на странице Скрытое сканирование nmap, при условии, что ttl не менялся при сканировании;

[править] Другие способы построения трасс

  • traceroute

Всем известная классическая программа для построения пути к удалённому хосту.

Traceroute-to-opennet.png

  • tracepath

Похожая на traceroute программа, но может строить асимместричные трассы и имеет некоторые другие отличия.

  • mtr

Интерактивная программа, которая постоянно обновляет статистику по трассе.

Mtr-to-opennet.png


[править] Идеи для развития

  • Раскраска по зонам — сделано (но не задокументировано)
  • Сканирование по блоку — сделано (но не задокументировано)
  • HTML-страница с подписями
  • Распределённый tracemap
  • Географическая привязка

[править] Лицензия

Общественное достояние (Public domain)

[править] Дополнительная информация

[править] Код скрипта

Код скрипта находится по адресу:

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"

Источник — «http://xgu.ru/wiki/tracemap»