Netgraph
netgraph — модульная сетевая подсистема ядра FreeBSD, основанная на принципе графов. В Netgraph строится граф из узлов различных типов, узел каждого типа имеет некоторое количество входов/выходов (хуков, англ. hooks). Узел netgraph позволяет производить определенные действия над пакетом, проходящим через него. Некоторые netgraph-узлы предоставляют поддержку различных протоколов, инкапсуляций, таких как L2TP, PPTP, PPPoE, PPP, ATM, bluetooth, другие служат для связки модулей и сортировки/маршрутизации между узлами netgraph, например, bpf, split.
netgraph также портирован на другие операционные системы: NetBSD[1] и Linux kernel 2.4 и 2.6 от 6WIND[2].
История
netgraph был разработан и впервые реализован Джулианом Элишером (Julian Elischer) при участии Арчи Коббса (Archie Cobbs) в Whistle Communications, Inc. для роутера Whistle InterJet, работавшего под управлением модифицированной FreeBSD 2.2. В основное дерево FreeBSD netgraph был включен в версии 3.4.
Типы узлов
| Тип | Описание |
|---|---|
| Сетевые интерфейсы, устройства и сокеты | |
| ether | Представляет существующий Ethernet-интерфейс, создается автоматически. |
| gif | Представляет существующий gif-интерфейс, создается автоматически. |
| tty | Представляет подключение к терминалу (TTY). |
| iface | Представляет сетевой интерфейс. Для каждого нового узла создается новое устройство ng*. Созданный интерфейс с помощью ifconfig можно настроить как широковещательный или точка-точка. |
| eiface | Представляет Ethernet-интерфейс. Для каждого нового узла создается новое устройство ngeth*. Созданный интерфейс можно настроить с помощью ifconfig. |
| device | Представляет системное устройство. Для каждого нового узла создается новое устройство ngd*, доступное для операций open, close, read и write. |
| socket | Автоматически создаваемый узел, представляет сокет типа NG_CONTROL. Позволяет приложению взаимодействовать с подсистемой netgraph. |
| ksocket | Создает новый BSD-сокет, позволяющий подсистеме netgraph взаимодействовать с другими хостами или службами (антипод socket). Поддерживает только один хук, имя которого в виде семейство/тип/протокол определяет тип создаваемого сокета. |
| Сетевые протоколы | |
| cisco | Инкапсулирует и декапсулирует данные по протоколу Cisco HDLC. Хук downstream должен быть соединен к синхронной линии. Хуки inet, inet6, atalk, и ipx используются для передачи пакетов одноимённых протоколов и, обычно, соединяются с соответствующими типами узлов. |
| frame_relay | Производит инкапсуляцию, декапсуляцию и мультиплексирование данных по протоколу Frame relay. Хук downstream должен быть соединен к синхронной линии. Хуки dlci* могут соединяться с соответствующим каналом DLCI. |
| gif_demux | Инкапсулирует и декапсулирует данные gif-интерфейса. Хук gif должен быть соединен c узлом типа gif, хуки inet, inet6, atalk, ipx, atm, natm и ns соответствуют одноимённым протоколам. |
| l2tp | Реализует инкапсуляцию протокола L2TP в соответствии с RFC 2661. |
| lmi | Поддержка LMI frame relay. |
| mppc | Поддержка сжатия и шифрования MPPC/MPPE. |
| ppp | Мультиплексирование данных PPP. |
| pppoe | Поддержка PPPoE. |
| pptpgre | Реализация GRE над IP по протоколу PPTP в соответствии с RFC 2637. |
| vlan | Мультиплексирование кадров IEEE 802.1Q VLAN |
| Коммутация | |
| bridge | Реализует Ethernet-бридж на одном или нескольких соединениях. Каждое соединение (соответствующее присоединенному хуку) используется для приема и передачи кадров Ethernet, принцип действия аналогичен коммутатору. |
| hub | Предоставляет простейший механизм распределения данных по нескольким соединениям. Принцип действия аналогичен концентратору: данные, принятые с любого хука пересылаются на все остальные хуки. |
| one2many | Предоставляет механизм распределения данных из одного соединения по нескольким. При этом алгоритм распределения либо копирует данные с хука one на все хуки many* (как hub), либо только на один последовательно (каждый пакет отправляется на разные хуки). Данные, приходящие с любого хука many*, копируются на хук one. |
| tee | Предоставляет возможность «подслушивать» обмен данными между двумя узлами. Данные, полученные через хук right копируются на хуки left и right2left, а полученные через left — на right и left2right. |
| split | Делит один двунаправленный поток данных на два однонаправленных. |
| etf | Фильтрует и распределяет данные на основании типа Ethernet-пакета. |
| Тестирование и отладка | |
| echo | Возвращает любые данные и управляющие сообщения отправителю. |
| hole | Отбрасывает все полученные данные и управляющие сообщения. |
| Другие | |
| atm | |
| async | |
| atmllc | |
| bluetooth | |
| bpf | Позволяет осуществлять фильтрацию/сортировку пакетов на основе правил BPF |
| bt3c | |
| btsocket | |
| fec | Агрегирует несколько Ethernet интерфейсом по технологии EtherChannel |
| h4 | |
| hci | |
| ip_input | Пакеты передаваемые на этот узел попадают в ip_input операционной системы и далее обрабатываются также как пришедшие с другого узла по сети |
| l2cap | |
| netflow | Реализация протокола Netflow |
| rfc1490 | |
| sppp | Реализация PPP соединений для последовательный каналов внутри Netgraph |
| sscfu | |
| sscop | |
| ubt | |
| UI | |
| uni | |
| vjc | Реализация сжатия Якобсона |
Примечания
- ↑ tech-net: NetBSD port of the freebsd netgraph environment. Дата обращения: 8 сентября 2008. Архивировано 6 октября 2013 года.
- ↑ 6WIND Архивная копия от 24 декабря 2017 на Wayback Machine, коммерческий закрытый порт