LINUX.ORG.RU
ФорумAdmin

«ускоритель» TCP при forwarding

 , , , ,


0

1

сап лор, есть несколько вопросов по сетям которые я не смог нагулить (плохо искал похоже).

а) есть ли готовые tcp «прокси» которые терминируют tcp с одного конца, кладут даныне в очередь, пересылают даныне через новый tcp connection по адресу, при этом пересылая и icmp т.е. полностью прозрачны? б) можно ли это сделать силами только лишь iptables?

Зачем нужно. Есть моя рабочая станция в г. СтандартЗажопинск и есть сервер скажем в московском дц. И станция и сервер имеют линк 100Mbit, но если я делаю пайкеджманаджер_name update из дому это занимает n минут, а на сервере выполняется почти мгновенно. Оно и логично, в дц там пару хопов до магистрали, можно считать что почти локалка, tcp в таких условиях работает крайне хорошо. Фаст опен вся фигня, cubic чувствует себя как дома. Из моего зажопинска, через кривой шейпер провайдера, через двадцатку хопов до магистрали, через подлагивающую вафлю, конечно скорость так себе. Вот и пришла мысля запустить tcp «прокси» на сервере. В этом случае запрашиваеммый хост крайне быстро и охотно отдает пакеты, а уж опосля, меееедленно, я перешлю их в свой зажопинск. Ускорение состоит в том, что практически все веб серверы + стек tcp/ip не стремятся выжать из канала максимум и крайне консервативны в количестве пакетов в еденицу времени исходя из способности клиента. Ды и уравниловку ни кто не отменял, в итоге «забитые» страдают в двойне. С точки зрения сongestion сontrol благодать, cubic для господ (tier1), westwood для крестьянорабочих. + разные там MTU и т.д., уменьшение RTT т.к. бьем маршрут на 2…

в) что по пропорциональному уменьшению буфера tcp по мере заполнения очереди? Экспоненцальное уменьшение после некоторого лимита?

г) локальный tcp proxy в домашней сети. Зачем ходить за тридевять земель перезапрашивая утеренный/побитый в радиоэфире драгоценный пакет (тем он и драгоценен что иноморский, накладные расходы на доставку высокие), когда можно запомнить его на домашнем тазике и втолковывать рабочей станции пока до той не дойдет.

д) qos и ip path constant heat. Возможности канала известны заранее или могут обновляться динамически. Если мы имеем любой tunel через tcp (или для raw ip или udp это тоже актуально). То можно в нем создать «служебное» соединение ,которое гоняет одинаковые пакеты, трафик по которому будет регулироватся по закону s(t) = const - tunel_data(t) где const верхний лимит канала. Т.е. тунель будет в независимости от тунелированнго трафика в нем всегда поддерживать один и тотже rate. Верхний лимит можно подстраивать в зависимости от патерь пакетов. Подстройка одного connection видится мне более практичной чем крутить множество tcp. Абузинг факта point2point. +сетевое оборудование нынче достаточно интелектуальное и тоже трафик считает, зная от кого что ждать, тут и для клиента хорошо и для сетей предсказуемо. +ещё кто то знает тот знает - кореляционный анализ.

е) kernel или юзерспейс реализация fake tcp (юзерспейс наверное). Нынче с нашем буйствующем RosPlugНадзором актуально. tcp in tcp всегда плохо. Но все идет к тому что только tcp будет ходить, причем только кашерные протоколы. на dtls надежды нет. Вопрос знатоком - есть ли решение которое маскируется под tcp, но при этом позволяет out of order доставку? Вернее это и есть реализация tcp только с возможностью читать сырые пакеты.

ё) есть ли наработки по tls preopen? Сделать mitm на машине локльно и заранее открывать 10-20 tls соедененй для самых частых sni за все время или за окно. Ну через n времени если не нужны отсылать http options, закрывать, открывать опять. Перспективным видится soks5 proxy для этого.

ж) в природе не существует ни какого хитрого http header compression над tls трафиком? ну мало ли можно заранее заготовить кусок. как сделать это через mitm понятно, но тут mitm должен быть на граничном узле что не очень секьюрно.

оригинальная орфаграция и пунктуация сохранена, спасибо!

Ответ на: комментарий от etwrq

Да, это все можно, но это немного не туда. Все кто ставил remote x11/vnc видели, что загрузка страниц просто летает даже ели железо более слабое и канал не такой толстй (нынче дома и гигибитом ни кого не удивишь). Но сдесь накладные расходы на передачу картинки большие. Правильнее все же канал оптимизировать.

novoxudonoser
() автор топика

