|
|
www.lissyara.su
—> статьи
—> FreeBSD
—> настройка
—> ng_bridge
Построение виртуального свитча из нескольких сетевых карт с использованием Netgraph.
Автор: FreeBSP.
Итак
Виртуальный свич из нескольких сетевух на нетграфе.
Исходная обстановка такая:
на сервере интерфейс rl0 смотрит наружу, в локалку провайдера 10.*.*.*.
а vr0 и vr1 смотрят во внутреннюю сеть 192.168.0.*
Для удобства хотелось бы чтобы в домашнюю сеть смотрела одна сетевуха, а все компы домашней сети были подключены к серверу через свич. Реализуем задуманное на основе ядерного модуля ng_bridge!
Кому лень читать статью полностью, выкладываю свой скрипт. Скрипт предоставляется "As Is" - что то тут лишнее, что то кривое... Конструктивная критика приветствуется. Наличие необходимых зависимостей подразумевается.
#!/bin/sh
ngCtl="/usr/sbin/ngctl "
Sleep="/bin/sleep"
PFcmd="/sbin/pfctl"
Head="/usr/bin/head"
Tail="/usr/bin/tail"
Echo="/bin/echo"
Rm="/bin/rm"
PidFile="/var/run/mybridge.pid"
if1="vr0"
if2="vr1"
ifng="ngeth0"
Switch="switch"
case $1 in
start)
if [ -s $PidFile ]; then
${Echo} Bridge already runned!
exit 1
fi
${Echo} Starting bridge
${ngCtl} debug 2
${ngCtl} mkpeer $if1: bridge lower link0
${ngCtl} name $if1:lower $Switch
${ngCtl} connect $if1: $Switch: upper link1
${ngCtl} connect $if2: $Switch: lower link2
${ngCtl} connect $if2: $Switch: upper link3
${ngCtl} msg $if1: setpromisc 1
${ngCtl} msg $if2: setpromisc 1
${ngCtl} msg $if1: setautosrc 0
${ngCtl} msg $if2: setautosrc 0
${ngCtl} mkpeer $Switch: eiface link5 ether
${ngCtl} name $Switch:link5 $ifng
${Sleep} 2
${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf
${Echo} 'int_if="'$ifng'"' >> /etc/pf.conf
${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf
ifconfig $if1 -alias
ifconfig $ifng inet 192.168.0.1 netmask 255.255.255.0
${PFcmd} -f /etc/pf.conf
${Echo} "runned" >> $PidFile
;;
stop)
if [ ! -s $PidFile ]; then
${Echo} Bridge is not runned!
exit 1
fi
${ngCtl} shutdown $Switch:
${ngCtl} shutdown $ifng:
${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf
${Echo} 'int_if="'$if1'"' >> /etc/pf.conf
${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf
ifconfig $if1 inet 192.168.0.1 netmask 255.255.255.0
${Rm} $PidFile
${PFcmd} -f /etc/pf.conf
;;
*)
if [ -s $PidFile ]; then
${Echo} State: Up
else
${Echo} State: Down
fi
;;
esac
| Нетграф по слухам чертовски производителен и чертовски плохо документирован, особенно на русском, так что если что не так, не обессудьте - в описанной конфигурации у меня все работает уже не один месяц. Также оговорюсь, что все беру с рабочей системы, так что-то может быть лишнее, а чего-то может не хватать.
Листинги обновлены и проверены на чистой тестовой системе
# uname -a
FreeBSD fbsd-gw.local 8.3-RELEASE FreeBSD 8.3-RELEASE #0: Mon Apr 9 21:47:23 UTC 2012 \
root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
| Начнем с необходимого - с нетграфа.
# kldstat
Id Refs Address Size Name
1 17 0xc0400000 c68d94 kernel
2 1 0xc2e8a000 4000 ng_bridge.ko
3 4 0xc2e8e000 b000 netgraph.ko
4 1 0xc2f1f000 4000 ng_ether.ko
5 1 0xc2f23000 3000 ng_eiface.ko
6 1 0xc2f28000 4000 ng_socket.ko
| Пробежимся по модулям:
kernel - ядро системы =)
netgraph - общий модуль нетграфа, автоматически подгрузится при загрузке любого другого модуля нетграфа;
ng_bridge - модуль ноды сетевого моста;
ng_ether - модуль для работы с сетевыми картами через подсистему нетграф;
ng_eiface - модуль ноды виртуальной сетевой карты;
ng_socket - необходим для работы утилиты ngctl и автоматически загружается ею.
После загрузки модулей нужных модулей смотрим что мы имеем
# ngctl list
There are 6 total nodes:
Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 0
Name: rl0 Type: ether ID: 00000001 Num hooks: 0
Name: vr0 Type: ether ID: 00000002 Num hooks: 0
Name: vr1 Type: ether ID: 00000003 Num hooks: 0
Name: ngeth0 Type: ether ID: 00000003 Num hooks: 0
Name: ngctl38473 Type: socket ID: 0000be26 Num hooks: 0
|
Мы должны видеть узлы типа ether по числу реальных интерфейсов, виртуальный интерфейс ngeth0 и соответствующий ему узел типа eiface а так же узел типа socket, который служит для связи ngctl с ядром(это уже мои измышления. Подробнее - man ng_socket && man ngctl). Еще мы видем один безымянный узел типа eiface - это родственник ngeth0, они создаются и уничтожаются только вместе.
Далее нам надо сделать мост. Но просто так его нельзя создать, его надо на что то прицепить. делается это следующим образом: описывается связь между сетевкой и пока еще не существующим мостом. по выполнении команды создается и связь и мост. Ну, поехали. Прицепим хук link0 моста (узел типа bridge[\b]) к хуку [b]lower сетевухи vr0. Сказано - сделано. Попутно обзовем его каким нибудь нехорошим именем, типа switch
# ngctl mkpeer vr0: bridge lower link0
# ngctl name vr0:lower switch
| Вот тут надо остановиться и поподробнее рассказать о том, что такое хуки(hooks), узлы(nodes), какие они бывают и с чем их едят. Нетграф - это система, которая строит граф, по которому бегают данные. В графе есть узлы и ребра. Иногда узел может просто висеть в воздухе(как например узлы наших сетевух), но чаще чтобы добавить какой то узел надо его к чему ни будь прикрутить. Прикручивание происходит соединением хуков разных узлов. После соединения между хуками появляется ребро по которому могут бегать данные от одного узла к другому. Хуки бывают разные и у каждого типа узла они свои. Какие то пропускают пакеты только в одну сторону, какие то пускают только пакеты верхних сетевых протоколов, подробнее про типы узлов написано в манах, а пока про насущное.
У сетевух(узлов типа ether) есть три хука - upper, lower, и orphans. Грубо говоря, lower работает с нижними протоколами(ethernet), upper - с верхними, а про orphans не помню, но он мне не вроде не подошел. У bridge - до 32 хуков (константа NG_BRIDGE_MAX_LINKS, у меня на 7.2 она определена в src/sys/netgraph/ng_bridge.h:55). Хуки именуются link0, link1, link2... У eiface только один хук, - ether - через который бегают все пакеты.
При обращении к локальным узлам пишем двоеточие в конце имени. Обращаться можно как по имени, так и по ID. в последнем случае вместо <node_name>: пишется [0x<node_id>]:
С теорией вроде закончил, перейдем к практике. Продолжаем строит свич: цепляем к мосту остальные хуки сетевушек
# ngctl connect vr0: switch: upper link1
# ngctl connect vr1: switch: lower link2
# ngctl connect vr1: switch: upper link3
| Идем далее. Сетевухи имеют свойства выпуская пакет прописывать в нем поле отправитель себя и игнорировать пакеты, предназначенные не ей. Отучаем их от этих нехороших привычек:
# ngctl msg vr0: setpromisc 1
# ngctl msg vr1: setpromisc 1
# ngctl msg vr0: setautosrc 0
# ngctl msg vr1: setautosrc 0
| Свич почти готов. цепляем к нему виртуальную сетевуху, чтобы общаться с ним
# ngctl mkpeer switch: eiface link5 ether
# ngctl name switch:link5 ngeth0
| И далее самое интересное. снимаем ипы с реальных сетевух(порты свича не имеют ипов) и ставим внутренний ип(у меня это 192.168.0.1) машины на виртуальную сетевуху. Реальные карточки должны быть без ипов только в состояниии UP
# ifconfig vr0 up
# ifconfig vr1 up
# ifconfig vr0 -alias
# ifconfig vr1 -alias
# ifconfig ngeth0 inet 192.168.0.1 netmask 255.255.255.0
| Вроде бы и все.
Смотрим что у нас получилось:
# ifconfig
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8<VLAN_MTU>
ether <XXX>
inet 10.XXX.XXX.XXX netmask 0xffffXXX broadcast 10.XXX.XXX.XXX
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
ether <XXX>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
ether <XXX>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
ngeth0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:00:00:00:00:00
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
<overquoting deleted>
# ngctl list
There are 17 total nodes:
Name: <unnamed> Type: ksocket ID: 0000be23 Num hooks: 1
Name: <unnamed> Type: pptpgre ID: 0000be22 Num hooks: 2
Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 1
Name: ng0 Type: iface ID: 0000bd94 Num hooks: 1
Name: rl0 Type: ether ID: 00000001 Num hooks: 0
Name: switch Type: bridge ID: 00000014 Num hooks: 5
Name: vr0 Type: ether ID: 00000002 Num hooks: 2
Name: vr1 Type: ether ID: 00000003 Num hooks: 2
Name: mpd16513-stats Type: socket ID: 0000bd9a Num hooks: 0
Name: ngctl38842 Type: socket ID: 0000be2a Num hooks: 0
Name: mpd16513-cso Type: socket ID: 0000bd92 Num hooks: 0
Name: mpd16513-eso Type: socket ID: 0000bd93 Num hooks: 0
Name: mpd16513-lso Type: socket ID: 0000bd91 Num hooks: 1
Name: ngeth0 Type: ether ID: 0000001f Num hooks: 0
Name: mpd16513-B1-mss Type: tcpmss ID: 0000be24 Num hooks: 2
Name: mpd16513-B1 Type: ppp ID: 0000bd95 Num hooks: 3
Name: mpd16513-L1-lt Type: tee ID: 0000bd96 Num hooks: 2
# arp -a
? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet]
------------------------``----------------------------------
? (192.168.0.2) at <XXX_MAC> on ngeth0 [ethernet]
? (192.168.0.3) at <XXX_MAC> on ngeth0 [ethernet]
? (192.168.0.255) at ff:ff:ff:ff:ff:ff on ngeth0 permanent [ethernet]
| Примечание: записи вида ? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet] - адреса из локалки провайдера)
Как видно, сетевухи vrX смирились со своей ролью в качестве портов свича и на них не висят маки соседих машин. Все выглядит так, будто у нас есть свич, в который воткнуты кабеля машин внутренней сети и кабель от нашего компа с интерфейса ngeth0(любопытно, что ifconfig и arp по разному определяют его мак). самого свича, как и полагается, не видно
Дальше разруливаем все пакеты файером, в нем разрешаем прохождение пакетов через реальные внутренние сетевухи(или шейпим/режем по надобности), ставим нат с внешней сетевухи на ngeth0, раздача инета между сетевухами моста будет регулироваться нетграфом. В общем ведем себя так, как будто у нас появился свич и исчезли две сетевухи.
спасибо за внимание, конструктивная критика приветствуется
[code]
Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?f=14&t=22488.
размещено: 2009-12-11,
последнее обновление: 2013-08-21,
автор: FreeBSP
|
|
|
|
2014-07-27, lissyara
gmirror
Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9
Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту
Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis
Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS
Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT
В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat
Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp
Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration
Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster
HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS
История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
2011-02-03, Капитан
1-Wire
Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
2011-01-28, Капитан
Температура в серверной
Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
2011-01-21, m4rkell
Syslog server
Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
2011-01-07, lissyara
Canon/gphotofs
Монтирование цифровых фотоаппаратов Canon (PTP) как файловой системы, автоматизация этого процесса через события devd и внешние скрипты.
2010-12-13, Al
IPSec
Описание принципов работы IPSEC и способов аутентификации.
2010-12-07, manefesto
FreeBSD on flash
Было принято решении переехать на USB Flash и установить минимальный джентельменский набор для работы своего роутера. Делаем =)
2010-12-05, Fomalhaut
root ZFS, GPT
Инструкция по установке FreeBSD с использованием в качестве таблицы разделов GPT и в качестве основной файловой системы - ZFS
2010-09-05, Cancer
Настройка аудиоплеера на ximp3
Цели: Простенький аудиоплеер, для того что бы тетя продавец в магазине утром пришла нажала на кнопку Power и заиграла в зале музыка, так же был доступ по сети, общая шара куда можно заливать музыку, к
2010-08-31, Cancer
Установка и настройка OpenVPN
На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах.
2010-08-25, manefesto
freebsd lvm
Использование linux_lvm для работы с LVM разделами из-под FreeBSD. Проблемы которые возники при монтирование lvm раздела
2010-04-30, gonzo111
proftpd file auth"a
Proftpd - квоты и авторизация из файлов, без использования базы данных и/или системных пользователей
2010-04-22, lissyara
tw_cli
Пошаговая инструкция по восстановлению RAID на контроллере 3ware, из которого выпал один диск. Настройка мониторинга состояния рейда и отчётов о его состоянии на email.
2010-04-14, fox
MySQL Master+Master
MySQL (Master Master) and (Master Slave) Как настроить репликацию…
|
Комментарии пользователей [7 шт.]