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"