The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Агрегация (объединение мелких пакетов) при туннелировании"
Версия для распечатки Пред. тема | След. тема
Форум Настройка Squid, Tor и прокси серверов
Исходное сообщение [ Отслеживать ]

. "Агрегация (объединение мелких пакетов) при туннелировании" +1 +/
Сообщение от zyxmanemail (?), 04-Апр-24, 02:00 
> Читаю handbook и мануал по ipwf и не нахожу ничего похожего на
> корзину, только delay применяемый для каждого отдельного пакета.

ipfw pipe
Там в настройках конкретной трубы можно указать:
bw bandwidth
delay ms-delay
queue {slots | sizeKbytes}

я просто назвал корзиной буфер (тут он очередь).

> Можешь ткнуть конкретно или привести некоторые правила от которых можно оттолкнуться?
> А то чувствую себя хлебушком в freebsd, после 15 лет на debian.

Тут есть небольшая проблема, у меня сгорели все компы где еще был АТА а оно на старом диске. Но по памяти я нашел в интернетах пример (и чуток подправил для лучшей наглядности):

sudo ipfw pipe 1 config bw 15KByte/s
# creates a pipe that only allows up to 15KB/s to go through.
# Then:
sudo ipfw add 10 pipe 1 src-port 80
# will attach that pipe to the outgoing traffic on port 80, effectively limiting the outgoing traffic of the web server.
sudo ipfw delete 10
# will remove the pipe from the port.

https://gist.github.com/olegokunevych/8146412

> Я правильно понимаю, что чтоб с обратной стороны не получать отдельные пакеты
> ответов, то надо с обоих сторон [freebsd>openvp] <канал> [openvpn<freebsd]

Да и нет.

Диверт просто очень удобная фича bsd (freebsd, openbsd), оно просто создает сокет по правилу вида, диверт всего что идет в какой-то интерфейс (кроме tcp сокет такой-то, см далее), к нему есть стандартная либа, просто говоришь "подключиться к диверт номер такой-то" и функция будет получать на вход пакеты, которые та самая либа прям на блюдечке с голубой каемочкой, делаешь с ними что хочешь, потом по умолчанию в тот же диверт обратно отправляешь (если не отправишь просто получится drop и всё; если никто не будет слушать диверт, он просто будет всё дропать; и если надо, ты можешь создать свои пакеты и туда инжектировать).

Дальше, запускается две пары прог.
На удаленной bsd которая из диверта пакеты например в tcp канал копирует с простейшей инкапсуляцией (ну просто чтобы в потоке отдельные пакеты видеть, там какой-то эскейп символ сделать и его конечно маскировать если будет в пакетах встречаться и обратно демаскировать при инжектировании обратно в стек), на местной bsd прога из канала достает пакеты, обратно  декапсулирует и в локальный диверт бросает.
Ну и вторая пара всё то же в обратном направлении делает.

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

Вот, tcp делается довольно просто, дальше можно по вкусу добавить например шифрование, я обычно тупо в ssh делаю проброс tcp сокета, оно довольно быстрое, у меня например самба несколько лет через такой канал жила.

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

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

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Агрегация (объединение мелких пакетов) при туннелировании, Олег Бартунов, 28-Мрт-24, 19:13  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру