42
Сергей Присяжный [email protected] OpenBSD. Сетевая подсистема в деталях

Root Conf2009 Fin

Embed Size (px)

Citation preview

Page 1: Root Conf2009 Fin

Сергей Присяжный [email protected]

OpenBSD.Сетевая подсистема в деталях

Page 2: Root Conf2009 Fin

Вместо содержанияВместо содержания

• Заглянем немного в историю

• Оценим нынешнее состояние сетевого стека

• Перейдём от теории к практике

• Рассмотрим OpenBSD made stuff (pf, bgpd, ospfd, carp, etc)

Page 3: Root Conf2009 Fin

ПочемуПочему OpenBSD? (goals) OpenBSD? (goals)

SMP ALL? HW SECURE

Page 4: Root Conf2009 Fin

Ты помнишь, как всё начиналось ?Ты помнишь, как всё начиналось ? Создание MULTICS (ARPA)

• первый сетевой стек (MIT, 1970)• стек MULTICS – основа большинства иных стеков

Первый TCP/IP стек (MULTICS, 1980) Первая UNIX реализация (Berkeley, 1983) Основа стека OpenBSD – стек 4.4BSD

• TCP/IP Illustrated, vol. 2 всё ещё руководство № 1

Page 5: Root Conf2009 Fin
Page 6: Root Conf2009 Fin

Краткий обзорКраткий обзор Socket API

• взаимодействие с userland mbuf “API”

• управление памятью Сетевой стек

• реализации протоколов

Маршрутизация• независимая реализация на уровне ядра

Page 7: Root Conf2009 Fin

Socket APISocket API Используется userland-ом для осуществления

сетевого взаимодействия• IPC де факто стандарт• socket(), bind(), connect(), accept()• recv(), send(), …• setsockopt(), getsockopt()

Тема отдельного разговора (выходит далеко за рамки данного доклада)• косвенное упоминание для полноты «картины»

Page 8: Root Conf2009 Fin

mbufs

Page 9: Root Conf2009 Fin

mbufsmbufs Аллокация памяти для пакетов (256 байт каждый)

• иногда используются для иных данных Могут образовывать цепочки и расширяться за счёт

внешних буферов (кластер - 2K) Формируются посредством системного pool(9) Неформальный API == набор функций

• 1-я причина сетевых багов – неправильная работа с mbuf!

Page 10: Root Conf2009 Fin
Page 11: Root Conf2009 Fin

mbufmbuf tagstags Ядро может имплементировать метаданные в пакет

• чаще всего для предотвращения петлей (IPsec, gif(4), gre(4))

Структура• TLV – type, length, value

• динамический размер, выделяемый malloc(9)

• элементы формируют линейный список

Page 12: Root Conf2009 Fin

mbufmbuf tagstags

Page 13: Root Conf2009 Fin

mbuf tags – mbuf tags – хак хак pf(4)pf(4) pf(4) – активный пользователь mbuf tags Каждый пакет получал tag до того, пока … Метаданные pf не были имплементированы

непосредственно в заголовок пакета• заголовок немного увеличился• отсутствие «холостого хода» malloc(9)• оставшегося места достаточно для малых пакетов

Пример – x2 прирост сквозь SOEKRIS коробку

Page 14: Root Conf2009 Fin

Сетевой стек

Page 15: Root Conf2009 Fin

Сетевой стек (обзор)Сетевой стек (обзор) 4-х уровневая система

• интерфейс: драйвера устройств (OSI 1+2)• сеть: IP, IPv6, ICMP (OSI 3)• транспорт: TCP, UDP (OSI 4)• приложение: userland приложения (OSI 5+7)

В основном – код выявления пакетов и определения их «дальнейшей судьбы»• устойчив к наличию багов со стороны-участника процесса

Page 16: Root Conf2009 Fin
Page 17: Root Conf2009 Fin

Уровень интерфейса (Уровень интерфейса (inputinput))

Page 18: Root Conf2009 Fin

Обработчик RX прерывания драйвера «достаёт» пакет из DMA кольца

Данные попадают на канальный уровень• пример - ether_input()• определение сетевого протокола

Пакет передаётся во входящую протокольную очередь с последующим планированием программного прерывания• пример - schednetisr(NETISR_IP); inq = &ipintrq;• netisr – splnet() vs. splsoftnet() (зона демаркации прерываний)• оставшиеся части стека выполняются на более низком уровне

Уровень интерфейса (Уровень интерфейса (inputinput))

Page 19: Root Conf2009 Fin

Сетевой уровень (Сетевой уровень (inputinput))

Page 20: Root Conf2009 Fin

Netisr вызывает сетевой обработчик• пример – ipintr() == программное прерывание• при условии наличия данных

Входящие pf(4) фильтрации Назначение пакета не локально?

• перенаправить (if enabled), иначе drop• восстановление пакета (TTL, checksum)• передать на обработку ip_output()

Переход на следующий уровень• посредством protosw / inetsw [] структуры• каждый протокол уровня содержит структуру protosw

Сетевой уровень (Сетевой уровень (inputinput))

Page 21: Root Conf2009 Fin

Транспортный уровень (Транспортный уровень (inputinput))

Page 22: Root Conf2009 Fin

Определение блока контроля протокола (PCB)• каждое открытое соединение имеет PCB• вмещает всю необходимую информацию для установления

соединения Надёжным протоколам – сложный код

(TCP – целая философия)• управление потоком• повторная передача• логика повторной сборки• подтверждения• SYN кеш

Передача в очередь буфера сокета и активизация userland

Транспортный уровень (Транспортный уровень (inputinput))

Page 23: Root Conf2009 Fin
Page 24: Root Conf2009 Fin

Транспортный уровень (Транспортный уровень (outputoutput))

Page 25: Root Conf2009 Fin

Userland: write(), send(), … Уровень сокета использует структуру protows для передачи

данных• каждая операция сокета в контексте – вызов функции pr_usrreq(), где

pr – конкретный протокол (например, tcp_usrreq()) pr_usrreq() вызывает output функцию управление потоком, повторная передача, … для TCP вызов сетевой output функции напрямую (без protosw)

• специфика работы UDP (псевдо IP == PIP)• причина необходимости использования udp_output() и udp6_output()

Транспортный уровень (Транспортный уровень (outputoutput))

Page 26: Root Conf2009 Fin

Сетевой уровень (Сетевой уровень (outputoutput))

Page 27: Root Conf2009 Fin

Формирование сетевого (IP, IPv6) заголовка

Поиск маршрута (route lookup)• В большинстве случаев – маршруты из кеша

Исходящие pf(4) фильтрации

Вызов output функции интерфейса• интерфейс определяется на стадии поиска маршрута• структура интерфейса содержит указатели на функцию

• подобно protosw структуре

Сетевой уровень (Сетевой уровень (outputoutput))

Page 28: Root Conf2009 Fin

Уровень интерфейса (Уровень интерфейса (outputoutput))

Page 29: Root Conf2009 Fin

Формирование канального заголовка (Ethernet заголовка) или произведение специфических инкапсуляций (natm, ppp)

Может быть цепью виртуальных интерфейсов Пакет готов к передаче в интерфейсную очередь

• hint: альтернативная организация очереди (ALTQ) происходит на данном этапе

• необходим splnet() уровень По факту вызова ifp -> if_start

• драйвер направляет пакет в кольцо передачи (TX DMA ring)• Подобно всему драйвероспецифичному • TX прерывание или иное подобное действие высвободит пакет сквозь

трансивер

Уровень интерфейса (Уровень интерфейса (outputoutput))

Page 30: Root Conf2009 Fin

Маршрутизация

Page 31: Root Conf2009 Fin
Page 32: Root Conf2009 Fin

Форвард данные (forwarding info)

Адреса канального уровня в этом же дереве

Адресная группа (aka Address Family) независима• каждая AF имеет отдельное дерево

«Там чудеса: там леший бродит, … »• не там, чудеса начинаются здесь!

Маршрутизация (обзор)Маршрутизация (обзор)

Page 33: Root Conf2009 Fin

Маршрутизация (обзор)Маршрутизация (обзор)

Page 34: Root Conf2009 Fin

Маршрут может быть оттагированным ядром

pf «умеет» фильтровать или тагировать трафик на основе rtlabels

bgpd может помечать маршруты посредством BGP path атрибутов

ospfd в состоянии устанавливать метки маршрута, основанные на внешних маршрутных тагах

Маршрутизация (метки)Маршрутизация (метки)

Page 35: Root Conf2009 Fin

Дополнительная маршрутная преференция – метрика

Каждый маршрутный источник имеет свой тип• #define RTP_STATIC 8 /* static routes */• #define RTP_OSPF 16 /* OSPF routes */• #define RTP_RIP 24 /* RIP routes */• #define RTP_BGP 32 /* BGP routes */• иные

Маршрутизация (приоритеты)Маршрутизация (приоритеты)

Page 36: Root Conf2009 Fin

Маршрутизация (приоритеты)Маршрутизация (приоритеты)

Page 37: Root Conf2009 Fin

От теории к практике

Page 38: Root Conf2009 Fin

Применение sysctl(8)• kern.maxclusters управление mbuf(9)• net.inet.ip.ifq.maxlen управление очередью• net.inet.ip.maxqueue управление очередью• net.inet.{tcp,udp}.{send,recv}space размер окна• net.{inet,inet6}.{ip,ip6}.{forwarding,mforwarding}

В большинстве случаев достаточно системного ifconfig(8) + pfctl(8)

От теории к практикеОт теории к практике

Page 39: Root Conf2009 Fin

OpenBSD made stuff

Page 40: Root Conf2009 Fin

OpenSSH http://www.openssh.com/ OpenBGPD http://www.openbgpd.org/ OpenOSPFD http://www.openbgpd.org/ OpenNTPD http://www.openntpd.org/ OpenCVS http://www.opencvs.org/ иные http://www.openbsd.org/

OpenBSD made stuffOpenBSD made stuff

Page 41: Root Conf2009 Fin

Большое спасибоБольшое спасибо Компании ATMNIS http://www.atmnis.com/ Друзьям

[email protected][email protected]

Отдельно, Claudio Jeker [email protected] Организаторам RootConf – 2009

Page 42: Root Conf2009 Fin

Вопросы?