Tracert протоколу. Опис команди TRACERT. Як працює Tracert

Не завжди мережа працює так, як від неї вимагається, іноді певний комп'ютер у вашій локальній мережі компанії або віддалений може не відповідати. Здавалося б, все працює, все підключено, але схоже на якийсь із вузлів, на шляху від вашого комп'ютера, до потрібного трапляється помилка.

Утиліта ping дозволяє визначити наявність проблеми, що вузол не відповідає, але як дізнатися де обривається з'єднання? Для цього застосовується утиліта traceroure. У цій невеликій інструкції ми розглянемо як користуватися traceroute linux, як розуміти її висновок і визначити де все ж таки проблема. Але спочатку розглянемо, як працює traceroute.

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

Кожен пакет проходить на своєму шляху певну кількість вузлів, доки досягне своєї мети. Причому кожен пакет має свій час життя. Це кількість вузлів, які можуть пройти пакет перед тим, як він буде знищений. Цей параметр записується в заголовку TTL, кожен маршрутизатор, через який проходитиме пакет зменшує його на одиницю. При TTL=0 пакет знищується, а відправнику надсилається повідомлення Time Exceeded.

Команда traceroute linux використовує пакети UDP. Вона відправляє пакет з TTL=1 і дивиться адресу вузла, що відповів, далі TTL=2, TTL=3 і так поки не досягне мети. Щоразу відправляється по три пакети та для кожного з них вимірюється час проходження. Пакет вирушає на випадковий порт, який, швидше за все, не зайнятий. Коли утиліта traceroute отримує повідомлення від цільового вузла про те, що порт недоступний трасування вважається завершеним.

Утиліта Traceroute

Перед тим як перейти до прикладів роботи з утилітою розглянемо її синтаксис і основні опції. Синтаксис виклику дуже простий:

$ traceroute опції адрес_вузла

Як адреса може використовуватися ip адреса або доменне ім'я. Розглянемо основні опції:

  • -4 або -6 - Використовувати ipv4 або ipv6 протокол;
  • -I- Використовувати ICMP пакети замість UDP;
  • -T- Використовувати TCP пакети замість UDP;
  • -F- не фрагментувати пакети;
  • -f- вказати TTL з якого потрібно розпочати;
  • -g- передавати пакет через вказаний шлюз;
  • -i- передавати пакет через вказаний інтерфейс;
  • -m- максимальна кількість вузлів, через які пройде пакет;
  • -q- кількість пакетів, що надсилаються за раз, за ​​замовчуванням три;
  • -n- не впізнавати доменні імена;
  • -p- вказати порт замість порту за замовчуванням;
  • -w- встановити час очікування відповіді від вузла, за замовчуванням півсекунди;
  • -r- Використовувати інший роутер замість того, що зазначений у таблиці маршрутизації;
  • -z- Мінімальний інтервал між пакетами;
  • -U- Використовувати UDP зі збільшенням номера порту;
  • -UL- Використовувати протокол UDPLITE;
  • -D- Використовувати протокол DCCP;
  • --mtu- Вказати розмір пакета;
  • -P- протокол, доступні такі значення: raw, dccp, udplite, udp, tcpconn, tcp, icmp.

Це не всі опції утиліти, але всі основні, якими ви користуватиметеся. Далі перейдемо практиці того, як виконується трасування мережі Linux.

Приклади трасування мережі в Linux

Наприклад, виконаємо трасування до сервера сайту:

sudo traceroute сайт

Як бачите, пакет пройшов через 6 вузлів, перш ніж дійти до мети. На кожен вузол відправлялося по три пакети і для кожного з них було засічено час проходження. І якщо на одному з вузлів виникне проблема, тепер ви знатимете на якому.

