Ttl как проверить
Столкнулся с проблемой раздачи интернета с Android-телефона на другие устройства, через мобильную точку доступа, у некоторых операторов. Оператор или вообще запрещает раздавать интернет, или берет за это деньги. Однако есть способы обойти этот запрет. Здесь расскажу, что у меня получилось.
Содержание
Как оператор узнает, что интернет раздается
Оператор на своей стороне смотрит на значение TTL в заголовках IP-пакетов, приходящих от клиента. Схематично выглядит так:
Если на телефоне открывать в браузере какую-нибудь страничку, то провайдеру от телефона будут приходить пакеты с TTL 64. Такие пакеты он пропускает.
Но если включить мобильную точку доступа, подключиться к ней, например, с планшета, и на планшете открыть страницу, то, проходя через мобильную точку доступа на телефоне TTL будет уменьшаться на 1 и провайдеру будут уходить пакеты с TTL 63, которые он будет отбрасывать. Уменьшение TTL при прохождении через роутер — это стандартизированное поведение роутера, такое поведение предусмотрено стандартом RFC791.
В этой ситуации выхода два — либо на планшете выставлять TTL 65, чтобы, проходя через телефон, провайдеру приходили пакеты с TTL 64, либо на самом телефоне делать так, чтобы он не уменьшал TTL.
Если wi-fi клиент — дектоп-машина с Windows или MacOS, то выставить TTL 65 можно одной командой.
Windows
Создать в реестре ключ
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DefaultTTL
типа REG_DWORD со значением 65 (в десятичной системе)
MacOS
Команда в консоле:
$ sudo sysctl -w net.inet.ip.ttl=65
Но если клиент планшет на iOS или другое устройство, где нельзя просто так выставить TTL, то придется воспользоваться вторым способом — заставить телефон не уменьшать TTL для проходящих через него пакетов. Это может быть не совсем просто.
Учим телефон не уменьшать TTL
Этот способ потребует root-права (инструкция) на android-телефоне или jailbreak на iOS. Т.к. я делал это на Android, то опишу как делать для него. Про iOS здесь инструкции не будет.
Для разных устройств, процедура будет отличаться, я постараюсь рассказать в чем будут заключаться эти отличия. В данном примере я использую OnePlus 3 и Android 8.0 Oreo
Итак, у нас есть Android телефон с root-правами. Узнаем, умеет ли ядро системы работать с TTL. Для этого смотрим содержимое двух файлов на телефоне (например с помощью приложения ES Проводник, оно умеет смотреть системные файлы):
/proc/net/ip_tables_matches /proc/net/ip_tables_targets
В обеих должно быть упоминание TTL. В моем случае в ip_tables_targets упоминания ttl не было. Это значит, что ядро не умеет изменять TTL. Чтобы его научить этому, нам понадобится из исходников собрать модуль ядра и загрузить его в телефон.
Как собрать модуль ядра
Нам понадобятся:
- ОС — Linux или MacOS (можно собрать и на Windows — см.ниже)
- исходники ядра для конкретного устройства
- toolchain определенной версии и опредленной архитектуры
Я собирал модуль на Windows, но используя, Ubuntu-подсистему в Windows 10. Как ее включить я писал . Если у вас не Win10, то придется ставить Ubuntu на VirtualBox-машину.
Для других Oneplus-ов можно взять их рядом — https://github.com/OnePlusOSS. Для других моделей телефонов надо искать исходики где-то в интернете или на сайте производителя.
Toolchain — это утилиты для сборки кода под опредленную платформу. Узнать какая именно нужна для вашего телефона можно так:
C:\Users\fote>adb shell OnePlus3:/ $ uname -a Linux localhost 3.18.66-perf+ #1 SMP PREEMPT Thu Dec 6 00:54:59 CST 2018 aarch64 OnePlus3:/ $ cat /proc/version Linux version 3.18.66-perf+ (OnePlus@ubuntu-117) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #1 SMP PREEMPT Thu Dec 6 00:54:59 CST 2018
В моем случае это aarch64. Из этого вывода также понадобится версия gcc: 4.9 и версия ядра: 3.18.66-perf+
Далее идем сюда — https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/ и скачиваем нужный тулчейн. Версии для MacOS можно найти также по этой ссылке. В моем случае я скачал aarch64-linux-android-4.9, здесь aarch64 и 4.9 совпадает с теми версиями которые мы узнали выше.
Теперь идем в консоль и готовимся к компиляции. Установим необходимые тулзы и склонируем репы с тулчейном и исходниками ядра в домашнюю папку:
$ sudo apt install build-essential python-minimal libncurses5-dev libncursesw5-dev $ cd ~ $ git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/ $ git clone —branch=QC8996_O_8.0.0 https://github.com/OnePlusOSS/android_kernel_oneplus_msm8996
В исходниках ядра смотрим в папку arch и подбираем нужную архитектуру. В моем случае в этой папке, нет aarch64, но есть arm64. Это то же самое, просто называется по другому. Буду использовать эту архитектуру. Указываем ее и путь до бинарей тулчейна в переменных окружения:
$ export ARCH=arm64 $ export CROSS_COMPILE=/home/fote/aarch64-linux-android-4.9/bin/aarch64-linux-android- Переменная CROSS_COMPILE именно такая, заканчивается на -. Здесь нет ошибки.
Теперь надо создать конфиг для будущей сборки. Возможные варианты конфигов в моем случае лежат в папке с исходниками ядра в arch/arm64/configs (вместо arm64 может быть ваша архитектура). Вспоминая версию ядра, которая установлена в телефоне, выбираю конфиг msm-perf_defconfig:
$ cd ~/android_kernel_oneplus_msm8996/ $ make msm-perf_defconfig
После того как конфиг создан, нам надо внести в него изменения, чтобы нужный нам модуль для фиксации TTL скомпилировался. Для этого выполняем:
$ make menuconfig
Появится интерактиваная утилита, в которой нужно найти нужный модуль.
Переходя по дереву внутрь, и, найдя TTL Target support, нажать M, чтобы указать, что нужно скомпилировать этот модуль.
Сохраняем конфиг, выходим и собираем ядро с модулями:
$ make $ make modules Если эти команды завершились ошибкой, значит, скорее всего неправильно выбран конфиг, toolchain или сами исходники ядра. Определенные исходники можно собрать только подходящим тулчейном и с подходящим конфигом.
Если ошибок не было, то в папке с исходниками должен появится файл net/netfilter/xt_HL.ko
Вот мой скомпилированный файл для OnePlus 3, Android 8.0.0 — xt_HL.ko. Можно сразу взять его, если совпадает модель телефона и версия системы.
Копируем его на телефон, и через adb shell пытаемся включить его (чтобы в adb shell работал su, надо в /system/build.prop добавить строку ro.debuggable=1, например с помощью ES Проводника):
C:\Users\fote>adb shell OnePlus3:/ $ su OnePlus3:/ # insmod /sdcard/xt_HL.ko Если insmod возвращает ошибку exec format error, значит, скорее всего, неправильно была выбрана версия исходников ядра или архитектура. В dmesg можно узнать подробности ошибки совместимости, и пересобрать под правильную версию.
Если модуль загрузился, можно пробовать зафиксировать TTL:
# iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL —ttl-set 64 , подключиться через мобильную точку доступа и попробовать открыть какую-нибудь страничку в браузере.
И наконец, добавляем в автозагрузку телефона скрипт, который будет включать фиксацию TTL:
Хотя современные компании, предоставляющие доступ в интернет, обеспечивают абонентам максимальную скорость доступа и оптимальные настройки для работы, некоторые модификации в программное обеспечение доступа может внести и сам пользователь. Благодаря таким изменениям удается добиться более качественного, быстрого и стабильного соединения. Материал рассматривает понятие TTL: что это такое, на что влияет параметр, как его изменить и стоит ли это делать.
Что такое TTL?
TTL – это показатель, который имеет каждое устройство, обладающее способностью выходить в интернет. TTL- аббревиатура, дословно обозначающая Time To Live, что переводится, как время жизни. В данном случае речь идет о времени жизни IP-пакета – сформированного набора данных, в форме которого информация передается от центрального сервера пользователю и обратно.
Речь идет о времени, которое пакет может просуществовать без повреждений и потерь информации при передаче от одного узла связи к другому. Изначально предполагалось измерять длительность такой «жизни» в секундах, отсюда и аббревиатура.
Существование данного параметра необходимо для того, чтобы любой, переданный в любом направлении, IP-пакет не мог курсировать по сети бесконечное количество времени.
Принцип действия данной настройки состоит в следующем: каждый последующий маршрутизатор (либо узел сети) уменьшает время жизни пакета на единицу, так как расчет в секундах устарел. Некоторые узлы связи можно настроить таким образом, что при маршрутизации пака уменьшения TTL на единицу именно на данном узле происходить не будет, что продляет фактическое время целостности пака. Но сделать такое можно не со всеми узлами маршрута.
TTL: что это такое в телефоне, компьютере и какое непосредственно влияние оказывает на работу устройства и стабильность соединения? Когда пакет слишком долго перенаправляется от узла к узлу, в итоге его TTL становится равно нулю, и он уничтожается. Пользователь в этот момент получает уведомление «Время ожидания ответа от сервера истекло» или т. п.
То есть, при медленном интернет-соединении, чрезмерно удаленном сервере и т. п. сайт на вашем устройстве может не загружаться как раз потому, что его TTL слишком мало, чтобы его хватило для передачи конкретному очень удаленному пользователю (вам).
Фактически чем больше TTL пакетов, тем выше вероятность, что даже очень физически удаленный от итогового пользователя сервер сможет передать информацию в полном объеме.
Правильно настраивать и изменять TTL можно в большую сторону, при таком изменении сайты станут подгружаться лучше. Возможно также настроить свой роутер таким образом, чтобы прохождение через него не уменьшало на единицу длительность существования пакета. Для выполнения таких изменений и настроек используются специальные утилиты для работы с сетевым оборудованием.
Показатель имеет ряд ограничений, связанных с современными техническими возможностями сети. Максимальное значение TTL составляет 255, тогда как базовое среднее, характерное для большинства современных устройств связи – 64 TTL. Оно является базовым начальным значением, которое используют Linux, Mac, iOS, Android, и которое подлежит, при необходимости, изменению.
А вот у Windows стартовый показатель выше, составляет 128, что обеспечивает более стабильную связь.
Обратите внимание, что понятие TTL применимо только к протоколам IPv4, тогда как в протоколе IPv6, оно уже переименовано в Hop Limit – максимальное число хопов, то есть преодолеваемых отрезков от узла к узлу, тех самых единиц, о которых идет речь выше.
Все узлы сети уменьшают TTL. Исключение составляют только коммутаторы, которые неспособны как-либо на него повлиять, так как работают в канальном режиме.
Как изменить TTL на Андроид?
Устройства с операционной системой Андроид, имеющие оборудование для выхода в интернет, также имеют определенный показатель TTL отправляемых и получаемых пакетов при загрузке сайта.
Менять параметр нужно для того, чтобы усложнить контроль трафика мобильными операторами. Так, если абонент имеет безлимитный трафик, то когда он превращает свой смартфон в точку доступа, которой подключается дополнительное устройство, то оператор «видит», что TTL становится на одну единицу меньше ожидаемого, так как в систему добавился еще один узел.
Это позволяет оператору блокировать доступ в интернет для дополнительного устройства. То есть, повышение параметра на одну единицу приведет к тому, что при подключении одного дополнительного устройства (узла) показатель у оператора все равно будет соответствовать ожидаемому, потому блокировки доступа не произойдет.
Соответственно, если вы хотите подключить два или три устройства, то и показатель нужно повысить на 2 или 3.
Таким образом, правильно установленный параметр TTL позволяет использовать смартфон с безлимитным подключением к интернету как точку доступа для нескольких устройств.
Изменения можно произвести как обладая root-правами, так и без них, как применяя специальные программы, так и с помощью собственных ресурсов смартфона. Для обеспечения бесперебойного соединения вам может потребоваться изменить параметр, что делается следующим образом:
Шаг 1. Перейдите в Play Market и скачайте в нем программу Terminal Emulator for Android. Данное приложение позволяет вам управлять настройками вашего мобильного устройства с помощью простого интерфейса, аналогичного командной строке.
Шаг 2. Запустите приложение. Сразу после запуска откроется окно черного цвета с полями ввода команд. Наберите в нем команду cat/proc/sys/net/ipv4/ip_default_ttl. Нажмите кнопку Ввод и ожидайте результата.
Шаг 3. Аналогично интерфейсу командной строки Windows, приложение запустит анализ системы, и когда он будет завершен на экране командной строки отобразится базовое значение TTL для данной модели устройства.
Шаг 4. Отредактируйте отобразившееся значение на единицу, если хотите подключить одно устройство, увеличьте показатель на две единицы, если устройства два и так далее. Аналогичные изменения внесите в программное обеспечение всех устройств, которые вы собираетесь подключать к сети – если этого не сделать, то доступ в интернет по-прежнему станет блокироваться.
Метод хорош тем, что позволяет быстро и без особых усилий изменить базовые настройки устройств для доступа в интернет. Существенный недостаток же его в том, что работает он не на всех видах устройств.
Понять, что методика неэффективна для вашего смартфона поможет командная строка, в которой после ввода соответствующей команды появится уведомление об ошибке, а не информация о TTL.
Другое важное положительное отличие способа – отсутствие необходимости получать root-права на устройстве, что на некоторых современных моделях довольно затруднительно. Если эмулятор подходит для вашей модели телефона, то он одинаково эффективно работает как с рут-правами, так и без них.
Ручное изменение TTL
Под ручными в данном случае понимается такое изменение, которое не требует скачивания посторонних программ, которое можно выполнить только собственными ресурсами вашего смартфона. В процессе используется файловый менеджер ES Проводник, который предустановлен по умолчанию на многих моделях современных Андроид-устройств.
Шаг 1. Переведите свое мобильное устройство в режим Полета – в процессе работы ваших интернет-модулей внести изменения будет невозможно.
Шаг 2. Теперь запустите Проводник. Введите в строку пути следующее значение – proc/sys/net/ipv4/ip_default_ttl, нажмите Перейти. Так вы получите доступ к файлу для управления обсуждаемым параметром.
Шаг 3. Теперь найденный файл откройте с помощью любого текстового редактора, установленного на вашем мобильном устройстве. Найдите в нем необходимый вам показатель, после чего измените его и сохраните изменения.
Из описания процесса становится ясно, что произвести его можно с помощью любого, установленного у вас файлового менеджера-проводника.
Если же текстовый редактор на смартфоне отсутствует, можно скопировать файл на компьютер, изменить значение, а затем снова поместить измененный файл в исходную папку, произведя замену предыдущего, неизмененного.
Многие поставщики доступа в сеть и мобильные операторы вносят в свои договоры с абонентом особое условие – не увеличивать, не уменьшать ttl в роутере – что это такое мы выяснили, и ясно, почему его не следует повышать, но почему его нельзя также и понижать?
При произведении таких действий вы фактически сделаете выход в интернет с вашего основного устройства невозможным, так как изначальные параметры минимальны и необходимы для осуществления соединения.
Как пользоваться TTL Master?
TTL Master – простая, удобная и функциональная программа, предназначенная для изменения параметра на устройствах, владельцы которых получили права разработчика (root).
Преимущество ее в максимальной простоте работы и том, что подходит она практически ко всем видам мобильных устройств на базе операционной системы Андроид. Из недостатков можно выделить необходимость наличия у пользователя root-прав.
Чтобы внести изменения с помощью данного программного обеспечения, действуйте согласно алгоритму:
Шаг 1. Перейдите в Google Play, найдите по названию и скачайте на свое мобильное устройство приложение TTL Master. После окончания установки запустите его. Если рут-права на устройстве получены, программа (и методика) подходят вашему мобильному устройству, то программа начнет корректно запускаться сразу после установки.
Шаг 2. На главном экране программы, сразу после запуска, в верхней части появится текущее значение TTL для вашего устройства. Здесь же представлена основная строка для ввода текста и кнопка Применить. В поле ввода введите желаемое значение, прибавив столько единиц, сколько устройств будет подключено к точке доступа, затем тапните по кнопке Применить.
Теперь перезагрузите свое мобильное устройство. После повторного его запуска все ограничения на подключение устройств к точке доступа будут сняты.
Одновременно не рекомендуется менять показатель слишком сильно, так как это тоже может привести к привлечению внимания оператора и повлечь за собой проверку изменений с последующей блокировкой.
Как поменять TTL на Windows 7 и выше?
Стандартное начальное значение для данной системы составляет 1278 единиц. В большинстве случаев этого вполне достаточно для обеспечения стабильного бесперебойного доступа в интернет для нескольких устройств, потому более или менее мощный компьютер удается с успехом применять в качестве точки раздачи интернета. Но если необходимость изменения все же есть, то проводите его следующим образом:
Шаг 1. Процесс проводится с помощью внесения некоторых изменений в системный реестр. Откройте его для редактирования, нажав Пуск, введя команду regedit, а затем щелкните по результату правой кнопкой мыши. В выпавшем контекстном меню нажмите на Запуск от имени администратора.
Шаг 2. После открытия реестра в левой части экрана вы увидите большое количество системных папок, необходимых для обеспечения работы компьютера. Найдите нужную вам папку, пройдя по пути HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip\Parameters. Внесите все необходимые изменения. Особое внимание уделите выделенным показателям – они должны точно соответствовать рисунку.
Сохраните изменения и перезагрузите компьютер.
TTL – что это такое в роутере, нужно ли изменять показатель? Существенного влияния на доступ в интернет данный показатель у роутера не оказывает, изменять его достаточно сложно. Однако при наличии специальных навыков изменения можно внести таким образом, чтобы при прохождении через роутер пакет не терял одну единицу TTL.
NOTE: Важно! Информация, приведенная в данной статье, предназначена только для опытных пользователей.
Начиная с версии KeeneticOS 3.1 настройка TTL доступна только из интерфейса командной строки (CLI) интернет-центра.
Time To Live (TTL) в компьютерных сетях — предельный период времени или число итераций или переходов, за который набор данных (пакет) может существовать до своего исчезновения. Значение TTL может рассматриваться как верхняя граница времени существования IP-датаграммы в сети. Поле TTL устанавливается отправителем датаграммы и уменьшается каждым узлом (например, маршрутизатором) на пути его следования, в соответствии со временем пребывания в данном устройстве или согласно протоколу обработки. Если поле TTL становится равным нулю до того, как датаграмма прибудет в пункт назначения, то такая датаграмма отбрасывается и отправителю отсылается ICMP-пакет с кодом 11 — Превышение TTL (ICMP Time Exceeded). Отбрасывание пакетов с истекшим временем жизни позволяет избежать ситуаций, когда недоставленные датаграммы продолжают «вечно» циркулировать в системе Интернет, перегружая сеть (например, при образовании зацикленных маршрутов из-за некорректной маршрутизации).
В интернет-центрах Keenetic существует возможность управления значением TTL для входящих (от провайдера) и исходящих (к провайдеру) пакетов. По умолчанию, если мы подключимся к интернет-центру для выхода в Интернет, значение TTL будет уменьшаться на 1 при прохождении пакета через маршрутизатор как для входящих пакетов (WAN>LAN), так и для исходящих (LAN>WAN).
Для примера, посмотрим дампы сетевых пакетов в программе анализаторе трафика Wireshark (дополнительную информацию вы найдете в статьях «Использование встроенного модуля захвата сетевых пакетов» и «Захват сетевых пакетов с помощью программы Wireshark») и увидим изменения TTL для входящего пакета (от провайдера).
Так, при подключении напрямую к провайдеру TTL имеет значение 56 (дамп снят с сетевого интерфейса ПК, подключенного напрямую к провайдеру):
При подключении этого ПК через интернет-центр это значение уменьшится и станет равным 55 (дамп снят с сетевого интерфейса ПК, подключенного к интернет-центру):
В некоторых случаях данное уменьшение может быть критичным (например, некоторые провайдеры выставляют TTL=1 на пакеты, идущие уже к абоненту для предотвращения использования маршрутизаторов в своей сети), поэтому в настройках интернет-центра Keenetic (до версии KeeneticOS 3.1) есть опция «Не уменьшать TTL». Эта опция доступна в веб-интерфейсе интернет-центра на странице «Проводной» в разделе «Параметры IP и DNS», нажав «Показать дополнительные настройки IPoE». Если установить галочку в указанной опции, значение TTL не будет уменьшаться для приходящих от провайдера сетевых пакетов. Данная настройка аналогична выполнению команды
interface ISP ip adjust-ttl inc 1
в интерфейсе командной строки (CLI) интернет-центра.
Также микропрограмма KeeneticOS позволяет управлять значением TTL, уменьшая или увеличивая его на определенное значение.
Допустим, если вы знаете значение параметра TTL в пакетах приходящих от провайдера, то с помощью интернет-центра серии Keenetic можно отрегулировать значение TTL для использования в вашей сети.
Чтобы увеличить значение TTL, нужно использовать команду
interface ISP ip adjust-ttl inc x
Чтобы уменьшить значение TTL, нужно использовать команду
interface ISP ip adjust-ttl dec x
Чтобы установить значение TTL, нужно использовать команду
interface ISP ip adjust-ttl set x
где x – величина изменения или устанавливаемого значения TTL (может принимать значения от 1 до 255 включительно).
Для исходящих в сторону провайдера сетевых пакетов (LAN>WAN или Home>ISP) управление значением TTL возможно только через интерфейс командной строки интернет-центра. Команда ip adjust-ttl изменяет параметр TTL первого пакета для всех входящих соединений интерфейса. Поэтому для изменения TTL такого пакета в сторону провайдера, необходимо применить ее к локальному интерфейсу Home. Для него этот пакет будет входящим: interface Home ip adjust-ttl (inc | dec | set) ‹value› Управлять значением TTL можно увеличивая (inc), уменьшая (dec) на указанную величину ‹value› или устанавливая (set) равным указанной величине ‹value›. Например, в результате такой команды: interface Home ip adjust-ttl inc 1 TTL пакетов от хостов домашней сети будет сначала увеличен на 1, а затем при прохождении через маршрутизатор — уменьшен на 1. В итоге TTL останется неизменным. C версии KeeneticOS 2.09 добавлена возможность установки TTL для исходящих пакетов на выбранном интерфейсе: interface {name} ip adjust-ttl send {ttl} Если необходимо, чтобы уходящие в сторону провайдера пакеты имели такой же TTL, как если бы компьютер на ОС Windows был подключен к провайдеру напрямую, а не через маршрутизатор, дайте следующую команду: interface ISP ip adjust-ttl send 128 Отменить любую связанную с изменением TTL настройку на интерфейсе {name} можно командой: interface {name} no ip adjust-ttl
Добавить комментарий