Задачи (на проработку): различия между версиями

Материал из EWiki
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показана 51 промежуточная версия 3 участников)
Строка 1: Строка 1:
SD-WAN: Редирект пакетов, VPN
'''Производительность:'''


ограничение на количество правил (не хватает стека?)
- Алгоритм классификации пакетов (перебор правил)


Баги:
- Вердикт на обратный трафик на основе conntrack (сейчас требуется обратное правило) 


Логирование
- Часть правил хранить в userspace и подгружать только по необходимости в BPF. Отдельно заполнять таблицу с описанимем пакетов, не попадающих под правила, чтобы постоянно не лезть в userspace 


Удалять clsact если он существует на старте
- Ограничение по количеству правил (не хватает стека?)


Загрузка HA в nw_map может завершиться ошибкой (нужна проверка и возможность отключить загрузку nw_map)
- Переход на ringbuffer (kernel >= 5.8) или BPF_MAP_TYPE_LRU_HASH (https://github.com/cloudflare/ebpf_exporter) или BPF_MAP_TYPE_PERCPU_HASH (https://justin.azoff.dev/blog/bpf_map_get_next_key-pitfalls/)  


Рефакторинг:
- Подписка вместо опроса (docker, devices, info)


Один репозиторий на ha, blocker и winHA
- ip адреса передавать как числа (можно ли тип number в JS?)


Переход на ringbuffer
- Формат передачи статистики (не HTTP?) (перехода на Push режим в части данных) 


bpf_skb_pull_data (загрузка всего пакета) Проверить, что skb->len равно размеру всего пакета
- Передавать статистику не как JSON или сокращаеть его максимально. Сейчас очень большие объемы лишних данных (ключей) передаем 


be для bigendian
- Нужно автоматическое нагрузочное тестирование 


разделять broadcast, multicast, unicast
- Удалить отладочную информацию (stripped) 


использовать go context для завершения программы
https://www.codingexplorations.com/blog/reducing-binary-size-in-go-strip-unnecessary-data-with-ldflags-w-s 


Добавить версию для HA
https://words.filippo.io/shrink-your-go-binaries-with-this-one-weird-trick/


Логирование сервисов под linux и windows (отдельный лог файл, текст сообщений хранить в отдельном файле, логировать коды https://learn.microsoft.com/en-us/windows/win32/eventlog/message-files, так же использовать категории, изучить best practice)
- Хранить правила не в массиве, а в hashmap с флагом <code>BPF_F_NO_PREALLOC</code>


Обрабатывать потерю связи HA с внешними сервисами (сейчас возможно зависание всего цикла отправки из-за недоступности http)
- Оптимизация по использумой памяти. Сколько памяти потребляется? Какие размеры ebpf maps? Что делать при превышении размеров? Кэш использовать? Ограничивать ли ulimit memlock?


- Наборы правил хранить в разных узлах zookeeper (может превысить ограничение на размер узла; при изменении одного набора перезагружаем их все)


- При помощи опции отключать сбор сетевой статистики и статистики по правиалам (сейчас статистика на уровне ядра собирается всегда, но может никуда не отправляться)


Сбор информации по докеру: (не создавать соединение при каждом сборе информации, а держать одно соединение; подписываться на появление новых контейнеров)
===== conntrack: =====


Также попдисывать на остальную osInfo и появление новых сетевых интерфейсов
* Использовать cgroup hook для исходящего трафика??? (возможно уменьшит количество блокированных соединений) https://pchaigno.github.io/ebpf/2020/09/29/bpf-isnt-about-speed.html
* Поддержка NAT
* Поддержка Related/Expected соединений
* Поддержка протоколов кроме TCP/UDP
* Включение CT из основной конфигурации, по возможности без перезагрузки bpf_ksym_exists (https://github.com/cilium/ebpf/pull/1364)
* Авто тесты на conntrack<br />


Поддержка ipv6
'''Распределенная система / надежность:'''


ip адресса передавать как числа (можно ли тип number в JS?)
- Обрабатывать потерю связи HA с внешними сервисами (сейчас возможно зависание всего цикла отправки из-за недоступности http)  


контроль соответствия userspace и kernelspace. Не давать возможность подключатся к нашему ebpf из чужой программы
- Агент в оффлайне


Алексей:
- Формирование отказоустойчивый модели зукипепов - возможно распределенной


1. Защищенный Канал до агента
- Запуск на старом ядре с контролем его версии. При стром ядре запускаем анент, но кернел спейс запуститься не моожет. Пусть юзер часть запустится и отрапартнует пакетом на сервер о старом ядре


2. Валидация агента плюс его этп
- деградация функций   


3. Формирование отказоустойчивый модели зукипепов - возможно распределенной
- транзакционность применения конфигурации (откатывать изменения, в случае сбоя)   


4. Агент в оффлайне
- после пересоздания контейнера с zookeeper, работающие HA не могут соединиться с ним. Помогает только перезагрузка HA   


5. Сислог + стандарты легирования
'''Качество кода и сборки:'''


6. Принципы аварийного отключения и корректная отписка от эбпф
- Один репозиторий на ha, blocker и winHA


7. Работа при наличии эбпф и падении юзерспейса
- Использовать макросы для разбора сетевых заголовков (https://github.com/cloudflare/ebpf_exporter/blob/master/examples/xdp.bpf.c)


- Авто тесты (модульные и функциональные)


1) компиляция по частям (часть сборок будут обадать более опасными функциями, которые надо в определенных сборках исключать физиески)
- be типы для bigendian


2) контроль версионности и сборки как Юзер, так и кеонел спейс модуля
- предотвращать одновременную работу ha на одной ОС (PID файл?)


3) вопрос протоколов и перехода на Push режим в части данных
- сборка без доступа в интернет (vendoring)


4) Запуск на старом ядре с контролем его версии. При стром ядре запускаем анент, но кернел спейс запуститься не моожет. Пусть юзер часть запустится и отрапартнует пакетом на сервер о старом ядре ...