У вас, напевно, постало питання, чому час проходження для деяких вузлів такий довгий? Адже якщо виконати ping, то загальний час буде набагато меншим. Справа в тому, що час засікається на шляху пакета туди і назад. Від запиту до відповіді. Це раз, але ще потрібно враховувати, що маршрутизатори дають вищий пріоритет для пакетів, що приходять, коли для сервісних затримки можуть бути довшими.

Ще, замість одного вузла ви можете бачити зірочки traceroute. Це ще не означає, що вона не працює. Це означає, що лише він не захотів нам відповідати. Давайте перевіримо ще щось, наприклад, публічний DNS google:

sudo traceroute 8.8.8.8

Тут уже більше вузлів, і така сама ситуація із зірочками. Якби на шляху до сервера виникла помилка, ми б це побачили. Наприклад, вузол 195.153.14.1 нам не відповів і ми змогли відстежити запит лише до 212.162.26.169.

sudo traceroute 195.153.14.1

Іноді трасування за допомогою UDP не працює, це може статися тому що фаєрвол блокує всі зайві пакети. Ми можемо скористатися ICMP за допомогою опції I.

sudo traceroute history.pl

sudo traceroute -I history.pl

Але трасування може використовуватися не тільки для виявлення урвища в ланцюжку маршрутизаторів. У неї ще є досить цікаве застосування дослідження мережі. Наприклад, ви можете спробувати визначити підмережі провайдером. Відправимо три запити на різні адреси:

sudo traceroute сайт
$ sudo traceroute history.pl
$ sudo traceroute habrahabr.ru


Потім порівняйте висновки цих команд. Ви побачите, що початкові адреси IP однакові. Ми можемо зробити висновок, що наш роутер 192.168.1.1 підключений до локальної мережі провайдера 195.5.8.0/24, яка, у свою чергу, підключена до мережі 10.50.50.0/24, звідки вже отримує доступ до зовнішньої мережі.

Бувають у мережевому житті (особливо у dial-up користувачів 😉 моменти, коли неможливо достукатися до якогось хоста (у мене це часто www.microsoft.com ;-|) - тут на допомогу і прийде ця утиліта (у Windows - tracert .exe) З її допомогою можна спробувати визначити на якій ділянці IP-мережі стався збій - чи то хост упав, чи у провайдер гальма, або у тебе з IP-з'єднанням хреново:).

Але за що я по-справжньому люблю tracert - так це за ті можливості дослідження IP-мереж, які він дає - а вони бувають різні, за масштабами та цілеспрямованістю;). Першим кроком може стати дослідження підмережі свого провайдера. За допомогою traceroute ти можеш досліджувати саму мережу, застосовуючи на практиці отримані теоретичні знання - про маршрутизацію, сервери DNS, бекбони, системи підмереж, та мало що ще;).

Як це працює?

Спочатку потрібно згадати формат заголовка IP-пакета, точніше одне з його полів - TTL (Time To Live). Це восьмибітне поле визначає максимальну кількість хопів (hop - "стрибок" - проходження дейтаграми від одного маршрутизатора до іншого) протягом якого пакет може знаходитися в мережі. Кожен маршрутизатор,
обробляє цю дейтаграму, виконує операцію TTL=TTL-1. Коли TTL стає рівним нулю, маршрутизатор знищує пакет,
відправнику надсилається ICMP-повідомлення Time
Exceeded.

Утиліта посилає у напрямку заданого хоста пакет з TTL=1, і чекає, від кого повернеться відповідь time exceeded. Відповідальний записується як перший хоп (результат першого кроку по дорозі до мети). Потім посилаються послідовно пакети з TTL=2, 3, 4 тощо. по порядку, поки при певному значенні TTL пакет не досягне мети та не отримає від неї відповіді.

