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