5) контроль агентом утилизации ресурсов и потенциальная деградация функций при его перегрузки
 
 
'''Администрирование (наблюдаемость, управляемость):'''
 
- Логирование сервисов под linux и windows (отдельный лог файл, текст сообщений хранить в отдельном файле, логировать коды https://learn.microsoft.com/en-us/windows/win32/eventlog/message-files, так же использовать категории, изучить best practice) , syslog
 
- доставка конфигурации до host agenta
 
- CLI: обрабатывать и корректно/аккуратно печатать ошибки от API
 
'''Безопасность:'''
 
- Размер IP, TCP, UDP(?) заголовков не фиксирован. Возможны опциональные поля. Это надо учитывать. Особенно для firewall и bloccker.
 
- Защищенный Канал до агента
 
- Валидация агента плюс его этп
 
- CAP_BPF
 
- аутентификация zookeeper и mqtt,
 
- хранение паролей
 
- авторизация (каждый агент заходит подсвом пользователем и имеет доступ только к своим данным, правила только для чтения)
 
'''Поддержка сетевых технологий:'''
 
- Добавлять неизвестные(неразобранные) пакеты в статистику (есть потеря части информации)
 
- Поддержка VLAN
 
- Поддержка MPLS
 
- Поддержка IPv6
 
- Поддержка фрагментации на уровне L3
 
- Использование совместно с QoS и агригированными интерфейсами
 
- Совместная работа с другими eBPF программами и очередями на уровне tc?
 
 
 
'''Баги:'''
 
- возможно переполнение счетчика с количеством байт, надо использовать структуру с двумя счетчиками (https://elixir.bootlin.com/linux/v5.17.6/source/samples/bpf/sockex2_kern.c#L213)
 
- многопоточность не обрабатывается (для правил, опции и статистики), может приводить к редким невоспроизоводимым проблемам
 
- bpf_skb_pull_data (загрузка всего пакета) Проверить, что skb->len равно размеру всего пакета
 
- перехватывать панику во всех горутинах, иначе программа падает и не отписывается
 
- Корректное завершение при сбоях (освобождение ресурсов
 
- Обрабатывать превышение размеров eBPF HASH_MAP 
 
- Валидация входных данных 
 
- Обработка ошибок, логирование   
 
'''Windows:''' 
 
* Использовать WFP транзакции при обновлении правил
* Перехватывать панику во всех горутинах, чтобы записывать в windows events причину паники
* Не отображаются наши правила через стандартные инструменты просмотра
* Какой вес  для sublayer ставить? как взаимодействовать с другими правилами?
 
== '''Сырое (не разобранное):''' ==
----
 
 
SD-WAN:
 
- Редирект пакетов, VPN
 
- Корректное переключение на другой канал (разрыв соединений по старому каналу?)

Текущая версия от 07:36, 14 апреля 2026

Производительность:

- Алгоритм классификации пакетов (перебор правил)

- Вердикт на обратный трафик на основе conntrack (сейчас требуется обратное правило)

- Часть правил хранить в userspace и подгружать только по необходимости в BPF. Отдельно заполнять таблицу с описанимем пакетов, не попадающих под правила, чтобы постоянно не лезть в userspace

- Ограничение по количеству правил (не хватает стека?)

- Переход на ringbuffer (kernel >= 5.8) или BPF_MAP_TYPE_LRU_HASH (https://github.com/cloudflare/ebpf_exporter) или BPF_MAP_TYPE_PERCPU_HASH (https://justin.azoff.dev/blog/bpf_map_get_next_key-pitfalls/)

- Подписка вместо опроса (docker, devices, info)

- ip адреса передавать как числа (можно ли тип number в JS?)

- Формат передачи статистики (не HTTP?) (перехода на Push режим в части данных)

- Передавать статистику не как JSON или сокращаеть его максимально. Сейчас очень большие объемы лишних данных (ключей) передаем

- Нужно автоматическое нагрузочное тестирование

- Удалить отладочную информацию (stripped)

https://www.codingexplorations.com/blog/reducing-binary-size-in-go-strip-unnecessary-data-with-ldflags-w-s

https://words.filippo.io/shrink-your-go-binaries-with-this-one-weird-trick/

- Хранить правила не в массиве, а в hashmap с флагом BPF_F_NO_PREALLOC

- Оптимизация по использумой памяти. Сколько памяти потребляется? Какие размеры ebpf maps? Что делать при превышении размеров? Кэш использовать? Ограничивать ли ulimit memlock?

- Наборы правил хранить в разных узлах zookeeper (может превысить ограничение на размер узла; при изменении одного набора перезагружаем их все)

- При помощи опции отключать сбор сетевой статистики и статистики по правиалам (сейчас статистика на уровне ядра собирается всегда, но может никуда не отправляться)

  • Использовать cgroup hook для исходящего трафика??? (возможно уменьшит количество блокированных соединений) https://pchaigno.github.io/ebpf/2020/09/29/bpf-isnt-about-speed.html
  • Поддержка NAT
  • Поддержка Related/Expected соединений
  • Поддержка протоколов кроме TCP/UDP
  • Включение CT из основной конфигурации, по возможности без перезагрузки bpf_ksym_exists (https://github.com/cilium/ebpf/pull/1364)
  • Авто тесты на conntrack

Распределенная система / надежность:

- Обрабатывать потерю связи HA с внешними сервисами (сейчас возможно зависание всего цикла отправки из-за недоступности http)

- Агент в оффлайне

- Формирование отказоустойчивый модели зукипепов - возможно распределенной

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

- деградация функций

- транзакционность применения конфигурации (откатывать изменения, в случае сбоя)

- после пересоздания контейнера с zookeeper, работающие HA не могут соединиться с ним. Помогает только перезагрузка HA

Качество кода и сборки:

- Один репозиторий на ha, blocker и winHA

- Использовать макросы для разбора сетевых заголовков (https://github.com/cloudflare/ebpf_exporter/blob/master/examples/xdp.bpf.c)

- Авто тесты (модульные и функциональные)

- be типы для bigendian

- предотвращать одновременную работу ha на одной ОС (PID файл?)

- сборка без доступа в интернет (vendoring)



Администрирование (наблюдаемость, управляемость):

- Логирование сервисов под linux и windows (отдельный лог файл, текст сообщений хранить в отдельном файле, логировать коды https://learn.microsoft.com/en-us/windows/win32/eventlog/message-files, так же использовать категории, изучить best practice) , syslog

- доставка конфигурации до host agenta

- CLI: обрабатывать и корректно/аккуратно печатать ошибки от API

Безопасность:

- Размер IP, TCP, UDP(?) заголовков не фиксирован. Возможны опциональные поля. Это надо учитывать. Особенно для firewall и bloccker.

- Защищенный Канал до агента

- Валидация агента плюс его этп

- CAP_BPF

- аутентификация zookeeper и mqtt,

- хранение паролей

- авторизация (каждый агент заходит подсвом пользователем и имеет доступ только к своим данным, правила только для чтения)

Поддержка сетевых технологий:

- Добавлять неизвестные(неразобранные) пакеты в статистику (есть потеря части информации)

- Поддержка VLAN

- Поддержка MPLS

- Поддержка IPv6

- Поддержка фрагментации на уровне L3

- Использование совместно с QoS и агригированными интерфейсами

- Совместная работа с другими eBPF программами и очередями на уровне tc?


Баги:

- возможно переполнение счетчика с количеством байт, надо использовать структуру с двумя счетчиками (https://elixir.bootlin.com/linux/v5.17.6/source/samples/bpf/sockex2_kern.c#L213)

- многопоточность не обрабатывается (для правил, опции и статистики), может приводить к редким невоспроизоводимым проблемам

- bpf_skb_pull_data (загрузка всего пакета) Проверить, что skb->len равно размеру всего пакета

- перехватывать панику во всех горутинах, иначе программа падает и не отписывается

- Корректное завершение при сбоях (освобождение ресурсов)

- Обрабатывать превышение размеров eBPF HASH_MAP

- Валидация входных данных

- Обработка ошибок, логирование

Windows:

  • Использовать WFP транзакции при обновлении правил
  • Перехватывать панику во всех горутинах, чтобы записывать в windows events причину паники
  • Не отображаются наши правила через стандартные инструменты просмотра
  • Какой вес для sublayer ставить? как взаимодействовать с другими правилами?

Сырое (не разобранное):

[править | править код]


SD-WAN:

- Редирект пакетов, VPN

- Корректное переключение на другой канал (разрыв соединений по старому каналу?)