*nix traceroute посилає у бік заданого хоста UDP-пакети на довільний порт - швидше за все не зайнятий іншим сервісом (наприклад 28942, 30471) або на зарезервований, наприклад 0, замовчуванням - 33434. Спочатку посилається серія з 3-х таких пакетів 1, після приходу відповідей заміряється час проходження та визначається доменне ім'я транзитного вузла (хоча це залежить від заданих опцій). Потім посилаються чергові серії пакетів з однаковим TTL, призначених для виявлення одного і того ж хопу. Наприкінці ми отримуємо від кінцевого хоста відгук port unreachable (порт недоступний), що означає завершення трасування.
Стандартний консольний Windows tracert працює так само, але посилає лише ICMP echo request пакети.

Сам я охоче користуюсь як стандартним tracert, так і вшитим у CyberKit (досить непоганою утилітою)
ще є Necrosoft Quick Traceroute). Під Лінуксом нічого додаткового порадити не можу - юзал тільки стандартний Debian"івський traceroute:).

На закінчення скажу, не бійся експериментувати - тільки так можна по-справжньому "зрозуміти" мережу. Шукай інформацію та користуйся нею. Хай щастить.

При пошуку причин несправностей у мережі, утиліта tracertпосідає друге місце після утиліти ping. Tracert(в Linux"e traceroute) дозволяє визначити, на якій ділянці мережі (між якими маршрутизаторами) виникла проблема. Для використання програми необхідно у командному рядку Windows або Linux виконати команду:

Tracert yandex.ru

натискаємо enter, і бачимо приблизно таке:

На малюнку вище видно, що між моїм комп'ютером та сервером yandex.ru знаходяться 12 проміжних маршрутизаторів, вказані IP адреси маршрутизаторів та час проходження пакета до кожного маршрутизатора.

Якщо на якійсь ділянці мережі виникла проблема (немає маршруту до мережі призначення, немає зв'язку з наступним маршрутизатором, немає вузла призначення у вказаній мережі тощо) тоді ми побачимо замість часу проходження пакета зірочки, а замість IP адреси маршрутизатора повідомлення "Перевищено" інтервал очікування для запиту":

То як же працює утиліта tracert?

Для того щоб відповісти на це питання, потрібно згадати структуру IP пакета, а точніше згадати одне з його полів - TTL (Число переходів):

При відправленні пакета це поле виставляється в 255 і потім кожен маршрутизатор, через який пройде даний пакет зменшує це значення на 1 тобто. TTL=TTL-1. Маршрутизатор, який отримує пакет зі значенням TTL=1, зменшує його на одиницю, та був видаляє пакет, т.к. значення поля TTL у пакета стало 0. Після того як пакет був відкинутий маршрутизатором, відправнику пакета відправляється ICMP-повідомлення з кодом 11: "Перевищення часового інтервалу". У заголовку IP-пакета з повідомленням ICMP джереломє IP-адреса маршрутизатора, що дропнув пакет, а призначенням- IP-адреса комп'ютера, що надіслав відкинутий пакет.

Тепер не складно здогадатися, як працює Tracert:

  • Надсилається IP-пакет на вказаний вузол (у нашому прикладі yandex.ru) зі значенням поля TTL=1
  • перший маршрутизатор на шляху пакету зменшує TTL і дропає(знищує) пакет
  • Маршрутизатор відправляє ICMP повідомлення що пакетик помер
  • Утиліта Tracertвитягує з ICMP пакета IP-адреса маршрутизатора вимірює витрачений час на проходження пакета до маршрутизатора
  • Якщо не вказано інше у параметрах запуску Tracert, то надсилається запит DNS-серверу та визначається доменне ім'я маршрутизатора, якщо таке є
  • У консоль виводиться IP-адреса (або доменне ім'я) першого маршрутизатора
  • Знову відправляється IP пакет на вказаний вузол, але з TTL=2
  • Пакет тремтить на другому проміжному маршрутизаторі
  • Процедура повторюється до тих пір, поки не прийде відповідь від вузла призначення (yandex.ru) або кількість проміжних вузлів не підвищить максимального значення. tracert– 30 вузлів.

Ось, власне, і все, нічого складного!

Планшети