«Asterisk» и «Bridge или как обьединять сетевые интерфейсы»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Vix
 
imported>Vix
Нет описания правки
 
Строка 1: Строка 1:
=='''Офисная АТС на Asterisk малой кровью или бюджетный способ получить мини АТС с функциями серьезной станции.'''==
Бридж (англ. bridge, мост) - это способ соединения двух сегментов Ethernet на канальном уровне, т.е. без использования протоколов более высокого уровня, таких как IP. Пакеты передаются на основе Ethernet-адресов, а не IP-адресов (как в маршрутизаторе). Поскольку передача выполняется на канальном уровне (уровень 2 модели OSI), все протоколы более высокого уровня прозрачно проходят через мост.


1. Почему (На правах введения).
Термины коммутатор, мост и бридж могут использоваться на данной странице как взаимознаменяемые.


*Практика работы на телекоммуникационном рынке показывает существование серьезного интереса к VoIP решениям на базе ПО, реализующего функции некогда доступные только в телефонных станциях уровня Definity и аналогичных. То, что VoIP технология будет идти вперед и если не вытеснит, то существенно подвинет позиции "железных" решений, это так же очевидно как, то, что отсутствие "интернет" - если и не останавливает работу в офисе IT компании, то существенно ее затрудняет . Прогнозы дело не благодарное, кроме того, их на сегодняшний день существует большое кол-во от разных аналитических изданий, в одном они сходятся со стопроцентной уверенностью - очевиден рост темпа внедрений VoIP решений (несмотря на существование пресловутых правил подключения).
Код bridge в Linux является частичной реализацией стандарта ANSI/IEEE 802.1d. Впервые бриджинг в Linux появился в 2.2, затем код был переписан Леннертом Буйтенхеком (Lennert Buytenhek). Код bridge интегрирован в ядра серий 2.4 и 2.6.
Железо
- Intel Pentum 133
- RAM 32 mb
- hdd 1024 mb
- 2 сетевые карты 100 Mbps или 1000 Mbps (можно и больше, но желательно одинаковые).


2. Что.
Установка ПО
Ставим Linux Debian с минимумом пакетов, сеть не настраиваем. После установки Debian ставим несколько необходимых пакетов:


*В данной статье преследуется "простая" цель - показать возможность реализации функций офисной АТС уровня, например, Panasonic KX-TD 1232 (12 внешних линий, 32 внутренних) при помощи PC сервера, одной или нескольких специализированных плат (Digium) для подключения аналоговых или цифровых внешних линий, программного обеспечения Asterisk (Офисная станция) и LANBilling (тарификация, сбор статистики). Результатом будет являться полноценная IP АТС, в которой могут быть реализованы функции, ранее недоступные, "простому смертному" (компании малого бизнеса с количеством сотрудников около 10-30 человек). Почему Asterisk - потому что это бесплатное, широко распространенное (а значит, по его внедрениям проще найти информацию), и что не менее важно, opensource решение, реализующее большинство необходимых мелкому и среднему офису функций.
Код:
# apt-get mc
# apt-get install bridge-utils
# apt-get install iproute
# apt-get install iftop
# apt-get install bmon
# apt-get install openssh-server
# apt-get install iperf


3. Как.
*Как и любая мини АТС, описанное в статье решение, коммутирует телефонные каналы внутренних абонентов во внешнюю телефонную сеть (как правило, внешних каналов несколько меньше, чем, в общем случае, внутренних). В качестве интерфейса подключения к IP PBX внутренних абонентов используется Ethernet интерфейс сервера, в составе которого мы будем реализовывать решение. Соответственно, транспортом для абонентских телефонных каналов, служит Ethernet среда, по определению, не гарантирующая качества канала (и это является основным камнем преткновения технологии). Поэтому первое, на что стоит обратить внимание при реализации решения, это меры по предотвращению коллизий в Ethernet сегменте. Часто для пакетной телефонии выделяется отдельный Ethernet сегмент в рамках СКС предприятия, что определенным образом гарантирует качество абонентских каналов. Способов же подключить внешние телефонные каналы к АТС существует великое множество, поэтому мы будем рассматривать реализацию решения безотносительно типа подключения АТС к внешней телефонной сети, перечислив лишь способы, которыми могут быть подключены к серверу внешние "линии".


*Во-первых, внешним каналом может служить обычный Интернет канал, с той лишь оговоркой, что он должен быть достаточного для прохождения всех пакетов выбранного протокола VoIP качества и гарантировать минимальность задержки при передаче пакетов. Весьма абстрактное требование. Более точно требования к внешнему каналу в случае использования пакетной телефонии нужно рассчитывать в зависимости от ряда параметров, рассмотрение которых выходит за рамки статьи. Этот способ (при помощи Интернет канала) наименее предпочтителен с точки зрения гарантий качества передачи голоса, по понятным причинам, - у потребителя нет возможности выделения определенной полосы пропускания для голосовых данных. Не стоит строить систему полагаясь только на интернет канал - как известно интернет бывает, что "пропадает", мало того что неприятно оставваться без интернет, но вдвойне неприятно при этом оставться еще и без телефонной связи, не имея возможности высказать свои претензии провайдеру.
Настройка моста
Узнаем где наши сетевые карты
Код:
# ifconfig
eth1      Link encap:Ethernet  HWaddr 00:19:5B:88:B2:85
          inet6 addr: fe80::219:5bff:fe88:c287/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3871824 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4707022 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1031462268 (983.6 MiB)  TX bytes:1375550080 (1.2 GiB)
          Interrupt:10 Base address:0x6200
eth2      Link encap:Ethernet  HWaddr 00:19:5B:88:C7:86
          inet6 addr: fe80::219:5bff:fe88:c288/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4707923 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3855788 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1377378066 (1.2 GiB)  TX bytes:1020322438 (973.0 MiB)
          Interrupt:9 Base address:0x6300
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:56 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4396 (4.2 KiB)  TX bytes:4396 (4.2 KiB)


*Второй способ это подключение аналоговых линий к IP АТС при помощи плат Digium. Если линий не очень много (до 16), то способ примелем с практической точки зрения, и гарантирует качество переговоров т.к. в данном случае качество может пострадать только из-за перегрузок во внутренней транспортной сети.
Настройки сети в Linux Debian находятся в файле /etc/network/interfaces
*Третий способ - это использование плат вышеуказанного производителя (или аналогичных) для стыка E1 и более скоростных. Так же как и способ №2 этот способ гарантирует приемлемое качество телефонных разговоров. Его целесообразно применять при необходимости подключения большего количества внешних линий (более 16, как правило). Существует возможность комбинирования указанных способов подключения внешних линий. Например, когда в нормальной ситуации используется стык канал E1, в случае проблем с основным поставщиком услуг телефонии используется аналоговые каналы, и при их отсутствии диалпир провайдера VoIP, доступный через общий интернет канал. ПО Asterisk позволяет гибко управлять коммутацией при возникновении перегрузок и пр. событий задействуя все внешние каналы безотносительно того, каким способом они подключены к IP АТС.
У меня на мосте он имеет такой вид:
Код:
# The loopback network interface
auto lo
iface lo inet loopback


*В практически в любой аппаратной мини АТС имеется COM порт (устаревающие модели) или другой способ (CDR файлы, информация, передаваемая через интерфейс сокетов и т.д.) снятия данных о состоявшихся телефонных разговорах или разговорах находящихся в активном состоянии (начавшихся, но еще не завершившихся). В рассматриваемом нами случае в качестве способа снятия звонковой информации используется интерфейс на базе RADIUS протокола, который не является, к слову, встроенным средством Asterisk, а настраивается в дополнение к основному функционалу при помощи разработанных плагинов (PlugIn - встариваемый код).


*До сих пор статья описывает принципы построения решения, т.е. отвечает на вопрос "Что мы получим в результате?". Резюмируя, можно сказать, что помимо возможностей коммутации телефонных разговоров (основная функция АТС) IP АТС сможет:
Создаём скрипт /etc/network/if-up.d/bridge
Код:
#!/bin/sh


    работать в качестве карточной платформы
# Чистим настройки от предыдущего запуска скрипта
    обеспечивать функции виртуального секретаря через IVR (тоновый донабор внутреннего номера внешним абонентом, как пример) Прим: IVR - Interactive
ifconfig br0 down # Отключаем интерфейс моста
    Voice Response
ifconfig eth1 down # Отключаем сетевую карту eth1
    обеспечивать функции MailBox - голосового почтового ящика
ifconfig eth2 down # Отключаем сетевую карту eth2
    обеспечить переадресацию вызовов на любой номер (внешний / внутренний)
brctl delbr br0 # Удаляем имя моста


а также реализовать другие, не характерные для обычных мини АТС функции.
# Запускаем бридж
brctl addbr br0 # Задаём имя бриджу
brctl addif br0 eth1 # Указываем какие интерфейсы
brctl addif br0 eth2 # работают в режиме моста.


*Прежде чем перейти к разделу, в котором подробно описана установка RADIUS клиента для Asterisk - собственно способ интеграции Asterisk и LANBilling, следует отметить что, как и любое свежее решение (не путать с ментос) данное имеет недостатки - например, отсутствие более-менее удобного интерфейса для конфигурирования Asterisk, все настройки приходится применять, редактируя текстовые файлы конфигурации, хотя, что можно придумать неудобнее, чем нажатие кнопок системного телефона при конфигурировании АТС LG-GHX 616, например. Успокаивает то, что не так часто приходится менять настройки станции. По мере внедрения описанного решения статья будет дополняться информацией по новым возможностям как Asterisk, так и всех модулей, участвующих в функционировании предлагаемого решения
brctl stp br0 off # Отключаем режим STP
# brctl setfd br0 15 # Актуально только при
# brctl setageing br0 60 # использовании STP


3.1 Установка Asterisk
# Задаём IP моста, для дальнейшего управления им через ssh
ifconfig br0 192.168.110.251 netmask 255.255.0.0 broadcast 192.168.255.255