Я для конфигурации, подобной вашей, использую v2fly. Это очень гибкий прокси-сервер с поддержкой кучи протоколов, который также может выступать как не-прокси-сервер, просто перехватывая TCP-соединения и создавая подключения к удалённому серверу.

Он не умеет работать с ICMP, только с TCP/UDP. Для ICMP прокси не нужен.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

NordVPN, к слову, в прошлом году получил ПАТЕНТ на использование TCP-прокси для ускорения VPN-соединений. Непонятно, как они смоги запатентовать prior art, который лет 30 использовался до них.

https://patents.google.com/patent/US11632267B2/en

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

ОПАНА, серьезные люди подъехали! Ото я тут немного прискучнул от местных питекантропах (ну я про тех кто расписался в своей проф непригодности реактами/коментариями).

Можно чуть подробнее про похожую конфигурацию - ссыли/конфиги? Интересует также любой гайд/доки где им можно проксировать tcp с буферизацией. Мне со стороны докопаться быстро будет сложнее, а если инфа у вас под рукой - буду благодарен.

Посмотрел по диагонали - чует мое сердце что v2fly верный кандидат для перехода, openconnect растраивает меня.

novoxudonoser
() автор топика
Ответ на: комментарий от ValdikSS

Не стал в топик вопрос вносить - посчитал что бесмысленно у местной средне статистической аудитории спрашивать. А тут прям по адресу. Был ли успешный опыт общения с спортлото? Я звонил им, мне сказали прислать docx файлик с запросом на исключение IP из списка блокировок vpn. Дали шаблон для физического лица. Думал в причине исключения писать - доступ в сеть работодателя для исполнения служебных обязаностей. Но дальше этого в квесте не продвинулся. Работает пока - тем и живы.

novoxudonoser
() автор топика
Ответ на: комментарий от ValdikSS

Интересно коненчо девки пляшут, ну не вижу ни чего удивительного, двуногие прямоходящие +/- везде одинаковые, и системы работают сходно, эх братский народ на самом деле… Тут скорее вопрос встает зачем, понятно что немало ресурсов на это потребовалось, очень интересно…

novoxudonoser
() автор топика
Ответ на: комментарий от novoxudonoser

Минимальный конфиг выглядит как-то так:

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [{
    "port": 5555,
    "listen": "::",
    "tag": "dokodemo-in",
    "protocol": "dokodemo-door",
    "settings": {
      "network": "tcp",
      "followRedirect": true
    }
  }],
  // List of outbound proxy configurations.
  "outbounds": [{
    "protocol": "freedom"
  }],
  "policy": {
    "levels": {
      "0": {
        "handshake": 15,
        "connIdle": 300,
        "uplinkOnly": 0,
        "downlinkOnly": 0,
        "bufferSize": 16
      }
    },
    "system": {
      "statsInboundUplink": false,
      "statsInboundDownlink": false,
      "statsOutboundUplink": false,
      "statsOutboundDownlink": false
    }
  }
}

На порту 5555 будет TCP-прокси, в который нужно перенаправлять трафик iptables’ом.

Документацию лучше читать на китайском: https://www.v2fly.org/config/overview.html

У v2fly есть свой буфер данных (bufferSize), но я не могу придумать, зачем он может быть вообще нужен, если честно. В вашем случае достаточно обычного поведения ядра.

Потюньте net.ipv4.tcp_wmem/net.ipv4.tcp_rmem, в зависимости от BDP (устанавливать нужно значение max в 2 раза выше, чем выдаёт калькулятор Window Size, при условии стандартного net.ipv4.tcp_adv_win_scale=1).

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 1)
Ответ на: комментарий от ValdikSS

Спасибо. сохоронил.jpg

но я не могу придумать, зачем он может быть вообще нужен, если честно. В вашем случае достаточно обычного поведения ядра.

Да, пришёл к таким же выводам. Набрасал soks5 проксю (как самое простое решение) на пихтоне чисто proofofconcept добавил буфер 10и мегабайтный, но в ходе эксперемнтов понял, что наличие буфера не сильно добавляет в скорости (5.2 мб/c без буфера против 5.4 с буфером для моего сетапа) т.к. в ядре для tcp уже есть дефолтная 4кб очередь, которой хватает. Я надеялся вызвать ситуацию где буфера ядра будет не достаточно, но это нужен очень агресивный burst в канале который переодическтй при этом.

Да, гипотетически может возникнуть такая ситуация где буфера ядра будет не достаточно, но на практике нет. Тут да, превосходство linux tcp/ip стека на user space на лицо.

