Как трейсероут выявляет VPN-туннель: анализ TTL и маршрутных хвостов
Содержание
- Механика traceroute: быстрый разбор
- Раздвоение TTL: главный признак туннеля
- Маршрутные хвосты: что именно ты видишь
- Кейс: WireGuard и странные скачки
- Кейс: OpenVPN и потерянные хопы
- Кейс: L2TP/IPsec и двойные ответы
- Как отличить VPN от прокси
- Технические детали: что смотреть в выводе
- Типичные ошибки при анализе
- Практический пример: анализ вывода
- Скрипт для автоматического анализа
- Границы метода
- Итоговая таблица признаков
Механика traceroute: быстрый разбор
Traceroute отправляет пакеты с последовательно увеличивающимся TTL. Первый пакет — TTL=1, второй — TTL=2, и так далее. Каждый маршрутизатор на пути уменьшает TTL на единицу. Когда TTL достигает нуля, роутер отбрасывает пакет и шлёт обратно ICMP Time Exceeded. Так ты видишь каждый хоп.
Но есть нюанс. VPN-туннель — это не физический маршрутизатор. Это логическая конструкция. Пакет внутри туннеля инкапсулирован, его TTL не меняется на промежуточных узлах. Внешний заголовок имеет свой TTL, внутренний — свой. Отсюда и начинается магия.
Раздвоение TTL: главный признак туннеля
Когда трафик идёт через VPN, ты видишь странную картину. Скажем, до сервера 12 хопов. Но после хопа №4 появляется скачок TTL. Вместо плавного уменьшения — резкий обрыв и новый отсчёт. Это признак того, что пакет попал в туннель.
Внутренний TTL не тронут. Внешний — уменьшается. Когда туннель заканчивается, внутренний пакет продолжает путь с исходным TTL. Поэтому после выхода из туннеля количество хопов может быть меньше ожидаемого. Или больше — если применили дополнительную маршрутизацию.
Маршрутные хвосты: что именно ты видишь
Хвост — это серия одинаковых IP-адресов в конце трейсероута. Например, 10.10.0.1 повторяется 5-6 раз подряд. Это не баг. Это признак того, что пакеты идут через NAT или туннель. Промежуточные узлы не уменьшают TTL внутреннего пакета, поэтому он проходит несколько хопов, которые не отображаются.
Ещё один хвост — когда после определённого момента все хопы показывают один и тот же IP, но с разным временем ответа. Это может быть VPN-сервер, который маршрутизирует трафик дальше, но не меняет IP в ответах. Или это шлюз, который отвечает за все узлы внутри своей сети.
Кейс: WireGuard и странные скачки
Пример: сервер на WireGuard, клиент в Москве, сервер в Амстердаме. Traceroute показывает 8 хопов до сервера. Но на хопе №5 — IP 10.99.0.1. Это приватный адрес. Внезапно. Публичный маршрут не может содержать приватные адреса. Если ты видишь приватный IP в середине трейсероута — это почти наверняка VPN-туннель.
Причина: WireGuard инкапсулирует пакеты в UDP. Внешний заголовок идёт по публичному маршруту, внутренний — по приватному. Traceroute видит внешний заголовок до точки входа в туннель, потом — внутренний. Отсюда и приватные адреса в середине маршрута.
Кейс: OpenVPN и потерянные хопы
Другой случай: OpenVPN в режиме tun. Клиент в Питере, сервер во Франции. Traceroute показывает 15 хопов. Но между хопом №7 и №8 — пропуск. Вместо плавного увеличения задержки — резкий скачок с 20 мс до 80 мс. Это признак того, что пакеты пересекли туннель.
Почему так: OpenVPN шифрует и инкапсулирует весь IP-пакет. Внутренний TTL не изменяется при прохождении через туннель. Когда пакет выходит из туннеля, он продолжает путь с тем же TTL, что был до входа. Поэтому количество хопов внутри туннеля не отображается. Внешне это выглядит как "телепортация" через несколько узлов.
Кейс: L2TP/IPsec и двойные ответы
L2TP/IPsec — отдельная история. Тут два уровня инкапсуляции. Сначала IPsec шифрует пакет, потом L2TP добавляет свой заголовок. В результате traceroute может показывать двойные ответы от одного IP. Сначала ответ с TTL=1, потом с TTL=2. Это сбивает с толку.
Пример: сервер на L2TP/IPsec, клиент в Новосибирске, сервер в Германии. Traceroute показывает хоп №4 с IP 192.168.1.1. При этом время ответа — 45 мс. Через хоп — тот же IP, но время — 47 мс. Это не разные узлы. Это один и тот же узел, отвечающий на разные уровни инкапсуляции.
Как отличить VPN от прокси
Прокси работает на прикладном уровне. Он не инкапсулирует пакеты. Поэтому traceroute до прокси показывает обычный маршрут без аномалий. VPN — на сетевом уровне. Он создаёт виртуальный интерфейс. Отсюда и все странности с TTL.
Есть простой тест. Запусти traceroute до адреса, который знаешь, что он за VPN. Потом — до обычного сайта. Сравни. Если в первом случае есть приватные IP, скачки TTL или двойные ответы — это VPN. Если маршрут чистый и ровный — прокси.
Например, если ты используешь IPv6 прокси с сайта lexic.ml, трейсероут до него покажет обычный маршрут. Никаких приватных адресов, никаких скачков. Прокси не меняет сетевую структуру. Он просто перенаправляет запросы.
Технические детали: что смотреть в выводе
Вот что нужно анализировать в выводе traceroute:
| Признак | Что означает |
|---------|--------------|
| Приватный IP в середине маршрута (10.x.x.x, 192.168.x.x) | Туннель или NAT |
| Резкий скачок задержки (20 мс → 80 мс) | Пересечение границы туннеля |
| Повторяющиеся IP в конце | Шлюз VPN-сервера |
| Разные TTL в ответах от одного IP | Многоуровневая инкапсуляция |
| Отсутствие ответов (звёздочки) на нескольких хопах | Фильтрация ICMP или туннель |
Типичные ошибки при анализе
Первая ошибка — считать, что звёздочки в выводе означают туннель. Нет. Многие роутеры не отвечают на ICMP Time Exceeded. Это нормально. Звёздочки могут быть просто фильтрацией.
Вторая ошибка — игнорировать время ответа. Если после хопа с приватным IP задержка резко растёт — это не сеть виновата. Это шифрование и инкапсуляция добавляют оверхед. Особенно заметно на OpenVPN с AES-256. Каждый пакет шифруется, что добавляет 1-3 мс на хоп.
Третья ошибка — путать NAT с VPN. NAT тоже скрывает внутренние адреса. Но NAT не меняет TTL. Если ты видишь плавное уменьшение TTL и при этом приватные адреса — это скорее NAT, чем VPN. VPN даёт скачки TTL и аномалии в задержках.
Практический пример: анализ вывода
```bash
\$ traceroute -n -T -p 443 example.com
traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets
1 192.168.1.1 1.2 ms 1.1 ms 1.3 ms
2 10.0.0.1 3.4 ms 3.2 ms 3.5 ms
3 172.16.0.1 5.6 ms 5.8 ms 5.5 ms
4 10.10.10.1 12.3 ms 12.1 ms 12.5 ms
5 10.10.10.1 45.6 ms 45.2 ms 45.8 ms
6 10.10.10.1 46.1 ms 45.9 ms 46.3 ms
7 93.184.216.34 47.2 ms 47.0 ms 47.5 ms
```
Что мы видим: три приватных адреса подряд, потом повторяющийся 10.10.10.1, потом резкий скачок задержки с 12 мс до 45 мс. Это классический VPN-туннель. Узел 10.10.10.1 — точка входа в туннель. Он отвечает на все хопы внутри туннеля, потому что внешние пакеты маршрутизируются через него.
Скрипт для автоматического анализа
Можно автоматизировать детекцию. Простой скрипт на Python:
```python
import subprocess
import re
import sys
def analyze_traceroute(host):
result = subprocess.run(
['traceroute', '-n', '-m', '30', host],
capture_output=True, text=True
)
lines = result.stdout.split('\n')[1:]
hops = []
for line in lines:
match = re.search(r'\d+\s+(\d+\.\d+\.\d+\.\d+)\s+([\d.]+)', line)
if match:
hops.append({'ip': match.group(1), 'rtt': float(match.group(2))})
private_ips = []
for hop in hops:
ip = hop['ip']
if ip.startswith('10.') or ip.startswith('192.168.') or \
(ip.startswith('172.') and 16 <= int(ip.split('.')[1]) <= 31):
private_ips.append(hop)
if len(private_ips) > 2:
print(f"VPN tunnel detected: {len(private_ips)} private hops")
else:
print("No clear VPN signs")
if __name__ == '__main__':
analyze_traceroute(sys.argv[1])
```
Этот скрипт ищет приватные адреса в маршруте. Если их больше двух — скорее всего, туннель. Но помни: это эвристика. Некоторые корпоративные сети используют приватные адреса без VPN.
Границы метода
Traceroute не всегда работает. Если VPN использует UDP с шифрованием и не отвечает на ICMP — ты увидишь просто звёздочки. Никакой информации. Особенно это касается коммерческих VPN-сервисов, которые фильтруют ICMP.
Ещё одна проблема — MPLS в магистральных сетях. Провайдеры используют MPLS для маршрутизации. Внутри MPLS-туннеля TTL не уменьшается так, как в обычном IP. Это даёт ложные признаки туннеля. Отличить MPLS от VPN можно по времени ответа: MPLS добавляет меньше оверхеда, чем шифрование.
И последнее: IPv6. В IPv6 traceroute работает иначе. Поле Hop Limit вместо TTL. Но принцип тот же. VPN-туннели в IPv6 дают те же признаки: приватные адреса (хотя в IPv6 их роль играют ULA — Unique Local Addresses), скачки задержки, повторяющиеся адреса.
Итоговая таблица признаков
| Признак | VPN | Прокси | Обычный маршрут |
|---------|-----|--------|-----------------|
| Приватные IP в середине | Да | Нет | Редко |
| Скачки TTL | Да | Нет | Нет |
| Повторяющиеся IP | Часто | Нет | Редко |
| Резкие скачки задержки | Да | Нет | Нет |
| Звёздочки | Часто | Редко | Иногда |
Traceroute — не панацея. Но если ты знаешь, что искать, он расскажет многое о сетевой инфраструктуре. Главное — не делать поспешных выводов из одного запуска. Прогони несколько раз, сравни результаты, учти особенности сети. И тогда картина станет ясной.