This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
software:article:utp_dpi [2015/05/22 18:01] – [RESET] root | software:article:utp_dpi [2015/05/27 23:28] – [Torrent/uTP — о протоколе и самодельных DPI] root | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Torrent/uTP — о протоколе и самодельных DPI ====== | ====== Torrent/uTP — о протоколе и самодельных DPI ====== | ||
- | В 2009 году появился [[http:// | ||
- | Суть задумки в том, чтобы не полагаться на [[http:// | ||
- | Другая причина это возможность приёма входящего соединения через NAT.\\ | ||
- | [[http:// | ||
{{: | {{: | ||
- | Вот какой бред написан в [[https://ru.wikipedia.org/ | + | В 2009 году появился [[http://en.wikipedia.org/ |
- | < | + | Суть задумки в том, |
+ | Другая причина это возможность приёма входящего соединения через NAT.\\ | ||
+ | [[http:// | ||
+ | А некоторые пользователи обнаружили что торренты качаются | ||
- | Как не правильно блокировать можно почитать тут: http://geektimes.ru/post/243305/ | + | Вот какой бред |
- | и немного ниже :) | + | "Также провайдерам намного сложнее |
+ | [[href=" | ||
===== Жизнь с uTP ===== | ===== Жизнь с uTP ===== | ||
- | <spoiler title=" | + | В адрес авторов uTP звучала масса упрёков в изобретении TCP с нуля и хождении по всем граблям, |
- | В адрес авторов uTP звучала масса упрёков в изобретении TCP с нуля и хождении по всем граблям, | + | С точки зрения разработчиков - выбора особо не было: TCP все провайдеры шейпят, |
- | С точки зрения разработчиков - выбора особо не было: TCP все провайдеры шейпят и душат, для управления всеми аспектами работы tcp протокола в винде нужны права администратора и скорее всего свой драйвер, | + | Через NAT нормально ходят только TCP и UDP.\\ |
- | Потому просто взяли и сделали поверх UDP. | + | Потому просто взяли и сделали поверх UDP.\\ |
- | Это решение подкосило многие домашние мыльницы и некоторых провайдеров. | + | Это решение подкосило многие домашние мыльницы и некоторых провайдеров: количество трансляций в NAT роутеров стало очень быстро расти.\\ |
- | Количество трансляций в NAT роутеров стало очень быстро расти. | + | Для TCP - NAT знает когда соединение установлено и когда оно завершено, |
- | Для TCP - NAT знает когда соединение установлено и когда оно завершено, | + | |
- | Другим побочным эффектом явилось то, что uTorrent запрашивал больше трафика чем позволял тарифный план провайдера, | + | Другим побочным эффектом явилось то, что uTorrent запрашивал больше трафика чем позволял тарифный план провайдера, |
- | Авторы uTorrent позже | + | Авторы uTorrent позже научились правильно подстраиваться под канал, но их эксперименты стоили нервов и денег.\\ |
- | Ещё одним неприятным моментом в экспериментах с uTP на начальных этапах было то, что он генерировал большую пакетную нагрузку, | + | Ещё одним неприятным моментом в экспериментах с uTP на начальных этапах было то, что он генерировал большую пакетную нагрузку, |
- | Повышение пакетрейта губительно сказывается на WiFi и прочих радиолинках. | + | Повышение пакетрейта губительно сказывается на WiFi и прочих радиолинках.\\ |
- | В целом, протокол оказал ощутимое влияние как на провайдеров так и на производителей железа, | + | В целом, протокол оказал ощутимое влияние как на провайдеров так и на производителей железа, |
Line 85: | Line 84: | ||
Вообще довольно запутанная и странная схема установления соединения: | Вообще довольно запутанная и странная схема установления соединения: | ||
- | >> SYN: connid=34 - запрос на установление соединения\\ | + | > SYN: connid=34 - запрос на установление соединения\\ |
- | << STATE: connid=34 - подтверждение\\ | + | < STATE: connid=34 - подтверждение\\ |
- | >> DATA: connid=35 - передача данных\\ | + | > DATA: connid=35 - передача данных\\ |
- | << STATE: connid=34 - подтверждение передачи данных\\ | + | < STATE: connid=34 - подтверждение передачи данных\\ |
Те инициатор соединения задаёт номер соединения в первом пакете а в дальнейшем использует номер на единицу больше.\\ | Те инициатор соединения задаёт номер соединения в первом пакете а в дальнейшем использует номер на единицу больше.\\ | ||
Line 132: | Line 131: | ||
[[ru: | [[ru: | ||
Прошло полтора года, я успел покопаться в ядре FreeBSD и netgraph, лучше узнать как работает сеть и пришла мысль: uTP имеет состояния аналогичные TCP, значит чтобы его 100% определять нужно эти состояния отслеживать.\\ | Прошло полтора года, я успел покопаться в ядре FreeBSD и netgraph, лучше узнать как работает сеть и пришла мысль: uTP имеет состояния аналогичные TCP, значит чтобы его 100% определять нужно эти состояния отслеживать.\\ | ||
- | Заодно я ещё раз заглянул в libuTP и получше посмотрел за что можно зацепится.\\ | + | Заодно я ещё раз заглянул в [[https:// |
- | За сигнатуры | + | За сигнатуры решил не цепляться, |
Идеальный вариант это свой " | Идеальный вариант это свой " | ||
- | В итоге получилась netgraph нода, которую можно подключать к L2 хукам типа ng_ether или L3 хукам, например ng_ipfw. В первом случае можно вообще сделать прозрачный эзернет мост из двух сетевух (не обязательно физических). Ещё можно просто поставить | + | В итоге получилась netgraph нода, которую можно подключать к L2 хукам типа ng_ether или L3 хукам, например ng_ipfw. В первом случае можно вообще сделать прозрачный эзернет мост из двух сетевух (не обязательно физических). Ещё можно просто поставить |
- | Результатов замеров производительности | + | Результатов замеров производительности не сохранил.\\ |
Однако нода без проблем параллелится по ядрам, может выполнятся как контексте ISR так и потоками netgraph, взаимные блокировки потоков сведены к минимуму.\\ | Однако нода без проблем параллелится по ядрам, может выполнятся как контексте ISR так и потоками netgraph, взаимные блокировки потоков сведены к минимуму.\\ | ||
Line 165: | Line 164: | ||
< | < | ||
Чтобы сгенерировать RST пакет все данные есть: src ip:port + dst ip:port, pkt_ver, connid, ack_nr, seq_nr. | Чтобы сгенерировать RST пакет все данные есть: src ip:port + dst ip:port, pkt_ver, connid, ack_nr, seq_nr. | ||
- | Фактически у IP/UDP пакета заменяются данные, | + | Фактически у IP/UDP пакета заменяются данные, |
- | Подробнее про счётчики - по <a href=" | + | Сейчас это всё ещё может быть актуальным для различных беспроводных сетей и офисных сетей, остальные уже обновились и расширились.\\ |
- | + | ||
- | Сейчас это всё ещё может быть актуальным для различных беспроводных сетей и офисных сетей, остальные уже обновились и расширились. | + | |
===== Сигнатуры ===== | ===== Сигнатуры ===== | ||
- | Провайдеры искали способ как быстро нормализовать работу сети и решили фильтровать uTP по сигнатурам пакетов, | + | Администраторы искали способ как быстро нормализовать работу сети и решили фильтровать uTP по сигнатурам пакетов, |
" | " | ||
- | Притом, | + | Притом, |
- | Спустя пару месяцев " | + | Спустя пару месяцев " |
- | Ещё через некоторое время авторы поменяли пару незначительных для протокола начальных значений в SYN пакете и что то <a href="http:// | + | Ещё через некоторое время авторы |
- | После того как ng_utp был написан стало понятно что проверять корректность работы с помощью tcpdump без правильных сигнатур мягко говоря не удобно - слишком много лишнего приходилось пробегать глазами. | + | После того как ng_utp был написан стало понятно что проверять корректность работы с помощью tcpdump без правильных сигнатур мягко говоря не удобно - слишком много лишнего приходилось пробегать глазами.\\ |
- | Я ещё раз пробежался по коду | + | Я ещё раз пробежался по коду |
Line 198: | Line 195: | ||
rst - 4 bytes: | rst - 4 bytes: | ||
< | < | ||
- | 31 = udp hdr len (8) + upd pkt data len | ||
- | |||
upd header included: | upd header included: | ||
< | < | ||
Line 206: | Line 201: | ||
==== Версия 1 ==== | ==== Версия 1 ==== | ||
=== SYN === | === SYN === | ||
- | syn - 14 bytes | + | syn - 14 bytes: |
- | + | < | |
- | 'udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x40 and udp[1] = 2 and udp[18:2] = 0 and udp[20] = 0 and udp[21] = 8 and udp[22:4] = 0 and udp[26:4] = 0' | + | "(udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x40)" можно преобразовать в: "udp[0] = 0x41"\\ |
- | + | ||
- | (udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x40) => udp[0] = 0x41 | + | |
- | + | ||
- | 38 = udp hdr len (8) + upd pkt data len | + | |
upd header included: | upd header included: | ||
- | '(udp[4:2] = 38 and udp[8:2] = 0x4102 and udp[26:4] = 0x00000008 and udp[30:4] = 0 and udp[34:4] = 0)' | + | < |
=== RESET === | === RESET === | ||
- | rst - 4 bytes | + | rst - 4 bytes: |
- | 'udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x30 and udp[1] = 0' | + | < |
- | (udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x30) => udp[0] = 0x31) | + | "udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x30" можно преобразовать в: "udp[0] = 0x31"\\ |
- | 28 = udp hdr len (8) + upd pkt data len | + | |
upd header included: | upd header included: | ||
- | '(udp[4:2] = 28 and udp[8:2] = 0x3100)' | + | < |
===== Обнаружение фильтрации ===== | ===== Обнаружение фильтрации ===== | ||
- | Проще всего, используя описание протокола, | + | Проще всего, используя описание протокола, |
- | По сути нужно симулировать установление соединения, | + | По сути нужно симулировать установление соединения, |
- | Дальше один клиент запускается в интернете, | + | Дальше один клиент запускается в интернете, |
- | Сходным образом при использовании yota некоторые пакеты из l2tp на завершающем этапе согласования пропадают в 100% случаев. Так было ещё в сентябре. | + | Сходным образом при использовании yota некоторые пакеты из l2tp на завершающем этапе согласования пропадают в 100% случаев. Так было ещё в сентябре |
===== Заключение ===== | ===== Заключение ===== | ||
- | 1. То что <a href=" | + | 1. uTP имеет достаточно чёткие сигнатуры и легко ловится DPI.\\ |
- | Более того, ловить сигнатуры в TCP ощутимо сложнее, | + | Более того, ловить сигнатуры в TCP ощутимо сложнее, |
- | Авторы uTP либо не ставили себе цель сделать протокол без сигнатур либо даже не приблизись к цели. | + | Авторы uTP либо не ставили себе цель сделать протокол без сигнатур либо даже не приблизись к цели.\\ |
- | (На мой взгляд в начале не ставили, | + | На мой взгляд в начале не ставили, |
- | <a href=" | + | |
- | 2. Производители различных DPI уже давно добавили сигнатуры для uTP, вряд ли им это было трудно сделать. | + | 2. Производители различных DPI уже давно добавили сигнатуры для uTP, вряд ли им это было трудно сделать.\\ |
- | 3. В порядке слухов: | + | 3. В порядке слухов: |
- | 4. Для IPv6 код не писал, на всякий случай ;) | + | 4. Для IPv6 код не писал, на всякий случай ;)\\ |
5. uTP не лучше TCP для передачи данных, | 5. uTP не лучше TCP для передачи данных, |