в зависимости от BDP (устанавливать нужно значение max в 2 раза выше, чем выдаёт калькулятор

очень важное замечание, спасибо

novoxudonoser
() автор топика
Последнее исправление: novoxudonoser (всего исправлений: 1)
Ответ на: комментарий от ValdikSS

в v2fly есть поддержка описсаного в Д «path constant heat» ?

Я тут ещё немного подумал над этим. Нам известно что в канале, ну по крайне мере на последеней миле (хост -> точка обмена трафика провайдера), есть полисер или шейпер или их комбинация. Выяснить их параметры можно через пробы - нафлудить пакетов и смотреть по какому закону они отбрасываются. Это даст статическую информацию. Затем можно к трафику в канале добавлять служебный probe трафик цель которого эти лимиты щупать. При этом делать это не в случайном порядке. Окно в котором пакеты будут гарантированно проходить использовать под полезную нагрузку. Когда модель предсказывает сброс пакетов из текущего времени/трайика (заполнились бакеты) пускать в канал probe пакеты которые будут отброшены. По % отброшенных probe обновлять модель. Сходимость быстрая, достигается максимально возможная утилизация канала.

Зачем надо - я считаю что в час х останутся только всякие мутные способы вроде стенографии через icmp. Канала для нормлаьной работы будет всегда не хватать.

novoxudonoser
() автор топика
Ответ на: комментарий от novoxudonoser

т.к. в ядре для tcp уже есть дефолтная 4кб очередь

В ядре и буфер сокета (неотправленных/непрочитанных данных), и буфер TCP-окна. Они для высоких скоростей и больших задержек обычно размером в несколько мегабайт оба, иногда десятки мегабайт (окно должно быть 18 мегабайт, чтобы получить 500 мбит/с при 300 мс latency, т.е. последний параметр net.ipv4.tcp_rmem нужно устанавливать в 36 мегабайт).

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

это мой выдуманный термин т.к. я не знаю как это по уму называется

Идея в том чтобы держать трафик тунеля, в неависимости от передаваемого внутри проксируемого трафика, всегда на пределе пропускной способности сети (или до некоторого сконфигурированного лимита). Делать это некоторым пустым служебным трафиком внутри, который max если нет других данных, и 0 если весь тунель занят трафиком. Это также полезно от кореляционного анализа.

Представим что есть udp тунель. Есть tcp соединение в нем. В зависимости от настроек tcp. Скорость tcp соединения сначала будет расти (что кстати не так уж и быстро 1-2с до ~10Мб/c для westwood у меня) до отбасывания самих ip пакетов тунеля сетью, затем tcp сконфигурирует размер окна и частоту отправки до максимально возможного значения.

Зачем нам ждать пару секунд на экспоненцальное увеличение окна и отправлять в канал лишние пакеты которые будут всё равно будут отброшены, только чтобы узнать какой потолок. Причем это будет сделано для каждого соединения. Мы и так знаем пропускную способность сети. Можно уже для каждого соеденение пересылать максимальное возможное количество данных сразу.

Я не знаю как называется эта оптимизация, в описанных выше wan optimizer оно точно есть.

В прошлом коменте я подумал ещё и о том что мы можем знать не только максимальную пропускную способность канала, но можем ещё и узанть его точные параметры шейпинга. Т.е. предельные значения мгновенной скорости. Что позволит ещё лучше утилизировать канал.

novoxudonoser
() автор топика
Ответ на: комментарий от novoxudonoser

Называется net.ipv4.tcp_slow_start_after_idle=0, а начальный размер окна задаётся через ip route … initrwnd (и initcwnd).

Зачем нам ждать пару секунд на экспоненцальное увеличение окна и отправлять в канал лишние пакеты которые будут всё равно будут отброшены, только чтобы узнать какой потолок.

Для этого есть алгоритмы tc qdisc, используйте cake, например.

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 2)
Ответ на: комментарий от ValdikSS

Называется net.ipv4.tcp_slow_start_after_idle=0, а начальный размер окна задаётся через ip route … initrwnd (и initcwnd).

Тюнить стек конечно надо, это 100% хит по сути. Но немного не то, вернее это я плохо объясняюсь. slow_start_after_idle поможет только с простаивающими соединениями, вернее немного снимет симптом. А initrwnd/initcwnd это верный ход, но это статичная конфигурация. И это индивидуально для каждого соеднинения. При множестве конкурентных соединениней увеличение окон даст обратный эффект. Есть разумный предел до которых можно увеличивать эти значения и он не очень велик. Нужен единый буфер.

У меня немного другая идея/потребность. Я описывал её выше, но за всеми подветками это затерялось.