В этом подразделе мы опишем установку asterisk под Linux безотноситильно какого-либо дистрибутива, то есть речь будет идти о сборке из исходников, взять которые можно на asterisk.org. При установке под FreeBSD есть ряд особенностей, на которых сейчас не хотелось бы останавливаться.
# Удаляем IP сетевых карт
ifconfig eth1 0.0.0.0
ifconfig eth2 0.0.0.0


В первую очередь распаковываем исходный код:
# Поднимаем интерфейсы сетевых карт и моста
ifconfig eth1 up
ifconfig eth2 up
ifconfig br0 up


#tar -zxf asterisk-1.0.9.tar.gz
В принципе мост готов к использованию, надо только перезагрузить компьютер или выполнить скрипт (не забудьте его сделать запускаемым от имени root 774
#cd asterisk-1.0.9/
Код:
# chgrp root /etc/network/if-up.d/bridge
# chown root /etc/network/if-up.d/bridge
# chmod 774 /etc/network/if-up.d/bridge


Для того, чтобы была возможность запускать asterisk от имени непривилегированного пользователя, необходимо отредактировать Makefile, заменив "ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run" (приблизительно строка 123) на "ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run/asterisk".
Затем:


#make clean
Настройка маршрутизации
#make
#make install


Если asterisk устанавливается "с нуля", то рекомендуется установить примеры конфигурационных файлов:
Может возникнуть необходимость указать с какой стороны находится тот или иной компьютер. Дописываем в наш скрипт следующие команды:


#make samples
# Сообщаем что ip 192.168.110.200 находится со стороны eth1
Код:
route add -host 192.168.110.200 dev eth1


Теперь создаем пользователя для asterisk и меняем владельца рабочих директорий:
# Сообщаем что ip 192.168.88.250 находится со стороны eth2
Код:
route add -host 192.168.88.250 dev eth2


#groupadd asterisk
# Сообщаем мосту с какой стороны сеть 192.168.55.0/24 (255.255.255.0)
#useradd -c "asterisk PBX" -d /var/lib/asterisk -g asterisk asterisk
Код:
#chown -R asterisk:asterisk /var/run/asterisk
route add -net 192.168.55.0/24 dev eth1
#chown -R asterisk:asterisk /etc/asterisk
#chown -R asterisk:asterisk /var/lib/asterisk
#chown -R asterisk:asterisk /var/log/asterisk
#chown -R asterisk:asterisk /var/spool/asterisk


Запускать asterisk нужно с ключами -G asterisk -U asterisk. Пример стартового скрипта можно посмотреть здесь.
После таких настроек ваш мост станет немного умнее. Теперь для проверки маршрутизации набираем команду:
Код:
# route
Kernel IP routing table
Destination    Gateway        Genmask        Flags Metric Ref    Use Iface
192.168.110.200 *              255.255.255.255 UH    0      0        0 eth1
192.168.88.250  *              255.255.255.255 UH    0      0        0 eth2
192.168.55.0    *              255.255.255.0    U     0      0        0 eth1
localnet        *              255.255.0.0    U    0      0        0 br0


Основные действия по установке выполнены. В результате имеется практически готовая к использованию IP АТС. Самое время приступать к конфигурированию и подключению абонентов. На данном этапе мы пока не можем использовать протокол H323 и Zaptel (аналоговые POTS lines, цифровые каналы E1/T1/J1). Инструкции по поводу установки и настройки этих модулей смотрите в соответсвующих разделах статьи.
Удалённое управление мостом


3.1.1 Подключение абонентов
Входим на мост удалённо как пользователь root (под root лучше не работать):
Код:
# ssh root@192.168.110.251


По умолчанию вся конфигурация asterisk хранится в виде текстовых файлов (как правило, в /etc/asterisk/). Разработчиками была проделана большая работа для перенесения конфигурации в базу данных, но это отдельный вопрос... Конфигурационных файлов достаточно много: каждому модулю asterisk соответсвует свой файл. Но это не должно пугать. Скорее всего многие модули Вы просто не будете использовать, поэтому не спешите тонуть в этой куче файлов и непонятных инструкций. На самом деле все конфиги выдержаны в одном стиле, поэтому более-меенее разобравшись с основными, не составит труда освоить новый.


Базовая конфигурация (asterisk.conf)
Теперь можно работать с мостом как с настольным компьютером в текстовом режиме.


Файл asterisk.conf содержит пути к основным рабочим директориям АТС. Если после установки эти директории никуда не переносились, то файл в исправлении не нуждается.
Мониторинг и управление
# Удобная утилита для просмотра загрузки сети и мостаю
Код:
bmon


Настройка протокола SIP/IAX. Подключение SIP/IAX пользователей (sip.conf/iax.conf)
# Ещё не менее полезная утилита мониторинга сети
Код:
iftop -i br0


Файлы sip.conf, iax.conf имеет сходную структуру. Эти конфигурационные файлы содержат специфические настройки протокола и определяют профили подключенных пользователей. Рассмотрим для примера sip.conf (взято из asterisk samples):
# инф. о сетевых интерфейсах
Код:
ifconfig


;
# поднять (убить) сетевой интерфейс
; В этом файле содержится конфигурация, касающаяся протокола SIP
Код:
;
ifconfig eth1 up (down)
; Синтаксис для указания SIP-устройства(это может быть IP телефон, либо
; софтфон, либо VoIP шлюз) в extensions.conf следующий:
; SIP/[имя устройства], где [имя устройства] определяется ниже.
;
; Можно также использовать следущую конструкцию:
; SIP/[имя пользователя]@[домен], чтобы позвонить пользователю
; в сети Итернет
;
; Можно описать узел (peer) для произвольного SIP-прокси (см. ниже),
; тогда вызов пользователя через этот шлюз будет выглядеть так:
; SIP/[SIP-прокси]/[пользователь] или SIP/[пользователь]@[SIP-прокси].
; Что есть SIP-прокси определяется ниже.
;
; Несколько слов об используемой здесь терминалогии:
; user (пользователь) - может звонить на asterisk, либо через него.
; peer (узел) - может только принимать звонки от asterisk.
; friend - объединяет в себе оба вышеупомянутых понятия.
;
; Полезные команды консоли asterisk для контроля SIP узлов/пользователей:
;  sip show peers             
;  Покажет все SIP peer'ы (включая friends)


;  sip show users             
# инф. о мосте
;  Покажет все SIP user'ы (включая friends)
Код:
brctl show


;  sip show registry         
# таблица MAC-адресов моста
;  Статус установленной регистрации
Код:
brctl showmacs br0


;  sip debug                 
# ARP-таблица
; Повышенная детализация сообщений в консоли
Код:
arp -a


;  reload chan_sip.so         
# Снифер
Код:
tcpdump host 192.168.110.100
<hr>
'''''Выдержка из man:'''''
NAME
      bridge-utils-interfaces - bridge-utils extensions for the interfaces(5)
      file format


; Перегрузить конфиг. файл
DESCRIPTION
; Конфигурация активных SIP peer'ов изменена не будет
      /etc/network/interfaces  contains  network  interface  configuration
      information  for  the  ifup(8)  and  ifdown(8)  commands. This manpage
      describes the bridge extensions  to  the  standard  interfaces(5)  file
      format.


      The  main  extension  is  the bridge_ports option, with it you describe
      that the interface is a bridge and what ports does it have. These ports
      are the interfaces that are part of the bridge, and they shouldn't have
      any stanzas defining them on  the  interfaces  file.  Other  extensions
      allow you to tune the bridge options or change a bridge behaviour.


      We'll see this with an example:
      auto br0
      iface br0 inet static
          address 192.168.1.2
          network 192.168.1.0
          netmask 255.255.255.0
          broadcast 192.168.1.255
          gateway 192.168.1.1
          bridge_ports all
      Well,  after  setting this, an ifup br0, or the next reboot, should let
      you have a bridge up and running, after waiting for the ports to get to
      the  forwarding  status,  of course. This bridge will be using all your
      ethX interfaces, as we have stated on the bridge_ports line.


; Раздел общих настроек
      The Debian bridge setup scripts will wait for it to get ready to  work.
[general]
      They  do  this by trying to guess the maximum time that the bridge will
context=default                
      need to get to the forwarding status, and by default,  they  will  wait
      for  the  bridge  to get there, or for the estimated maximum time to go
      by.  This is done so that the services that are loaded after the bridge
      setup  have  a  working  network  interface  and don't fail because the
      bridge is still not working. See bridge_maxwait if you want  to  change
      this behaviour.


; Контекст по умолчанию для входящих звонков
      An  example  of  how  to  setup  a so called anonymous bridge (a bridge
      without an assigned IP) would look like this:
      iface br1 inet manual
            bridge_ports eth1 eth2
            bridge_maxwait 0
      Here we select the interfaces eth1 and eth2 to be added to  the  bridge
      interface  br1,  which  will  be  an anonymous bridge, we also tell the
      scripts not to wait, as we won't be having any service running on  that
      interface (it doesn't even have an IP).


;recordhistory=yes             
      An example of a little more complex bridge setup could be:
      auto br0
      iface br0 inet static
          address 192.168.1.2
          network 192.168.1.0
          netmask 255.255.255.0
          broadcast 192.168.1.255
          bridge_ports all weird0
          bridge_bridgeprio 32767
          bridge_portprio eth0 129
          bridge_fd 5
      In  this  example we select all the eth* devices plus a weird device to
      be added to the bridge, also we change the bridge default priority to a
      higher  one  so  that  this  bridge  becomes  the root (if there are no
      bridges with higher priority on the net, that is)  and  also  we  lower
      priority  of  port eth0 so that it is not used if there are other ports
      with higher priority to reach the same destination, at the end we lower
      the default forward delay.


; хранить историю SIP подключений
      If there is a need to set up any of the interfaces participating on the
; (см. sip history / sip no history)
      bridge and not the bridge itself, then we must add the commands to  set
      up  those  settings in a "pre-up" or "up" statement. This means that if
      we have a wireless card that we want to add to a bridge and we want  to
      set  it  to  master, and select the essid, instead of using the typical
      wireless_* commands we could add to  the  bridge  definition  something
      like this:
      pre-up iwconfig wlan0 mode master essid myESSID
      Be aware, however, that using wireless cards as part of a bridge is not
      a good idea if the card belonging to the bridge  is  in  managed  mode.
      Trying  to bridge packets coming out of our LAN through a wireless card
      that is set in managed mode (the card is a client of an AP) is bound to
      give  problems,  as the AP will probably refuse packets with source MAC
      addresses which are not associated (this will  be  the  case  of  other
      machines going through the wireless card of the bridge into the AP).


;realm=mydomain.tld           
      Multiple stanzas of a bridge definition are currently not supported, so
      if you want to add a ipv6 and a ipv4 to a  bridge  do  it  all  in  one
      definition  by  using the "up" option. If however you still want to use
      multiple stanzas or would like to read more on this bug you can see  it
      at http://bugs.debian.org/319832


; Realm (атрибут области) для digest аутентификации
IFACE OPTIONS
; по умолчанию - "asterisk"
      A  little  explanation  on  the  new  options  that  can  be  used  on
; Realms должны быть уникальны в соответсвии с RFC 3261
      /etc/network/interfaces to setup the bridge, so you don't  have  to  go
; Принято указывать здесь свое доменное имя
      and look at the scripts...


port=5060                     
      '''bridge_ports interface specification'''
              this option must exist for the scripts to setup the bridge, with
              it you specify the ports you want to add to your bridge,  either
              using  "none" if you want a bridge without any interfaces or you
              want to add them later using brctl, or a list of the  interfaces
              you want to add separated by spaces, for example:
              bridge_ports eth0 eth4
              You  should  not  put any lines to configure the interfaces that
              will be used by the bridge, as this will be setup  automatically
              by the scripts when bringing the bridge up.


; Прослушиваемый UDP порт (стандартный порт - 5060)
              If you need to specify the interfaces more flexibly, you can use
              the following syntax (most useful on a Xen dom0):
              bridge_ports regex (eth|vif).*
              This means to evaluate (as in  egrep(1))  the  expressions  that
              follow  after  "regex"  until  either  the  end  or  a "noregex"
              statement is reached.  The  regular  expressions  are  evaluated
              against all local interfaces and those that match are added.


bindaddr=0.0.0.0               
              Specifying  "all"  is  short  for  "regex  eth.*  em.*  p[0-9].*
              noregex" and will get all the ethX and  biosdevname-format  (emX
              and pX) interfaces added to the bridge.


; Слушать конкретный IP адрес (0.0.0.0 - слушать на всех)
              Carrying this to the extremes, the following is valid syntax:
              bridge_ports all regex if.0 noregex ext0 regex vif.*
              This will add all ethX interfaces, the ifX0 interfaces, the ext0
              interface and all vifX interfaces.


srvlookup=yes                 
      '''bridge_ageing time'''
              set ageing time, default is 300, can have a fractional part.


; Разрешить использование DNS
      '''bridge_bridgeprio priority'''
; Замечание: Asterisk использует только первую запись
              set bridge priority, priority is between 0 and 65535, default is
; в ответе DNS сервера.
              32768, affects  bridge  id, lowest priority bridge will be the
; Если эта опция выключена, вы не сможете установить
              root.
; SIP соединение, определяемое именем хоста
; (напр. SIP/user@voip.somewhere.com)


;pedantic=yes                 
      '''bridge_fd time'''
              set bridge forward delay to time seconds,  default  is  15,  can
              have a fractional part.


; Разрешить медленную, более точную проверку Pingtel заголовков,
      '''bridge_gcint time'''
; обеспечивающую строгое соответсвие стандарту SIP.
              set  garbage  collection interval to time seconds, default is 4,
; (По умолчанию "no")
              can have a fractional part.


;tos=184                       
      '''bridge_hello time'''
              set hello time to  time  seconds,  default  is  2,  can  have  a
              fractional part.


; Установить IP QoS. Допускается указать численное значение либо
      '''bridge_hw MAC address'''
              set the Ethernet MAC address of all the bridge interfaces to the
              specified one so that the bridge ends up  having  this  hardware
              address as well. WARNING: use this only if you know what you are
              doing, changing the MAC address of the cards may  cause  trouble
              if  you  don't  know  what  you are doing. To see the discussion
              about this feature and the problems that can cause you  can  try
              to  have  a look at the bug that asked for this feature visiting
              http://bugs.debian.org/271406


;tos=lowdelay                 
      '''bridge_maxage time'''
              set max message age to time seconds, default is 20, can  have  a
              fractional part.


; одно из служебных слов: lowdelay,throughput,reliability,mincost,none
      '''bridge_maxwait time'''
              forces  to  time seconds the maximum time that the Debian bridge
              setup scripts will wait for the  bridge  ports  to  get  to  the
              forwarding  status, doesn't allow factional part. If it is equal
              to 0 then no waiting is done.


;maxexpirey=3600               
      '''bridge_pathcost port cost'''
              set path cost for a port, default is 100, port is  the  name  of
              the interface to which this setting applies.


; Максимальное значение периода входящих регистраций.
      '''bridge_portprio port priority'''
              set  port priority, default is 128, affects port id, port is the
              name of the interface to which this setting applies.


;defaultexpirey=120           
      '''bridge_stp state'''
              turn spanning tree protocol on/off, state values are on  or  yes
              to  turn  stp  on and any other thing to set it off, default has
              changed to off for security reasons in latest  kernels,  so  you
              should  specify  if you want stp on or off with this option, and
              not rely on your kernel's default behaviour.


; Значение периода входящих/исходящих регистраций по умолчанию
       '''bridge_waitport time [ports]'''
 
              wait for a max of time seconds for the specified ports to become
;notifymimetype=text/plain     
              availableif no ports are specified then those specified on
 
              bridge_ports will be used here. Specifying no ports here should
; Явное указание mime типов в MWI NOTIFY
              not be used if we are using regex or "all" on bridge_ports, as
 
              it wouldn't work.
;videosupport=yes             
<hr>
 
; Поддержка SIP видео
 
;disallow=all                 
 
; Запретить все кодеки (ниже указывается список разрешенных кодеков)
 
;allow=ulaw                   
 
; Разрешаем кодеки в порядке, соответсвующем их приоритету
 
;allow=ilbc                   
 
; Замечание: порядок кодеков имеет смысл задавать только в разделе
; [general]
 
;musicclass=default           
 
; Установить класс по умолчанию для мелодий во время ожидания.
; Он может задаваться индивидуально для пользователей/узлов
 
;language=en                   
 
; Выбор языка по умолчанию
; Также может задаваться индивидуально для пользователей/узлов.
 
;relaxdtmf=yes                 
 
; "смягченный" режим распознавания dtmf
 
;rtptimeout=60                 
 
; Разрывать соединение, если в течение 60 сек. не было RTP трафика,
; при условии что мы не находимся в режиме ожидания.
 
;rtpholdtimeout=300           
 
; То же самое, но относится к режиму ожидания
; (rtpholdtimeout > rtptimeout)
 
;trustrpid = no               
 
; Полагаться на значение поля Remote-Party-ID
 
;progressinband=no             
 
; Всегда передавать вызывающий сигнал in-band
 
;useragent=Asterisk PBX       
 
; Задать значение поля user agent
 
;nat=no                       
 
; настройки NAT
; yes = всегда игнорировать информацию в пакетах, предполагая наличие NAT
; no = использовать режим NAT в соответсвие с RFC3581
; never = не использовать NAT режим
; route = использовать режим NAT, не отсылать удаленный порт
 
;promiscredir = no
   
; Позволяет разрешить 302 или REDIR (переадресации)
; на нелокальные SIP адреса
; Со включенным promiscredir переадресации на локальные адреса
; приведут к зацикливанию, т.к. протокол SIP неспособен
; осуществлять "петлевые" звонки.
 
; Если определен regcontext, Asterisk будет динамически создавать
; экстеншн "NoOp" с приоритетом, равным 1, для peer'а,
; который регистрируется у нас и удалять его при снятии
; регистрации.  Действительный экстеншн для этого peer'а
; определяется параметром 'regexten' либо его именем,
; если 'regexten' не указан.
; Может быть задано несколько экстеншенов, разделенных '&'.
; Разрешается использовать шаблоны.
 
;regcontext=iaxregistrations
 
; Asterisk может регистрироваться как SIP-пользователь
; у своего SIP провайдера
; Соответсвующая инструкция имеет следующий формат:
;      register => user[:secret[:authuser]]@host[:port][/extension]
 
; Необязательные параметры заключены в скобки [].
; Если, не задан экстеншн (extension), используется экстеншн 's'.
; Соответсвующий экстеншн должен быть определен в extensions.conf,
; чтобы принимать звонки от своего SIP-провайдера
;
; host - это либо DNS имя, либо имя одной из определенных ниже секций.
;
; Пример:
;
;register => 1234:password@mysipprovider.com
;    Здесь входящие звонки будут приходить в экстеншн 's'
;register => 2345:password@sip_proxy/1234
;
;    Регистрируем 2345 на SIP-провайдере 'sip_proxy'. 
; Входящие звонки от провайдера будут приходить
;    в экстеншн 1234, определенном в extensions.conf в default-контексте,
; либо любом другом, если
;    вы сконфигурируете раздел [sip_proxy] и зададите там нужный контекст.
; Совет 1: Не используйте DNS имя для названия секций в sip.conf,
; например, [provider.com]
; Совет 2: Используйте раздельно две секции type=peer
; и type=user для SIP-провайдера (вместо одной секции type=friend)
; если звонки идут в обоих направлениях
 
;externip = 200.201.202.203   
 
; Адрес, который будет помещен в исходящие SIP-пакеты,
; если мы находимся за NAT'ом (наш внешний ip)
; externip и localnet используются при общении
; с SIP-провайдерами, где мы зарегистрированы
; Можно добавить несколько локальных сетей (localnet).
; Ниже перечислены "стандартные" локальные сети:
 
;localnet=192.168.0.0/255.255.0.0;
;localnet=10.0.0.0/255.0.0.0    ;
;localnet=172.16.0.0/12        ; 
;localnet=169.254.0.0/255.255.0.0 ;
 
;-------------------------------------------------------------------
; user и peer имеют различные наборы настроек. friend может использовать
; все нижеперечисленные настройки
;
; настройки user:            настройки peer:
; --------------------        -------------------
; context                    context
; permit                      permit
; deny                        deny
; secret                      secret
; md5secret                  md5secret
; dtmfmode                    dtmfmode
; canreinvite                canreinvite
; nat                        nat
; callgroup                  callgroup
; pickupgroup                pickupgroup
; language                    language
; allow                      allow
; disallow                    disallow
; insecure                    insecure
; trustrpid                  trustrpid
; progressinband              progressinband
; promiscredir                promiscredir
; callerid
; accountcode
; amaflags
; incominglimit
; restrictcid
;                            mailbox
;                            username
;                            template
;                            fromdomain
;                            regexten
;                            fromuser
;                            host
;                            mask
;                            port
;                            qualify
;                            defaultip
;                            rtptimeout
;                            rtpholdtimeout
 
; Ниже приведены примеры настроек различных узлов: user, peer, friend
;[sip_proxy]
; Только для входящих звонков
;type=user
;context=from-fwd
 
;[sip_proxy-out]
;type=peer                     
; только для исходящих звонков
 
;secret=guessit
;username=yourusername         
 
; имя пользователя для аутентификации на SIP-прокси
 
;fromuser=yourusername         
 
; многие SIP-провайдеры требуют наличия этого поля!
 
;host=box.provider.com
 
;[grandstream1]
;type=friend                   
 
; либо "friend" (peer+user), либо "peer", либо "user"
 
;context=from-sip
;fromuser=grandstream1         
 
; если не задан, используется callerid
;callerid=John Doe
 
;host=192.168.0.23             
 
; у нас статический IP
;nat=no   
                   
; между телефоном и Asterisk'ом нет NAT'а
 
;canreinvite=yes               
 
; разрешить "проксирование" голосового RTP трафика
 
;dtmfmode=info                 
 
; режим тонального набора
 
;incominglimit=1               
 
; разрешить только один исх. звонок
; с телефона на Asterisk
 
;mailbox=1234@default 
; голосовая почта 1234 в контексте "default"
 
;disallow=all                 
; запрещаем все кодеки, чтобы потом определить разрешенные (allow)
 
;allow=ulaw       
           
; Замечание: в секции с type=user порядок кодеков
; не учитывается
 
;allow=alaw
;allow=g723.1
;allow=g729
; .....
 
Для примера рассмотрим самый простой случай: у нас есть два ip-телефона, и необходимо звонить с одного на другой, используя номера 101 и 102. sip.conf в этом случае может выглядить так:
 
[general]
 
port=5060                     
bindaddr=0.0.0.0             
srvlookup=yes                                               
language=en                                                   
dtmfmode=RFC2833
promiscredir = no 
nat=no
 
disallow=all
allow=alaw       
 
[101]
host=dynamic
context=default
type=friend
username=101
nat=no
secret=secret101
callerid=phone1 <101>
 
[102]
host=dynamic
context=default
type=friend
username=102
nat=no
secret=secret102
callerid=phone2 <102>
 
В настройках телефонов нужно указать точно такие же имя пользователя и пароль. Кроме того, в extensions.conf нужно определить соответсвующие экстеншены в контексте default.
Например, так:
 
;... skipped ...
[default]
exten => 101,1,Dial(SIP/101)
exten => 102,1,Dial(SIP/102)
... skipped ...
 
Теперь, запустив Asterisk и убедившись, что оба телефона успешно зарегистрировались, можно смело набирать номер.
 
Подключение аналоговых телефонов
 
(Раздел в разработке)
 
3.1.2 Подключение внешних каналов
 
В первую очередь необходимо установить математическое обеспечение (драйверы) той системы сигнализации которую использует Ваш провайдер внешнего телефонного канала.
 
H.323
 
Существуют две распространенные реализации H323 драйвера для asterisk: h323, входящий в состав дистрибутива asterisk, и oh323, который разрабатывается InAccess Networks (http://www.inaccessnetworks.com/projects/asterisk-oh323). До сих пор идут споры о том, какой драйвер лучше использовать. Первым появился oh323. Он считается более стабильным в работе, в нем, в отличии от h323, реализован буфер для устранения дрожания. Для передачи используется RTP/RTCP стэк. В то же время h323 гораздо более производительный (загрузка ЦП может быть в 10-15 раз меньше, чем при использовании oh323 на тех же потоках).
 
Оба модуля имееют подробные интструкции по установке. Единственное, на что следует обратить особое внимание, это требование к библиотекам pwlib и openh323, необходимым для сборки драйвера: они должны быть в точности такими, как указано в инструкции по установке. При установке asterisk'а h323 по умолчанию не собирается. Нужно перейти в директорию asterisk-1.0.9/channels/h323/ и последовательно выполнить все инструкции из README. Если же вы решили использовать oh323, то необходимо предварительно скачать его исходники.
 
Рассмотрим для примера установку asterisk-oh323-0.6.5. Согласно инструкции нам потребуются библиотеки pwlib (v1.6.6) и openh323 (v1.13.5). Необходимые файлы можно взять здесь.
 
#tar -zxf pwlib-v1_6_6-src.tar.gz
#tar -zxf openh323-v1_13_5-src.tar.gz
#tar -zxf asterisk-oh323-0.6.5.tar.gz
#export PWLIBDIR="`pwd`/pwlib"
#export OPENH323DIR="`pwd`/openh323"
#export LD_LIBRARY_PATH="$PWLIBDIR/lib:$OPENH323DIR/lib"
#cd pwlib/
#./configure
#make
#cd ../openh323/
#patch -p1 < ../asterisk-oh323-0.6.5/openh323_1.13.5-make.patch
#./configure
#make opt
 
В этом месте компиляции может случиться конфуз (Fedora Core 3, gcc-3.4.2, glibc-2.3.3):
 
gkserver.h:434: error: `virtual H323Transaction::Response H323GatekeeperRRQ::OnHandlePDU()' is protected
gkserver.h:1946: error: within this context
 
 
В этом случае нужно отредактировать файл include/gkserver.h, закомментировав строку 433:
 
  H225_RegistrationReject  & rrj;
 
//  protected:
    virtual Response OnHandlePDU();
};
 
Далее:
 
#cd ../asterisk-oh323-0.6.5/
 
Нужно отредактировать Makefile, указав пути к pwlib, openh323 и asterisk в соответствии с вашими настройками. Например, на демонстрационном стенде это выглядит так:
 
#...skipped...
PWLIBDIR=/usr/local/src/pwlib
#...skipped...
OPENH323DIR=/usr/local/src/openh323
#...skipped...
ASTERISKINCDIR=/usr/local/src/asterisk-1.0.9/include
 
Все остальное по умолчанию.
 
#make
#make install
 
Проследите, чтобы директория /usr/local/lib была добавлена в /etc/ld.so.conf, и запустите ldconfig. Теперь, после запуска asterisk'а нам будет доступен канал OH323. Конфигурационный файл для него - /etc/asterisk/oh323.conf. Выглядит он, приблизительно, следующим образом:
 
; Файл конфигурации OpenH323 драйвера
;
 
;-----------------------------------------
; Основные настройки
; (порты, буфер дрожания, гейткипер, ...)
;-----------------------------------------
[general]
;
; Прослушиваемый адрес для входящих подключений.
; По умолчанию - слушать на всех интерфейсах.
;
listenAddress=0.0.0.0
;
; Прослушиваемый порт.
; По умолчанию 1720.
;
listenPort=1720
;
; Порт для удаленного подключения.
; (Используется только при отсутствии гейткипера)
; Значение по умолчанию - 1720.
;
connectPort=1720
;
; Диапазон используемых TCP портов
;
tcpStart=10000
tcpEnd=20000
;
; диапазон используемых UDP портов
; Замечание: диапазон портов, используемых RTP
; настраивается в "rtp.conf"
 
udpStart=10000
udpEnd=20000
;
; включить "быстрый старт" (yes,no).
;
fastStart=yes
;
; разрешить H.245 туннелирование (yes,no).
;
h245Tunnelling=no
;
; разрешить early H.245 сообщения на этапе инициализации звонка.
;
h245inSetup=no
;
; разрешить in-band-DTMF.
; (замечание: Netmeeting использует именно in-band DTMF)
;
inBandDTMF=no
;
; Не передавать тишину.
;
silenceSuppression=no
;
; Настройки буфера дрожания (в миллисекундах, 20...10000).
;
jitterMin=20
jitterMax=100
;
; Установить флаг "тип сервиса" в ip пакетах для RTP траффика.
; Возможные значения:
;  lowdelay, throughput, reliability, mincost, none
;
ipTos=none
;
; Максимальное число входящих/исходящих/одновременных
; H.323 подключений.
;
outboundMax=10
inboundMax=10
simultaneousMax=10
;
; Пропускная способность H.323 соединений.
; Значение задается в Кбит/с.
;
;bandwidthLimit=1024
;
; Настройки лога
; В качестве libTraceFile можно задать либо стандарный вывод 'stdout',
; либо полный путь к лог-файлу
;
wrapLibTraceLevel=1
libTraceLevel=0
libTraceFile=/var/log/asterisk/oh323.log
;
; Настройки гейткипера.
; Допустимые значения:
;  DISABLE - отключен
;  DISCOVER - автоопределение
;  < DNS имя гейткипера >,
;  < ip гейткипера >,
;  GKID:<идентификационный номер гейткипера>
;
gatekeeper=DISABLE
;
; Установить пароль для гейткипера
;
;gatekeeperPassword=secret
;
; Таймаут регистрации на ГК
;
gatekeeperTTL=600
;
; Режим отправки ввода пользователя
; Допустимые значения:
;  Q931        -  Q.931 Keypad Information Element
;  STRING      -  H.245 string
;  TONE        -  H.245 tone
;  RFC2833    -  RFC2833
;
userInputMode=RFC2833
;
; флаги AMA (автоматический учет стоимости)
; возможные значения: default, omit, billing, documentation
;
amaFlags=billing
;
; Имя для эккаунтинга
;
accountCode=H323
;
; контекст по умолчанию для H.323 звонков.
;
context=h323-incoming
 
;-----------------------------------------
; Настройки H.323 алиасов (синонимов), префиксов и
; привязка к контекстам ASTERISK
;-----------------------------------------
[register]
;
; алиасы/префиксы, связанные с контекстом по умолчанию,
; определенном в разделе  [general].
;
alias=asterisk
alias=123
;
; алиасы/префиксы, попадающие в контекст "all-aliases".
;
context=all-aliases
alias=ASTERISK
alias=666
;
; алиасы/префиксы, попадающие в контекст "more-aliases".
;
context=more-aliases
alias=665
;
; алиасы/префиксы, попадающие в контекст "all-prefixes".
;
context=all-prefixes
gwprefix=00
gwprefix=01
;
; алиасы/префиксы, попадающие в контекст "more-stuff".
;
context=more-stuff
alias=664
gwprefix=02
 
;-----------------------------------------
; Настройки, относящиеся к кодекам
;-----------------------------------------
[codecs]
;
; Определение списка доступных кодеков.
; Каждая опция "codec" может иметь связанную с ней настройку "frames"
; Допустимые значения опции "codec":
;  G711U      -  G.711 u-Law
;  G711A      -  G.711 A-Law
;  G7231      -  G.723.1(6.3k)
;  G72316K3    -  G.723.1(6.3k)
;  G72315K3    -  G.723.1(5.3k)
;  G7231A6K3  -  G.723.1A(6.3k)
;  G7231A6K3  -  G.723.1A(6.3k)
;  G726        -  G.726(32k)
;  G72616K    -  G.726(16k)
;  G72624K    -  G.726(24k)
;  G72632K    -  G.726(32k)
;  G72640K    -  G.726(40k)
;  G728        -  G.728
;  G729       -  G.729
;  G729A      -  G.729A
;  G729B      -  G.729B
;  G729AB      -  G.729AB
;  GSM0610    -  GSM 0610
;  MSGSM      -  Microsoft GSM Audio Capability
;  LPC10      -  LPC-10
; Количество фреймов в RTP пакете (если не задано явно) равно 1.
codec=G711A
frames=20
 
;codec=GSM0610
;frames=4
;codec=G729
;frames=2
;codec=G7231
;frames=2
 
3.1.2.1 Через DialPeer провайдера VoIP используя обычный IP канал
 
(Раздел в разработке)
 
3.1.2.2 Через аналоговые карты Digium
 
(Раздел в разработке)
 
3.1.2.3 Через цифровые карты E1 потока Digium или аналогичные
 
(Раздел в разработке)
 
3.2 Установка RADIUS плагина для Asterisk. Взаимодействие с LANBilling VoIP RADIUS агентом (выполняет функции сервера RADIUS).
 
 
  RADIUS модуль, о котором пойдет речь, основан на клиенте от PortaOne.
Он представляет из себя два perl-скрипта для аутентификации и эккаунтинга и набор патчей для asterisk'а. Все же имеются существенные отличия от оригинальной версии, поэтому есть смысл подробно описать все шаги установки, влючая те, что уже описаны в документе по вышеприведенной ссылке.
Итак, для начала, что позволяет этот модуль.
 
    Аутентификация.
        Есть возможность SIP Digest аутентификации (Draft RADIUS digest-auth) и PAP (rfc 2138). Второй метод удобно использовать для организации карточной платформы, либо для аутентификации узлов, не поддерживающих протокол SIP (для примера см. agi-card.agi)
        Запрос к RADIUS'у можно послать только при инициации звонка, так как на этапе регистрации телефона(софтфона) на asterisk'е последний не может обратиться к RADIUIS серверу (разработчиками не была предусмотрена такая возможность), поэтому здесь проверку подлинности осуществляет сама PBX.
        Имеется возможность задавать индивидуальные настройки RADIUS сервера для различных расширений в dialplan'е (extensions).
        По умолчанию происходит разрыв соединения в случае неудачной аутентификации. Если RADIUS возвращает атрибут Session-Timeout или h323-credit-time (cisco VSA), то по истечении указанного времени также происходит автоматический разрыв соединения.
    Эккаунтинг.
        Отсылаютя стартовый, промежуточные и завершающий эккаунтинг пакеты. Можно настроить интервал отсылки промежуточных (alive) пакетов.
        Существенным ограничением является отсутсвие возможности эккаунтинга для неаутентифицированных звонков.
    Достоинства.
        При общении с RADIUS сервером используются cisco VSA, что гарантирует совместимость со многими биллинговыми системами (в том числе LANBilling)
        Модуль целиком написан на языке perl, поэтому он легко может быть расширен и доработан для обеспечения требуемого функционала
    Недостатки.
        Аутентификация и эккаунтинг осуществляются независимым образом двумя различными процессами. На администратора ложится задача мониторинга этих двух процессов помимо самой PBX для поддержания работоспособности узла.
        Интеграция с asterisk ограничена средствами manager API и AGI интерфейса.
 
 
Установка.
 
    Для asterisk-1.0.x необходим патч, реализующий dialplan-приложение SIPGetHeader. В asterisk-1.2 соответсвующий код уже включен (следите за changelog'ом, т.к. он неоднократно модифицировался), поэтому если Вы используете версию 1.2, можете пропустить этот пункт.
    На момент написания статьи последней стабильной версией asterisk была 1.0.9. Ниже речь будет идти именно о ней.
    Необходимый патч можно взять здесь.
    Применяем патч и пересобираем asterisk:
 
    #cp patch-chan_sip.c-1.0.9 asterisk-1.0.9
    #cd asterisk-1.0.9/
    #patch -p0 < patch-chan_sip.c-1.0.9
    #make clean && make && make install
   
 
    Устанавливаем необходимые perl-модули
 
    #perl -MCPAN -e shell
 
    cpan>install Crypt::CBC
    cpan>install Crypt::DES
    cpan>install Digest::MD5
    cpan>install Authen::Radius
    cpan>q
   
 
      Также нам потребуется asterisk-perl, взять который можно здесь или здесь.
 
    #tar -zxf asterisk-perl-0.08.tar.gz
    #cd asterisk-perl-0.08/
    #perl Makefile.PL
    #make all
    #make install
   
 
    Скачиваем RADIUS клиент radiusclient.tar.gz или radiusclient-1.4.tar.gz(для asterisk-1.4.x) и распаковываем архив:
 
    #tar -zxf radiusclient.tar.gz
   
 
    Копируем agi-rad-auth.agi в директорию, определяемую переменной astagidir из asterisk.conf (по умолчанию /var/lib/asterisk/agi-bin):
 
    #cp agi-rad-auth.agi /var/lib/asterisk/agi-bin/
   
 
    Копируем ast-rad-acc.pl в любую удобную директорию:
 
    #cp ast-rad-acc.pl /usr/sbin/
   
 
    Запуск скрипта ast-rad-acc.pl следует включить в автозагрузку сиситемы. Лучше всего запускать его вместе с asterisk, добавив в стартовый скрипт для asterisk строчки, которые будут запускать и останавливать этот демон. Однако запускать его пока рано...
 
    Теперь, собственно, настройка asterisk.
    Нам потребуется отредактировать ряд конфигурационных файлов, которые по умолчанию находятся в /etc/asterisk/
    modules.conf
    Добавьте загрузку модуля res_agi.so:
 
    load => res_agi.so
   
 
 
    manager.conf
    Необходимо добавить менеджера для подключения эккаунтинг-модуля.
    Пример:
 
    enabled =yes
    port = 5038
    bindaddr = 127.0.0.1
    secret = test
    permit= 127.0.0.1
    [test]
    secret = test
    permit= 127.0.0.1
    read = system,call,log,verbose,command,agent,user
    write = system,call,log,verbose,command,agent,user
   
 
    Замечание: логин и пароль для менеджера прописаны в скрипте ast-rad-acc.pl (по умолчанию test/test). Если в manager.conf используются другие параметры доступа, то скрипт необходимо отредактировать.
 
    sip.conf
    В настройках peer'а, для которого планируется использовать SIP-аутентификацию, нужно указать 'externalauth=yes'. Также удобно определить общий контекст для таких пользователей: 'context=sip_auth'
    Пример:
 
    [123]
    type=friend
    username=123
    secret=123
    context=sip_auth
    callerid=123
    host=dynamic
    nat=no
    canreinvite=no
    externalauth=yes
   
 
 
    extensions.conf
 
    В разделе [globals] определяются глобальные настройки RADIUS сервера: ip,порты аутентификации и эккаунтинга, разделяемый секрет и интервал отсылки промежуточных пакетов эккаунтинга (0 - отменяет alive пакеты). Далее нужно создать контекст [sip_auth], упомянутый в sip.conf
    Пример:
 
    [general]
    static=yes
    writeprotect=no
 
    [globals]
    RADIUS_Server=127.0.0.1
    RADIUS_Secret=secret
    RADIUS_Auth_Port=34009
    RAIUS_Acct_Port=34008
    Acct_Update_Timeout=60
    NAS_IP_Address=127.0.0.1
 
    [sip_auth]
    exten => _X.,1,SIPGetHeader(SIP_Authorization=Proxy-Authorization)
    exten => _X.,2,AGI(agi-rad-auth.pl|AuthMode=SIP)
    exten => _X.,3,Goto(default,${DNID},1)
    exten => _X.,4,Hangup()
 
    [default]
    ; ... skipped ...
   
 
 
    Вызов скрипта аутентификации.
      Скрипт, выполняющий аутентификацию (agi-rad-auth.agi), является AGI-приложением и вызывается в dialplan'е следующим образом:
 
    AGI(agi-rad-auth.pl|Var1=Value1&Var2=Value2&...)
   
 
    В параметрах можно передавать ряд переменных:
    AuthMode=SIP|Account|AuthOnly - Тип аутентификации
      SIP cоответсвует SIP-аутентификации. Для ее использования необходимо предварительно вызвать SIPGetHeader следующим образом:
 
    SIPGetHeader(SIP_Authorization=Proxy-Authorization)
   
 
      Account - метод по умолчанию. Здесь просто проверяется имя пользователя и пароль, которые также передаются в параметрах (см. ниже).
      AuthOnly - от метода Account отличается тем, что RADIUS в этом случае не будет создавать сессию с последующим эккаунтингом: просто проверяется логин, пароль и возвращается accept либо reject. Используется для "промежуточных" запросов при реализации карточной платформы (см. пример agi-card.agi).
    Username=[username],
    Password=[password] - cоответсвенно имя пользователя и пароль. Используется в методах Account и AuthOnly.
    IfFailed=DoNotHangup - Не разрывать соединения при неудачной аутентификации. Можно проанализировать возвращаемый RADIUS'ом статус для ответа абоненту, используя IVR.
 
      После завершения RADIUS клиентом устанавливаются следующие переменные, которые можно использовать в dialplan'е:
        SIP_Username - Имя пользователя, получаемое от клиента при SIP-аутентификации.
        RADIUS_Status - Содержит ответ RADIUS сервера. Возможные значения:
          Accept - аутентификация прошла успешно
          Reject - доступ запрещен
          NoResponce - сервер не отвечает на запрос
          ConfigurationError - не получен SIP Header, необходимый для SIP аутентификации
        Все атрибуты, возвращаемые RADIUS сервером, например
        Session-Timeout
        h323-credit-time
        h323-credit-amount
        h323-currency
 
    Для корректной работы RADIUS клиента необходим словарь (radius dictionary), расположенный в /etc/raddb/. Этот словарь, устанавливаемый по умолчанию вместе с perl модулем Authen::Radius, нуждается в исправлении, так как в нем не хватает некоторых необходимых атрибутов. Работающий пример можно взять здесь.
 
    Теперь можно запускать asterisk либо стартовым скриптом, либо вручную (при этом не забыв про ast-rad-acc.pl). При запуске среди активных процессов вы должны увидеть, примерно, следующее:
 
    #ps ax | grep ast
    19629 ?        Ssl    0:00 asterisk
    19759 ?        S      0:26 /usr/bin/perl /usr/sbin/ast-rad-acc.pl
   
 
    Настройка RADIUS сервера - VoIP агента LBircd
 
    Процесс установки и настройки АСР LANBilling описан в документации.
    В настройках агента нужно не забыть указать ip адрес NAS'a (в данном случае это ip адрес сервера, на котором установлен asterisk) и разделяемый секрет. На этапе отладки и тестирования рекомендуется также установить подробную детализацию лога ("Уровень детализации журнала событий" = 3). Затем создать учетные записи с логинами и паролями, указанными в sip.conf в настройках соответсвующего peer'а. Для автоматизации этого процесса (заведение peer'а при создании учетной записи в биллинге) нужно использовать скрипты vg.create, vg.delete, vg.edit которые запускаются соответственно при создании, удалении и редактировании учетной записи. В параметрах этим скриптам передаются логин, пароль и присвоенный телефонный номер учетной записи. Пример скрипта для редактирования sip.conf можно взять здесь.
    Процесс добавления/удаления SIP-пользователя в asterisk заметно упрощается, если для хранения настроек вместо текстового файла используется база данных (см. Конфигурация из БД).
 
    Если все настроено верно, то теперь исходящие звонки с телефонов, работающих по протоколу SIP, должны успешно аутентифицироваться на RADIUS сервере. Во время звонка, посмотрев "Активные сессии" в административном интерфейсе LANBilling, Вы должны увидеть текущее соединение. По окончании звонка он удаляется из активных сессий, и в статистике появится соответсвующая запись. Если что-то не получилось, нужно анализировать логи на предмет возникших в процессе ошибок.
    Ниже приведен лог успешного соединения
 
    lbircd.log
 
    Mon Oct  3 19:15:19 2005, Info: Header->Code: 1,
    Header->Identifier: 216, Header->Length: 258
    Attribute NAS_IP_ADDRESS = 127.0.0.1
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 2.
    AVPair = "SIP/777-1098".
    Info: Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 1.
    AVPair = "call-id=1128352518.2".
    Attribute CALLING_STATION_ID = 777
    Attribute CALLED_STATION_ID = 7720863
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 24.
    AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
    Attribute USER_NAME = '777'
    Attribute DIGEST_ATTRIBUTES
    Attribute DIGEST_ATTRIBUTES
    Attribute DIGEST_ATTRIBUTES
    Attribute DIGEST_ATTRIBUTES
    Attribute DIGEST_ATTRIBUTES
    Attribute DIGEST_ATTRIBUTES
    Attribute DIGEST_RESPONSE
    Create Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6,
    Session-num: 0
 
    Info: SELECT above,call_mode,cat_number,free_seconds,round_seconds
    FROM tarifs WHERE tar_id=4
    Passed: above=5, call_mode=0, cat_number=0
    ANI User: 1 (phone=777)
    xpgk-ep-number=777
    Access granted USER=777, Phone=7720863, h323-credit-time=18000
    Authentication answer sent successfully
 
    Packet received from 127.0.0.1, size: 327
    Header->Code: 4, Header->Identifier: 104, Header->Length: 327
    Attribute ACC_STATUS_TYPE = '1'
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 25.
    AVPair = "h323-setup-time=15:15:18.000 UTC Mon Oct  3 2005".
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 27.
    AVPair = "h323-call-type=VoIP".
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 26.
    AVPair = "h323-call-origin=answer".
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 31.
    AVPair = "h323-voice-quality=0".
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 1.
    AVPair = "session-protocol=sipv2".
    Attribute VENDOR_SPECIFIC
    Info: Cisco Voice-Specific VSA. VSA number = 1.
    AVPair = "call-id=1128352518.2".
    Attribute NAS_IP_ADDRESS = 127.0.0.1
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 2.
    AVPair = "SIP/777-1098".
    Attribute USER_NAME = '777'
    Attribute CALLING_STATION_ID = 777
    Attribute CALLED_STATION_ID = 7720863
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 24.
    AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
    Accounting START USER=777, Phone=7720863, h323-credit-time=0,
    h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6
    Get Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6,  
    Session-num: 0
    Accounting answer sent successfully
 
 
    Packet received from 127.0.0.1, size: 127
    Header->Code: 4, Header->Identifier: 105, Header->Length: 127
    Attribute ACC_STATUS_TYPE = '3'
    Attribute NAS_IP_ADDRESS = 127.0.0.1
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 2. AVPair = "SIP/777-1098".
    Attribute USER_NAME = '777'
    Attribute CALLING_STATION_ID = 777
    Attribute CALLED_STATION_ID = 7720863
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 24.
    AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
    Accounting UPDATE USER=777, Phone=7720863, h323-credit-time=0,
    h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6
    Get Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6,
    Session-num: 0
    Accounting answer sent successfully
 
 
    Packet received from 127.0.0.1, size: 397
    Header->Code: 4, Header->Identifier: 106, Header->Length: 397
    Attribute ACC_STATUS_TYPE = '2'
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 25.
    AVPair = "h323-setup-time=15:15:18.000 UTC Mon Oct 3 2005".
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 28.
    AVPair = "h323-connect-time=15:15:18.000 UTC Mon Oct 3 2005".
    Time zone is UTC
    Time understanded as Mon Oct 3 19:15:18 2005
 
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 29.
    AVPair = "h323-disconnect-time=15:16:13.000 UTC Mon Oct 3 2005".
    Time zone is UTC
    Time understanded as Mon Oct  3 19:16:13 2005
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 30.
    AVPair = "h323-disconnect-cause=0".
    Attribute ACC_SESSION_TIME = 55
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 1.
    AVPair = "session-protocol=sipv2".
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 1.
    AVPair = "call-id=1128352518.2".
    Attribute NAS_IP_ADDRESS = 127.0.0.1
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 2.
    AVPair = "SIP/777-1098".
    Attribute USER_NAME = '777'
    Attribute CALLING_STATION_ID = 777
    Attribute CALLED_STATION_ID = 7720863
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 24.
    AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
    Get Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6,
    Session-num: 0
 
    delete from sessionsradius where id=1 and
    session_id='0B26C680 B73367FC 27D5214A 71D01BB6'
    Accounting STOP USER=777, Phone=7720863, h323-credit-time=0,
    h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6
    Mon Oct 3 19:16:13 2005, Info: Accounting answer sent successfully
   
 
    asterisk -rvvv
 
    -- Executing SIPGetHeader("SIP/777-1098",
    "SIP_Authorization=Proxy-Authorization") in new stack
    -- Executing AGI("SIP/777-1098", "agi-rad-auth.agi|Mode=SIP")
    in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/agi-rad-auth.agi
    --  agi-rad-auth.agi|Mode=SIP: AGI Environment Dump:
    --  agi-rad-auth.agi|Mode=SIP:  -- accountcode =
    --  agi-rad-auth.agi|Mode=SIP:  -- callerid = 777 <777>
    -- agi-rad-auth.agi|Mode=SIP: -- channel = SIP/777-1098
    --  agi-rad-auth.agi|Mode=SIP:  -- context = sip_auth
    --  agi-rad-auth.agi|Mode=SIP:  -- dnid = 7720863
    --  agi-rad-auth.agi|Mode=SIP:  -- enhanced = 0.0
    --  agi-rad-auth.agi|Mode=SIP:  -- extension = 7720863
    --  agi-rad-auth.agi|Mode=SIP:  -- language = en
    --  agi-rad-auth.agi|Mode=SIP:  -- priority = 2
    --  agi-rad-auth.agi|Mode=SIP:  -- rdnis = unknown
    --  agi-rad-auth.agi|Mode=SIP:  -- request = agi-rad-auth.agi
    --  agi-rad-auth.agi|Mode=SIP:  -- type = SIP
    --  agi-rad-auth.agi|Mode=SIP:  -- uniqueid = 1128352518.2
    --  agi-rad-auth.agi|Mode=SIP: RADIUS server response type = 2
    --  agi-rad-auth.agi|Mode=SIP:
    attr: name=h323-credit-time value=18000
    --  agi-rad-auth.agi|Mode=SIP:
    attr: name=Session-Timeout value=18000
    --  agi-rad-auth.agi|Mode=SIP:
    attr: name=h323-credit-amount value=963.73
    --  agi-rad-auth.agi|Mode=SIP:
    attr: name=h323-currency value=USD
    --  agi-rad-auth.agi|Mode=SIP:
    attr: name=Cisco-AVPair value=xpgk-ep-number=777
    -- AGI Script Executing Application: (UserEvent)
    Options: (_SIP_Auth|User-Name: 777)
    -- AGI Script Executing Application: (UserEvent)
    Options: (_SIP_Auth|DNID: 7720863)
    -- AGI Script agi-rad-auth.agi completed, returning 0
    -- Executing Goto("SIP/777-1098", "default|7720863|1")
    in new stack
    -- Goto (default,7720863,1)
    -- Executing Dial("SIP/777-1098", "SIP/out/7720863|30|tr")
    in new stack
    -- Called out/7720863
    -- SIP/out-e234 is ringing
    -- SIP/out-e234 answered SIP/777-1098
    -- Attempting native bridge of SIP/777-1098 and SIP/out-e234
    == Spawn extension (default, 7720863, 2) exited non-zero on
    'SIP/777-1098'
   
 
 
    Как быть с телефонами, не поддерживающими стандарт SIP?
    Можно использовать метод Account при вызове agi-rad-auth.agi. При этом в биллинге должна быть создана учетная запись с присвоенным телефонным номером(номерами), тогда эту учетную запись можно аутентифицировать по АОН:
 
    AGI(agi-rad-auth.agi|Mode=Account&Username=${CALLERID})
   
 
    Если в настройках учетной записи задана опция пароль для АОН, то нужно передать еще параметр Password=[password].
 
 
    Пример использования RADIUS клиента для реализации карточной платформы - agi-card.agi
    В примере используются звуковые файлы из asterisk-sounds-1.0.9. Данный скрипт пытается аутентифицировать звонящего по АОН. В случае неудачи запрашивается номер карты и пин. Затем, в случае успеха, сообщается баланс и запрашивается телефонный номер, на который желаете позвонить. После подтверждения объявляется максимальная продолжительность звонка, и скрипт завершается, установив переменную ${DNID2} с набранным номером.
    Пример extension.conf:
 
    [card_platform]
    exten => s,1,Wait(1)
    exten => s,2,Answer()
    exten => s,3,AGI(agi-card.agi)
    exten => s,4,Dial(SIP/${DNID2}@voip.my_provider.com,20)
    exten => s,5,Hangup()
    exten => t,1,Playback(number-not-answering)
    exten => t,2,Hangup()
   
 
 
Совет:
Если во время работы в консоли постоянно появляются сообщения типа
Odd number of elements in hash assignment at /usr/lib/perl5/site_perl/5.8.5/Asterisk/Manager.pm line 330,
нужно отредактировать модуль Manager.pm, заменив строку 330
 
my %resp = map { split(': ', $_); } $self->read_response;
 
следующей конструкцией:
 
my %resp;
foreach ($self->read_response){
  my ($a,$b) = split(': ',$_);
  $resp{$a} = $b;
}
взято тут:[http://www.lanbilling.ru/asterisk_solution.html статья]
<hr style="noshade; size=2px;">
 
=='''ПРОБЛЕМЫ И РЕШЕНИЯ'''==
 
* '''Uhhuh. NMI received for unknown reason 20 on CPU 0.'''
* '''Решение:'''
# cat /etc/modprobe.d/nmi-watchdog-blacklist.conf
...
blacklist iTCO_wdt
blacklist iTCO_vendor_support
...
edit /etc/default/grub
  ...
#
#GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="ro quiet nmi_watchdog=0 pcie_aspm=off idle=nomwait"
...
# update-grub
end
#reboot
 
=='''ПОЛЕЗНОЕ'''==


* [http://habrahabr.ru/post/158057/ asterisk FreePBX]
'''Источники:'''
* [http://habrahabr.ru/post/154933/ Настройка Asterisk 1.8 + FreePBX 2.10 с нуля]
* [http://www.voxlink.ru/download/freepbx/ портал FreePBX]
* [https://serveradmin.ru/ustanovka-asterisk-13-na-debian-8/ Установка Asterisk 13 на Debian 8]
* [https://jakondo.ru/ustanovka-asterisk-16-na-debian-9-stretch/ Установка Asterisk 16 на Debian 9 Stretch]
* [https://serveradmin.ru/ustanovka-freepbx-na-debian-ubuntu/ Установка Asterisk + Freepbx на Debian/Ubuntu]
<hr>
<hr>
* [https://serveradmin.ru/nastroyka-servera-telefonii-asterisk-s-nulya/ Asterisk — SIP АТС для офиса, пошаговая инструкция по настройке с нуля]
* [http://manpages.ubuntu.com/manpages/trusty/man5/bridge-utils-interfaces.5.html man brige]
* [https://zen.yandex.ru/media/id/5d90d329433ecc00b139a5ba/ustanovka-asterisk-16-na-debian-10-pod-kliuch-5da620bbdf944400b19c76ea Установка Asterisk 16 на Debian 10]
* [https://forum.linux.by/viewtopic.php?p=64844 взято тут]
* [https://wiki.freepbx.org/display/FOP/Installing+FreePBX+15+on+Debian+9.6 Installing FreePBX 15 on Debian 9.6]
* [http://xgu.ru/wiki/Linux_Bridge еще статья]
* [https://jakondo.ru/ustanovka-freepbx-14-v-svyazke-s-asterisk-16-na-debian-9-stretch/ Установка FreePBX 15 с Asterisk 16 на Debian 9.6]
* [https://habr.com/ru/post/151011/ Поднимает телефонию с нуля: Asterisk, FreePBX, GSM-шлюз на Huawei E173 в Debian]

Текущая версия от 16:58, 3 сентября 2017

Бридж (англ. bridge, мост) - это способ соединения двух сегментов Ethernet на канальном уровне, т.е. без использования протоколов более высокого уровня, таких как IP. Пакеты передаются на основе Ethernet-адресов, а не IP-адресов (как в маршрутизаторе). Поскольку передача выполняется на канальном уровне (уровень 2 модели OSI), все протоколы более высокого уровня прозрачно проходят через мост.

Термины коммутатор, мост и бридж могут использоваться на данной странице как взаимознаменяемые.

Код bridge в Linux является частичной реализацией стандарта ANSI/IEEE 802.1d. Впервые бриджинг в Linux появился в 2.2, затем код был переписан Леннертом Буйтенхеком (Lennert Buytenhek). Код bridge интегрирован в ядра серий 2.4 и 2.6. Железо - Intel Pentum 133 - RAM 32 mb - hdd 1024 mb - 2 сетевые карты 100 Mbps или 1000 Mbps (можно и больше, но желательно одинаковые).

Установка ПО Ставим Linux Debian с минимумом пакетов, сеть не настраиваем. После установки Debian ставим несколько необходимых пакетов:

Код:

# apt-get mc
# apt-get install bridge-utils
# apt-get install iproute
# apt-get install iftop
# apt-get install bmon
# apt-get install openssh-server
# apt-get install iperf


Настройка моста Узнаем где наши сетевые карты Код:

# ifconfig
eth1      Link encap:Ethernet  HWaddr 00:19:5B:88:B2:85
          inet6 addr: fe80::219:5bff:fe88:c287/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3871824 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4707022 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1031462268 (983.6 MiB)  TX bytes:1375550080 (1.2 GiB)
          Interrupt:10 Base address:0x6200

eth2      Link encap:Ethernet  HWaddr 00:19:5B:88:C7:86
          inet6 addr: fe80::219:5bff:fe88:c288/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4707923 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3855788 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1377378066 (1.2 GiB)  TX bytes:1020322438 (973.0 MiB)
          Interrupt:9 Base address:0x6300

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:56 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4396 (4.2 KiB)  TX bytes:4396 (4.2 KiB)

Настройки сети в Linux Debian находятся в файле /etc/network/interfaces У меня на мосте он имеет такой вид: Код:

  1. The loopback network interface
auto lo
iface lo inet loopback


Создаём скрипт /etc/network/if-up.d/bridge Код:

#!/bin/sh
  1. Чистим настройки от предыдущего запуска скрипта
ifconfig br0 down # Отключаем интерфейс моста
ifconfig eth1 down # Отключаем сетевую карту eth1
ifconfig eth2 down # Отключаем сетевую карту eth2
brctl delbr br0 # Удаляем имя моста
  1. Запускаем бридж
brctl addbr br0 # Задаём имя бриджу
brctl addif br0 eth1 # Указываем какие интерфейсы
brctl addif br0 eth2 # работают в режиме моста.

brctl stp br0 off # Отключаем режим STP

# brctl setfd br0 15 # Актуально только при
# brctl setageing br0 60 # использовании STP
  1. Задаём IP моста, для дальнейшего управления им через ssh
ifconfig br0 192.168.110.251 netmask 255.255.0.0 broadcast 192.168.255.255
  1. Удаляем IP сетевых карт
ifconfig eth1 0.0.0.0
ifconfig eth2 0.0.0.0
  1. Поднимаем интерфейсы сетевых карт и моста
ifconfig eth1 up
ifconfig eth2 up
ifconfig br0 up

В принципе мост готов к использованию, надо только перезагрузить компьютер или выполнить скрипт (не забудьте его сделать запускаемым от имени root 774 Код:

# chgrp root /etc/network/if-up.d/bridge
# chown root /etc/network/if-up.d/bridge
# chmod 774 /etc/network/if-up.d/bridge


Настройка маршрутизации

Может возникнуть необходимость указать с какой стороны находится тот или иной компьютер. Дописываем в наш скрипт следующие команды:

  1. Сообщаем что ip 192.168.110.200 находится со стороны eth1

Код:

route add -host 192.168.110.200 dev eth1
  1. Сообщаем что ip 192.168.88.250 находится со стороны eth2

Код:

route add -host 192.168.88.250 dev eth2
  1. Сообщаем мосту с какой стороны сеть 192.168.55.0/24 (255.255.255.0)

Код:

route add -net 192.168.55.0/24 dev eth1

После таких настроек ваш мост станет немного умнее. Теперь для проверки маршрутизации набираем команду: Код:

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.110.200 *               255.255.255.255 UH    0      0        0 eth1
192.168.88.250  *               255.255.255.255 UH    0      0        0 eth2
192.168.55.0     *               255.255.255.0     U     0      0        0 eth1
localnet        *               255.255.0.0     U     0      0        0 br0

Удалённое управление мостом

Входим на мост удалённо как пользователь root (под root лучше не работать): Код:

# ssh root@192.168.110.251


Теперь можно работать с мостом как с настольным компьютером в текстовом режиме.

Мониторинг и управление

  1. Удобная утилита для просмотра загрузки сети и мостаю

Код:

bmon
  1. Ещё не менее полезная утилита мониторинга сети

Код:

iftop -i br0
  1. инф. о сетевых интерфейсах

Код:

ifconfig
  1. поднять (убить) сетевой интерфейс

Код:

ifconfig eth1 up (down)
  1. инф. о мосте

Код:

brctl show
  1. таблица MAC-адресов моста

Код:

brctl showmacs br0
  1. ARP-таблица

Код:

arp -a
  1. Снифер

Код:

tcpdump host 192.168.110.100

Выдержка из man: NAME

      bridge-utils-interfaces - bridge-utils extensions for the interfaces(5)
      file format

DESCRIPTION

      /etc/network/interfaces  contains   network   interface   configuration
      information  for  the  ifup(8)  and  ifdown(8)  commands.  This manpage
      describes the bridge extensions  to  the  standard  interfaces(5)  file
      format.
      The  main  extension  is  the bridge_ports option, with it you describe
      that the interface is a bridge and what ports does it have. These ports
      are the interfaces that are part of the bridge, and they shouldn't have
      any stanzas defining them on  the  interfaces  file.  Other  extensions
      allow you to tune the bridge options or change a bridge behaviour.
      We'll see this with an example:
      auto br0
      iface br0 inet static
          address 192.168.1.2
          network 192.168.1.0
          netmask 255.255.255.0
          broadcast 192.168.1.255
          gateway 192.168.1.1
          bridge_ports all
      Well,  after  setting this, an ifup br0, or the next reboot, should let
      you have a bridge up and running, after waiting for the ports to get to
      the  forwarding  status,  of course. This bridge will be using all your
      ethX interfaces, as we have stated on the bridge_ports line.
      The Debian bridge setup scripts will wait for it to get ready to  work.
      They  do  this by trying to guess the maximum time that the bridge will
      need to get to the forwarding status, and by default,  they  will  wait
      for  the  bridge  to get there, or for the estimated maximum time to go
      by.  This is done so that the services that are loaded after the bridge
      setup  have  a  working  network  interface  and don't fail because the
      bridge is still not working. See bridge_maxwait if you want  to  change
      this behaviour.
      An  example  of  how  to  setup  a so called anonymous bridge (a bridge
      without an assigned IP) would look like this:
      iface br1 inet manual
           bridge_ports eth1 eth2
           bridge_maxwait 0
      Here we select the interfaces eth1 and eth2 to be added to  the  bridge
      interface  br1,  which  will  be  an anonymous bridge, we also tell the
      scripts not to wait, as we won't be having any service running on  that
      interface (it doesn't even have an IP).
      An example of a little more complex bridge setup could be:
      auto br0
      iface br0 inet static
          address 192.168.1.2
          network 192.168.1.0
          netmask 255.255.255.0
          broadcast 192.168.1.255
          bridge_ports all weird0
          bridge_bridgeprio 32767
          bridge_portprio eth0 129
          bridge_fd 5
      In  this  example we select all the eth* devices plus a weird device to
      be added to the bridge, also we change the bridge default priority to a
      higher  one  so  that  this  bridge  becomes  the root (if there are no
      bridges with higher priority on the net, that is)  and  also  we  lower
      priority  of  port eth0 so that it is not used if there are other ports
      with higher priority to reach the same destination, at the end we lower
      the default forward delay.
      If there is a need to set up any of the interfaces participating on the
      bridge and not the bridge itself, then we must add the commands to  set
      up  those  settings in a "pre-up" or "up" statement. This means that if
      we have a wireless card that we want to add to a bridge and we want  to
      set  it  to  master, and select the essid, instead of using the typical
      wireless_* commands we could add to  the  bridge  definition  something
      like this:
      pre-up iwconfig wlan0 mode master essid myESSID
      Be aware, however, that using wireless cards as part of a bridge is not
      a good idea if the card belonging to the bridge  is  in  managed  mode.
      Trying  to bridge packets coming out of our LAN through a wireless card
      that is set in managed mode (the card is a client of an AP) is bound to
      give  problems,  as the AP will probably refuse packets with source MAC
      addresses which are not associated (this will  be  the  case  of  other
      machines going through the wireless card of the bridge into the AP).
      Multiple stanzas of a bridge definition are currently not supported, so
      if you want to add a ipv6 and a ipv4 to a  bridge  do  it  all  in  one
      definition  by  using the "up" option. If however you still want to use
      multiple stanzas or would like to read more on this bug you can see  it
      at http://bugs.debian.org/319832

IFACE OPTIONS

      A   little  explanation  on  the  new  options  that  can  be  used  on
      /etc/network/interfaces to setup the bridge, so you don't  have  to  go
      and look at the scripts...
      bridge_ports interface specification
             this option must exist for the scripts to setup the bridge, with
             it you specify the ports you want to add to your bridge,  either
             using  "none" if you want a bridge without any interfaces or you
             want to add them later using brctl, or a list of the  interfaces
             you want to add separated by spaces, for example:
             bridge_ports eth0 eth4
             You  should  not  put any lines to configure the interfaces that
             will be used by the bridge, as this will be setup  automatically
             by the scripts when bringing the bridge up.
             If you need to specify the interfaces more flexibly, you can use
             the following syntax (most useful on a Xen dom0):
             bridge_ports regex (eth|vif).*
             This means to evaluate (as in  egrep(1))  the  expressions  that
             follow  after  "regex"  until  either  the  end  or  a "noregex"
             statement is reached.  The  regular  expressions  are  evaluated
             against all local interfaces and those that match are added.
             Specifying  "all"  is  short  for  "regex  eth.*  em.*  p[0-9].*
             noregex" and will get all the ethX and  biosdevname-format  (emX
             and pX) interfaces added to the bridge.
             Carrying this to the extremes, the following is valid syntax:
             bridge_ports all regex if.0 noregex ext0 regex vif.*
             This will add all ethX interfaces, the ifX0 interfaces, the ext0
             interface and all vifX interfaces.
      bridge_ageing time
             set ageing time, default is 300, can have a fractional part.
      bridge_bridgeprio priority
             set bridge priority, priority is between 0 and 65535, default is
             32768,  affects  bridge  id,  lowest priority bridge will be the
             root.
      bridge_fd time
             set bridge forward delay to time seconds,  default  is  15,  can
             have a fractional part.
      bridge_gcint time
             set  garbage  collection interval to time seconds, default is 4,
             can have a fractional part.
      bridge_hello time
             set hello time to  time  seconds,  default  is  2,  can  have  a
             fractional part.
      bridge_hw MAC address
             set the Ethernet MAC address of all the bridge interfaces to the
             specified one so that the bridge ends up  having  this  hardware
             address as well. WARNING: use this only if you know what you are
             doing, changing the MAC address of the cards may  cause  trouble
             if  you  don't  know  what  you are doing. To see the discussion
             about this feature and the problems that can cause you  can  try
             to  have  a look at the bug that asked for this feature visiting
             http://bugs.debian.org/271406
      bridge_maxage time
             set max message age to time seconds, default is 20, can  have  a
             fractional part.
      bridge_maxwait time
             forces  to  time seconds the maximum time that the Debian bridge
             setup scripts will wait for the  bridge  ports  to  get  to  the
             forwarding  status, doesn't allow factional part. If it is equal
             to 0 then no waiting is done.
      bridge_pathcost port cost
             set path cost for a port, default is 100, port is  the  name  of
             the interface to which this setting applies.
      bridge_portprio port priority
             set  port priority, default is 128, affects port id, port is the
             name of the interface to which this setting applies.
      bridge_stp state
             turn spanning tree protocol on/off, state values are on  or  yes
             to  turn  stp  on and any other thing to set it off, default has
             changed to off for security reasons in latest  kernels,  so  you
             should  specify  if you want stp on or off with this option, and
             not rely on your kernel's default behaviour.
      bridge_waitport time [ports]
             wait for a max of time seconds for the specified ports to become
             available,  if  no  ports  are specified then those specified on
             bridge_ports will be used here. Specifying no ports here  should
             not  be  used if we are using regex or "all" on bridge_ports, as
             it wouldn't work.

Источники: