Подивимося, що станеться, чи не так?
8.8.8.8 є хорошим прикладом, тому що принаймні з мого місцезнаходження я можу дістатись до нього і з, traceroute
і з ping
.
Спочатку спробуємо ping 8.8.8.8
подивитися і що відбувається:
$ tcpdump -n host 8.8.8.8 or icmp
15:36:51.045994 IP 10.4.27.179 > 8.8.8.8: ICMP echo request, id 7215, seq 0, length 64
15:36:51.062458 IP 8.8.8.8 > 10.4.27.179: ICMP echo reply, id 7215, seq 0, length 64
15:36:52.048350 IP 10.4.27.179 > 8.8.8.8: ICMP echo request, id 7215, seq 1, length 64
15:36:52.073657 IP 8.8.8.8 > 10.4.27.179: ICMP echo reply, id 7215, seq 1, length 64
Таким чином, ping
надсилає запит ехо-сигналу ICMP і очікує відповіді відлуння ICMP.
Зараз traceroute -n 8.8.8.8
:
15:41:31.803324 IP 10.4.27.179.44838 > 8.8.8.8.33435: UDP, length 24
15:41:31.815184 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.815343 IP 10.4.27.179.44838 > 8.8.8.8.33436: UDP, length 24
15:41:31.819654 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.819791 IP 10.4.27.179.44838 > 8.8.8.8.33437: UDP, length 24
15:41:31.824609 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.824754 IP 10.4.27.179.44838 > 8.8.8.8.33438: UDP, length 24
15:41:31.830506 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.830649 IP 10.4.27.179.44838 > 8.8.8.8.33439: UDP, length 24
15:41:31.834469 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.834565 IP 10.4.27.179.44838 > 8.8.8.8.33440: UDP, length 24
15:41:31.840962 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.841061 IP 10.4.27.179.44838 > 8.8.8.8.33441: UDP, length 24
15:41:31.847440 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.847634 IP 10.4.27.179.44838 > 8.8.8.8.33442: UDP, length 24
15:41:31.853664 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.853761 IP 10.4.27.179.44838 > 8.8.8.8.33443: UDP, length 24
15:41:31.859221 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.859269 IP 10.4.27.179.44838 > 8.8.8.8.33444: UDP, length 24
15:41:31.864149 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.864192 IP 10.4.27.179.44838 > 8.8.8.8.33445: UDP, length 24
15:41:31.870843 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.870922 IP 10.4.27.179.44838 > 8.8.8.8.33446: UDP, length 24
15:41:31.876200 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.876352 IP 10.4.27.179.44838 > 8.8.8.8.33447: UDP, length 24
15:41:31.882148 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.882249 IP 10.4.27.179.44838 > 8.8.8.8.33448: UDP, length 24
15:41:31.890076 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.890156 IP 10.4.27.179.44838 > 8.8.8.8.33449: UDP, length 24
15:41:31.896100 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.896163 IP 10.4.27.179.44838 > 8.8.8.8.33450: UDP, length 24
15:41:31.905037 IP 108.170.242.225 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.905235 IP 10.4.27.179.44838 > 8.8.8.8.33451: UDP, length 24
15:41:31.913206 IP 108.170.242.225 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.913283 IP 10.4.27.179.44838 > 8.8.8.8.33452: UDP, length 24
15:41:31.923428 IP 108.170.242.241 > 10.4.27.179: ICMP time exceeded in-transit, length 76
15:41:31.923520 IP 10.4.27.179.44838 > 8.8.8.8.33453: UDP, length 24
15:41:31.932266 IP 108.170.237.9 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.932441 IP 10.4.27.179.44838 > 8.8.8.8.33454: UDP, length 24
15:41:31.939961 IP 209.85.251.9 > 10.4.27.179: ICMP time exceeded in-transit, length 76
15:41:31.940043 IP 10.4.27.179.44838 > 8.8.8.8.33455: UDP, length 24
15:41:31.947460 IP 108.170.237.21 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.947508 IP 10.4.27.179.44838 > 8.8.8.8.33456: UDP, length 24
15:41:31.954824 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33456 unreachable, length 36
15:41:31.954888 IP 10.4.27.179.44838 > 8.8.8.8.33457: UDP, length 24
15:41:31.963601 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33457 unreachable, length 36
15:41:31.963671 IP 10.4.27.179.44838 > 8.8.8.8.33458: UDP, length 24
15:41:31.972407 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33458 unreachable, length 36
Отже traceroute
, принаймні впроваджена мною реалізація не надсилає ICMP. Швидше, він надсилає пакети UDP.
Що не видно в цьому сліді (хоча це було б, якби я дав збільшити подробиця) є те , що перші зонди мають ТТЛ 1, а потім збільшує Время_жізні для наступних зондів. Це призводить до того, що маршрутизатори між мною та 8.8.8.8 реагують на помилку ICMP ttl, перевищену помилкою, і саме так traceroute виявляє маршрутизатори тут і там.tcpdump
-v
Врешті-решт, ttl досить довгий, щоб зробити його до 8.8.8.8, і 8.8.8.8 відповідає на порт ICMP недоступною помилкою, оскільки він не має процесу прослуховування на порту UDP 44838. Ось як traceroute знає, що він досяг кінцевого пункту призначення .
Якщо щось тут і там блокує всі ICMP, то ні ping, ні traceroute не працюватимуть.
Але зазвичай це не так, що всі ICMP заблоковані, хоча це також не рідко. Блокування всіх ICMP є проблематичним: наприклад, він порушує шлях виявлення MTU , який спирається на необхідну помилку фрагментації ICMP. Пакети ICMP мають тип і код, і відповідальні оператори мережі блокують лише вибірково деякі типи чи коди, ті, що створюють потенцію для зловживань або розкриття певної інформації.
Наприклад, деякі хости взагалі не відповідатимуть на запит ехо в ICMP, і тому ping не працюватиме. Ідея полягає в тому, що, не реагуючи на пінг, зловмиснику важче виявити, які хости існують у мережі. На практиці це сумнівно, оскільки існують інші способи перевірити хоста. Наприклад, можна надіслати TCP SYN на порт 80 для пошуку веб-серверів.
Багато хостів також не надсилають ICMP-порту недоступною помилкою, коли отримують дейтаграму UDP або TCP SYN до порту, на якому вони не мають прослуховування процесу, і це порушує трасування. Знову ідея полягає в тому, щоб зловмиснику ускладнити карту мережі, але знову це лише незначне розчарування для зловмисника.
Оскільки traceroute - це програма, а не конкретний протокол, вона має інші способи зондування. Всі вони покладаються на збільшення TTL для виявлення маршрутизаторів, але можуть надсилатися різні види зондів, які можуть мати більш-менш шанси отримати відповідь від кінцевої точки. Наприклад, у моєму man tcpdump
списку є -I
можливість використовувати ехолоки ICMP, такі ж, як і ping. Він також -T
повинен використовувати зонди TCP SYN замість UDP. Якщо ви знаєте, що хост буде реагувати на ping
те -I
робить багато сенсу. Якщо ви знаєте, що хост прослуховує певний порт TCP, то -T
має сенс, можливо, спільно з -p
можливістю вибору порту.
На жаль, ці параметри можуть вимагати кореневих чи спеціальних можливостей, тому UDP робить справедливим за замовчуванням. Насправді аналогічний інструмент, tracepath
має це сказати на своїй довідковій сторінці:
ОПИС
Він простежує шлях до місця призначення, відкриваючи MTU по цьому шляху. Він використовує порт порту UDP або якийсь випадковий порт. Він схожий на traceroute, лише не вимагає привілеїв суперпользователя і не має фантазійних варіантів.