Я хочу на обоих узлах поднять по локальному tcp «приемнику» в результате вся работа tcp будет по факту отключена. (это можно сделать через tun либо подменой сисколов, тогда и приемник не нужен) Т.к. для работы tcp в сети на томже хосте это просто некоторый оверхед который пренебрежимо мал. После этого сам поток данных можно уже перкладыать в другой tcp например, в sctp, в quick и т.д. По другую сторону тунеля доставать данные из этого соединения и перекладывать их в зеркальное локальное tcp соединение. Вот этого я ни где не смог найти. Как это вообще называется. Я уверен что реализации уже есть. Как писали выше есть реализация на уровне железок (wan optimizer).

Зачем мультиплексировать все tcpсоединения в одно соединение в тунеле. Тогда управлять его окном становится много проще чем множеством соединений. И самоу главное т.к. соединение будет всегда активно и развивать максимальную скорость нет проблем с алгоритмом увеличения окна в его мультеплексированных под соединениях. Т.к. в любой момент известно точно какая максимальная пропускная способность канала (суммарная). Нет необходимости это в ручную щупать для каждого соединения.

Пример Предположим у нас канал 100Mbit. Тунель способен на 90Mbit. Открывается tcp соединение A. Для прсототы mtu 1024. Посде хендшейка в один первый тик (1мс) мы отправляем 90 пакетов, в каждый следующий тоже значение (в реальности чуть меньшее). Канал не перегружен и не один пакет не отбрасывается т.к. мы точно знаем сколько он может пропустить. Открывается соединение Б. Мы знаем что пропускная способность канала 90Mbit, следовательно в каждый тик будет отправлено 45 пакетов для А и 45 для Б. Вновь ни один из пакетов не отбрасывется. Каждое из tcp соединений устанавливает максимальную скорость мгновенно. В отличае от стандартного случая когда tcp соединения будут работать без этой оптимизации.

Для этого есть алгоритмы tc qdisc, используйте cake, например.

Так пасибки, почитал доки вижу что эта та штука с помошью который часть желаемого можно наколхозить.

novoxudonoser
() автор топика
Ответ на: комментарий от novoxudonoser

v2fly может и мультиплексировать соединения, если я правильно вас понял. Настройте его в режиме VMESS-прокси, например, и включите mux.

При множестве конкурентных соединениней увеличение окон даст обратный эффект. Есть разумный предел до которых можно увеличивать эти значения и он не очень велик. Нужен единый буфер.

Так вы создадите новую проблему: большой буфер единственного соединения и Head-of-line blocking. Жертвование latency ради throughput.

TCP-соединения конкурируют на одном канале именно для того, чтобы не создавать высокой задержки. А если у вас одно «жирное» соединение с буфером в размер window size, то будьте добры подождать результаты условного DNS-резолва roundtrip’ов так 6, при скачивании данных на скорости линка.

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 4)
Ответ на: комментарий от ValdikSS

и включите mux.

Правильной дорогой идут китайские товарищи! Действительно v2fly хорошая штука. Надо срочно пробовать. Но как я понял рулить tcp соединениеми внутри v2fly не умеет. Просто клеить tcp не достаточно. Так со стороны не легко сказать можно ли его довести до желаемой мной кондиции.

Так вы создадите новую проблему: большой буфер единственного соединения и Head-of-line blocking. Жертвование latency ради throughput.

Тут я немного не понял. Ситуация при сбросе пакетов самого тунеля для конектов внутри?

то будьте добры подождать результаты условного DNS-резолва roundtrip’ов так 6, при скачивании данных на скорости линка.

Если без qos то при N соединений каждому соединению отводится 1/N полосы. Ситуации выше просто не возникнет.

TCP-соединения конкурируют на одном канале именно для того, чтобы не создавать высокой задержки.

Я бы сказал, что это не от хорошей жизни. Другого способа не реализовали. Т.к. в рамках оси вышележащий слой не может и не должен знать об параметрах низлежащего. + Весь путь как это эволюционно сложилось. Но цена этого - неприменный сброс пакетов, что не позволяет максимально утилизировать канал.

Весь мой поинт (ух ты новомодное словечко!) в том что tcp в канале (и application level udp) работает как бог на душу положет. Все друг с другом конкурируют, пакеты отбрасываются. Можно же сверху, централизованно, сделать красиво.

novoxudonoser
() автор топика
7 августа 2024 г.
Ответ на: комментарий от anonymous

Человек с опытом никогда в написании этих терминов не ошибётся, тем более это точно не случайные опечатки.

Я хотел написать «ябеда», а получилось «долбоёб» (с)

frunobulax ★★★
()