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, коммерческий закрытый порт