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Реализация сжатия Якобсона

Примечания

  1. tech-net: NetBSD port of the freebsd netgraph environment. Дата обращения: 8 сентября 2008. Архивировано 6 октября 2013 года.
  2. 6WIND Архивная копия от 24 декабря 2017 на Wayback Machine, коммерческий закрытый порт

Ссылки