Пример подключения локальной сети к Интернет через NAT, с организацией QoS

Меня зовут Педро Ларрой (Pedro Larroy) <piotr%member.fsf.org>. Здесь я расскажу об общих принципах настройки соединения локальной сети, в которой имеется большое число пользователей, к Интернет через маршрутизатор, работающий под управлением Linux. Маршрутизатор имеет реальный IP-адрес и производит Трансляцию Сетевых Адресов (NAT). Я живу в университетском общежитии, где проложена локальная сеть на 198 пользователей. Эта сеть соединена с Интернет через маршрутизатор, который я администрирую. Пользователи очень интенсивно работают в пиринговых сетях, что требует соответствующего управления трафиком. Надеюсь, что этот пример будет интересен читателям lartc.

Прежде всего я опишу процесс настройки своего маршрутизатора шаг за шагом, и в заключение расскажу, как сделать этот процесс автоматическим, выполняющимся в процессе загрузки системы. Сеть, к которой относится этот пример, является локальной (LAN). Она подключена к Интернет через маршрутизатор, который имеет единственный реальный IP-адрес. Разделение единственного реального IP-адреса между всеми пользователями в локальной сети осуществляется с помощью нескольких правил iptables. Для этого необходимо:

Ядро Linux 2.4.18 или выше
На ядро нужно наложить заплату, для поддержки HTB.
iproute
Убедитесь, что tc поддерживает HTB. Скомпилированная версия распространяется вместе с HTB.
iptables

Начнем с оптимизации пропускной способности.

Для начала создадим несколько дисциплин (qdiscs), которые будут обслуживать трафик. Первой создается htb qdisc с 6-ю классами и различными приоритетами. Каждому классу назначена определенная пропускная способность, но при этом они могут задействовать неиспользуемую пропускную способность, если она не занята другими классами. Напомню, что классы с более высоким приоритетом (т.е. с более низким числом prio) будут получать «излишек» канала первыми. Подключение к Интернет осуществляется через модем ADSL, с пропускной способностью для входящего трафика 2 Мбит/сек, исходящего — 300 Кбит/сек. Я ограничиваю исходящую пропускную способность величиной в 240 Кбит/сек по той простой причине, что это максимальное значение, при котором время ожидания отклика остается минимальным. Величина этот параметра может быть определена экспериментально, путем наблюдения за изменением времени отклика при изменении величины пропускной способности.

Для начала, присвойте переменной CEIL величину, составляющую 75% от общей пропускной способности для исходящего трафика. Там, где я использую eth0 — назначьте свой интерфейс, который «смотрит» в Интернет. Сценарий (на языке командной оболочки), выполняющий настройку, начинается со следующих строк:

CEIL=240
tc qdisc add dev eth0 root handle 1: htb default 15
tc class add dev eth0 parent 1: classid 1:1 htb rate ${CEIL}kbit ceil ${CEIL}kbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 80kbit ceil 80kbit prio 0
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 80kbit ceil ${CEIL}kbit prio 1
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 20kbit ceil ${CEIL}kbit prio 2
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 20kbit ceil ${CEIL}kbit prio 2
tc class add dev eth0 parent 1:1 classid 1:14 htb rate 10kbit ceil ${CEIL}kbit prio 3
tc class add dev eth0 parent 1:1 classid 1:15 htb rate 30kbit ceil ${CEIL}kbit prio 3
tc qdisc add dev eth0 parent 1:12 handle 120: sfq perturb 10
tc qdisc add dev eth0 parent 1:13 handle 130: sfq perturb 10
tc qdisc add dev eth0 parent 1:14 handle 140: sfq perturb 10
tc qdisc add dev eth0 parent 1:15 handle 150: sfq perturb 10

Эти строки создают одноярусное дерево HTB:

+---------+
| root 1: |
+---------+
     |
+---------------------------------------+
| class 1:1                             |
+---------------------------------------+
  |      |      |      |      |      |
+----+ +----+ +----+ +----+ +----+ +----+
|1:10| |1:11| |1:12| |1:13| |1:14| |1:15|
+----+ +----+ +----+ +----+ +----+ +----+
classid 1:10 htb rate 80kbit ceil 80kbit prio 0
Это класс с наивысшим приоритетом. Пакеты, попадающие в этот класс, будут иметь самую низкую задержку и получат избыток канала в первую очередь. Сюда будет направляться интерактивный трафик: sshtelnetdnsquake3irc, а так же пакеты с установленным флагом SYN.
classid 1:11 htb rate 80kbit ceil ${CEIL}kbit prio 1
Это первый класс, через который будет проходить довольно объемный трафик. В моем случае — это трафик от локального WEB-сервера и запросы к внешним WEB-серверам, исходящий порт 80 и порт назначения 80, соответственно.
classid 1:12 htb rate 20kbit ceil ${CEIL}kbit prio 2
В этот класс помещаются пакеты, с установленным битом Maximize-Throughput в поле TOS, а так же иной трафик, который генерируется локальными процессами на маршрутизаторе, отправляемый в Интернет. Таким образом, все последующие классы будут иметь дело только с перенаправляемым трафиком.
classid 1:13 htb rate 20kbit ceil ${CEIL}kbit prio 2
Высокоприоритетный класс, обслуживающий объемный трафик, поступающий от компьютеров из локальной сети.
classid 1:14 htb rate 10kbit ceil ${CEIL}kbit prio 3
Этот класс обслуживает почтовый трафик (SMTP,pop3…) и пакеты, с установленным битом Minimize-Cost в поле TOS.
classid 1:15 htb rate 30kbit ceil ${CEIL}kbit prio 3
Последний класс. Он обслуживает прочий трафик, поступающий от компьютеров из локальной сети. Сюда попадает все, что относится к работе в пиринговых сетях, т.е. kazaa, edonkey и пр.

Классификация пакетов.

Мы создали различные классы обработки трафика, но классификация пока отсутствует, поэтому, к настоящему моменту, весь трафик пойдет через класс 1:15 ( который назначен классом по-умолчанию: tc qdisc add dev eth0 root handle 1: htb default 15 ). Теперь самое главное — нужно распределить трафик по имеющимся классам.

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

tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15

Здесь задаются соответствия между специфическими значениями FWMARK ( handle x fw ) и классами (classid x:x). Теперь рассмотрим процесс установки меток на пакеты.

Для начала необходимо разобраться с тем, как движутся пакеты через iptables:

        +------------+   принятие     +---------+               +-------------+
Вход ---| PREROUTING |--- решения о --| FORWARD |-------+-------| POSTROUTING |- Выход
        +------------+  маршрутизации +---------+       |       +-------------+
                             |                          |
                        +-------+                    +--------+
                        | INPUT |-Локальные процессы-| OUTPUT |
                        +-------+                    +--------+

Далее я буду исходить из предположения, что всем таблицам назначена политика по-умолчанию -P ACCEPT. Наша локальная сеть относится к классу B, с адресами 172.17.0.0/16. Реальный IP-адрес — 212.170.21.172

Добавим правило iptables, которое будет выполнять SNAT, что позволит пользователям локальной сети общаться с внешним миром, и разрешим форвардинг пакетов:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 172.17.0.0/255.255.0.0 -o eth0 -j SNAT --to-source 212.170.21.172

Проверим, что пакеты уходят через класс 1:15:

tc -s class show dev eth0

Добавим в цепочку PREROUTING, таблицы mangle, правила для установки меток на пакеты:

iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p icmp -j RETURN

Теперь вы должны наблюдать увеличение значения счетчика пакетов в классе 1:10, при попытке ping-ануть из локальной сети какой-нибудь сайт в Интернете.

tc-s класс показывают dev eth0

Действие -j RETURN предотвращает движение пакетов по всем правилам. Поэтому все ICMP-пакеты будут проходить только это правило. Добавим еще ряд правил, которые будут изменять биты в поле TOS:

iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x5
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x6
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN

Поднимем приоритет для ssh-пакетов:

iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN

а так же для пакетов, с которых начинается TCP-соединение, т.е. SYN-пакетов:

iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

И так далее. После того, как в цепочку PREROUTING, таблицы mangle, будут внесены все необходимые правила, закончим ее правилом:

iptables -t mangle -A PREROUTING -j MARK --set-mark 0x6

Это заключительное правило отправит оставшиеся немаркированные пакеты в класс 1:15. Фактически, это правило можно опустить, так как класс 1:15 был задан по-умолчанию, но тем не менее, я оставляю его, чтобы сохранить единство настроек и кроме того, иногда бывает полезно увидеть счетчик пакетов для этого правила.

Нелишним будет добавить те же правила в цепочку OUTPUT, заменив имя цепочки PREROUTING на OUTPUT (s/PREROUTING/OUTPUT/). Тогда трафик, сгенерированный локальными процессами на маршрутизаторе, также будет классифицирован по категориям. Но, в отличие от вышеприведенных правил, в цепочке OUTPUT, я устанавливаю метку -j MARK —set-mark 0x3, таким образом трафик от маршрутизатора получает более высокий приоритет.

Дополнительная оптимизация

В результате приведенных настроек, мы получили вполне работоспособную конфигурацию. Однако, в каждом конкретном случае, эти настройки всегда можно немного улучшить. Найдите время и проследите — куда идет основной трафик и как лучше им распорядиться. Я потратил огромное количество времени и наконец довел свою конфигурацию до оптимального уровня, практически сведя на нет бесчисленные таймауты.

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

tc qdisc add dev eth0 parent 1:13 handle 130: sfq perturb 10
tc qdisc add dev eth0 parent 1:14 handle 140: sfq perturb 10
tc qdisc add dev eth0 parent 1:15 handle 150: sfq perturb 10

Выполнение настроек во время загрузки системы.

Уверен, что можно найти множество способов, чтобы произвести настройку маршрутизатора во время загрузки. Для себя я создал скрипт /etc/init.d/packetfilter, который принимает команды [start | stop | stop-tables | start-tables | reload-tables]. Он конфигурирует дисциплины (qdiscs) и загружает необходимые модули ядра. Этот же сценарий загружает правила iptables из файла /etc/network/iptables-rules, которые предварительно могут быть сохранены утилитой iptables-save и восстановлены —iptables-restore.

http://docstore.mik.ua/manuals/ru/LARTC/x2755.html

Защита от SYN flood

Пример взят из документации к iproute, написанной Алексеем и адаптирован для совместной работы с netfilter. Если этот пример заинтересует вас, измените числовые значения на наиболее подходящие для вашей системы.

Этот сценарий был написан для защиты отдельного хоста, а не сети. Учитывайте это обстоятельство.

Для его работы желательно иметь самую последнюю версию iproute2.

#! /bin/sh -x
#
# демонстрация возможностей по управлению входящим (ingress) трафиком
# здесь приводится пример ограничения пропускной способности для входящих SYN-пакетов
# Может оказаться полезным для защиты от TCP-SYN атак.
#
#пути к различным утилитам;
#укажите правильные значения.
#
TC=/sbin/tc
IP=/sbin/ip
IPTABLES=/sbin/iptables
INDEV=eth2
#
# пометить все SYN-пакеты, пришедшие через $INDEV, числом 1
############################################################
$iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
-j MARK --set-mark 1
############################################################
#
# установить ingress qdisc на входящий интерфейс
############################################################
$TC qdisc add dev $INDEV handle ffff: ingress
############################################################

#
#
# SYN-пакет имеет размер 40 байт (320 бит), отсюда -- три пакета
# имеют размер 960 бит (примерно 1 Кбит); ограничим скорость поступления
# 3-мя пакетами в секунду ( точнее -- 1 Кбит/сек )
############################################################
$TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \
police rate 1kbit burst 40 mtu 9k drop flowid :1
############################################################

#
echo "---- qdisc parameters Ingress ----------"
$TC qdisc ls dev $INDEV
echo "---- Class parameters Ingress ----------"
$TC class ls dev $INDEV
echo "---- filter parameters Ingress ----------"
$TC filter ls dev $INDEV parent ffff:

#Удаление ingress qdisc
#$TC qdisc del $INDEV ingress

 

Ограничение пропускной способности для ICMP-пакетов, с целью предотвращения DDoS-атак

Основная задача — настроить фильтры таким образом, чтобы пакеты, с исходящими адресами, не принадлежащими вашей сети, не смогли бы покинуть ее. Это предотвратит возможность отправки всякой «гадости» в Интернет.

Прежде, чем приступить к делу, нарисуем схему подключения локальной сети к Интернет:

[Интернет] —— [Linux router] — [Офис]
eth1 eth0

Зададим начальные условия:

# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
# tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
10Mbit allot 1514 prio 5 maxburst 20 avpkt 1000

Если у вас более высокоскоростное подключение — измените эти цифры соответствующим образом. Теперь необходимо определиться с «шириной» канала для ICMP-трафика. Чтобы найти типовое значение для вашей сети, можно воспользоваться утилитой tcpdump, запустив ее с перенаправлением вывода в файл. Затем, с помощью этого файла, вы сможете подсчитать количество ICMP-пакетов, отправляемых вашей сетью в единицу времени.

Если вариант подсчета экспериментальным путем вам не подходит, попробуйте ограничиться 10% общей пропускной способности. Построим наш класс:

# tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \
100Kbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 250 \
bounded

Он ограничивает пропускную способность канала величиной 100 Кбит/сек. А теперь подключим к нему фильтр для ICMP-пакетов:

# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip
protocol 1 0xFF flowid 10:100

 

http://docstore.mik.ua/manuals/ru/LARTC/x2502.html

Управление приоритетами для трафика различных типов

Если канал практически полностью забит отправляемыми/получаемыми данными, то работа через telnet или ssh становится практически невозможной. Как было бы здорово, если бы интерактивный трафик не блокировался другими пакетами. Linux поможет вам в этом!

Как и прежде, необходимо настроить обслуживание трафика на обоих концах канала. Наилучший вариант — когда с обоих концов установлена операционная система Linux, однако UNIX тоже может выполнять управление приоритетами трафика.

Стандартный планировщик pfifo_fast имеет три различных «полосы». В первую очередь обслуживается полоса 0, а затем полосы 1 и 2. Поэтому, необходимо весь интерактивный трафик отправить в полосу 0!

Отталкиваясь от «Ipchais HOWTO» (уже довольно устаревшего):

В IP-заголовке имеется 4 редко используемых бита — TOS (Type of Service — Тип Обслуживания). Они задают способ обслуживания пакета: «Minimum Delay» (минимальная задержка), «Maximum Throughput» (максимальная пропускная способность), «Maximum Reliability» (максимальная надежность) и «Minimum Cost» (минимальная стоимость канала). Причем одновременно может быть установлен только один из этих битов. Роб ван Ньюкерк (Rob van Nieuwkerk), автор кода ipchains TOS-mangling, дает следующее пояснение:

Наиболее важным для меня, является флаг «Minimum Delay» (минимальная задержка). Я включаю его в пакетах интерактивного трафика на моем роутере, работающем под управлением Linux. Я подключен к сети через модем 33.6. Linux «раскидывает» пакеты по 3-м очередям. Таким образом я получаю вполне приемлемую скорость обслуживания интерактивного трафика при большой загрузке канала.

Как правило, флаг «Minimum Delay» устанавливается в пакетах для telnet и ftp-control, а в пакетах ftp-data — «Maximum Throughput». Делается это следующим образом:

# iptables -A PREROUTING -t mangle -p tcp --sport telnet \
-j TOS --set-tos Minimize-Delay
# iptables -A PREROUTING -t mangle -p tcp --sport ftp \
-j TOS --set-tos Minimize-Delay
# iptables -A PREROUTING -t mangle -p tcp --sport ftp-data \
-j TOS --set-tos Maximize-Throughput

Эти правила прописываются на удаленном хосте и воздействуют на входящие, по отношению к вашему компьютеру, пакеты. Для пакетов, отправляемых в обратном направлении, эти флаги (вроде бы) устанавливаются автоматически. Если это не так, можете на своей системе прописать следующие правила:

# iptables -A OUTPUT -t mangle -p tcp --dport telnet \
-j TOS --set-tos Minimize-Delay
# iptables -A OUTPUT -t mangle -p tcp --dport ftp \
-j TOS --set-tos Minimize-Delay
# iptables -A OUTPUT -t mangle -p tcp --dport ftp-data \
-j TOS --set-tos Maximize-Throughput

 

Защита Asterisk или кубинская эпидемия

В последнее время началась большая волна взломов Asterisk с последующим прогоном через них траффика на кубу.

Поскольку минута звонка на кубу стоит в среднем от 1$ в минуту это может привести к печальным последствиям (за 17 часов на одном из транков баланс опустили до -8000$).
Схема работает так:

  1. Ищется в сети Asterisk сервер
  2. Подбирается список его пиров
  3. Подбираются пароли к пирам
  4. Аккаунт ставится в систему перебирающую транки при звонке.
  5. Набегает множество кубинцев звонящих через эту систему

Если купить доступ к такой системе и позвонить, то можно по задержке до гудка понять, что в этой схеме участвует огромное количество взломанных Asterisk серверов.

Подбор пиров

При подборе пиров используется метод реализованный в Sipvicious. Для сканирования перебираются пиры и анализируется ответ Asterisk. Например:

./svwar.py sip.somewhere
| Extension | Authentication |
-------------------------------
| 607 | reqauth |
| 606 | reqauth |
| 601 | reqauth |
| 600 | reqauth |
| 300 | reqauth |
| 900 | reqauth |
| 100 | reqauth |

Для продиводействия этому нужно включить директиву alwaysauthreject в sip.conf, которая при любых ошибках авторизации отвечает 401 Unauthorized.
После этого тот-же сервер при попытке сканирования будет отвечать 401 и утилита выдаст ошибку:

./svwar.py sip.somewhere
ERROR:TakeASip:SIP server replied with an authentication request for an unknown extension. Set --force to force a scan.
WARNING:root:found nothing

 

Кубинская проблема

Если ваши абоненты не собираются звонить на кубу, то ее надо закрыть в extensions.conf
Например:

;cuba
exten => _53.,1,Answer()
exten => _53.,n,PlayBack(vm-goodbye)
exten => _53.,n,Hangup()
;somali
exten => _252.,1,Answer()
exten => _252.,n,PlayBack(vm-goodbye)
exten => _252.,n,Hangup()

Можно конечно просто делать сразу Hangup, но данное действие потребует отключение нашего сервера из автоматической системы вручную, что не может не радовать.

P.S. Для проверки на то, что вы правильно прописали отклонение звонков на кубу можно попробовать позвонить по номеру +53997970. Это военная база и там всегда отвечает автоответчик.

Взято с Хабра — http://habrahabr.ru/blogs/voip/103341/

SipSak

sipsak is a small comand line tool for developers and administrators of SIP applications. It can be used for some simple tests on SIP applications and devices.

Features

  • sending OPTIONS request
  • sending text files (which should contain SIP requests)
  • traceroute (see section 11 in RFC3261)
  • user location test
  • flooding test
  • random character trashed test
  • interpret and react on response
  • authentication with qop supported
  • short notation supported for receiving (not for sending)
  • string replacement in files
  • can simulate calls in usrloc mode
  • uses symmetric signaling and thus should work behind NAT

Available for Linux, BSD & Win32

http://sipsak.org/

Asterisk SNMP

We needed a better way to monitor and track performance of RF.com‘s Asterisk 1.6 boxes.  We learned quickly that the scarce documentation for configuring Asterisk to use Simple Network Management Protocol (SNMP) is conflicting and outdated.  So we decided to share our configuration and hopefully save others a lot of time and head-scratching.

Downloading the Asterisk 1.6 source code

Enabling SNMP support in Asterisk requires a rebuild of Asterisk.

If you already have the Asterisk source code on your Asterisk server, open a terminal session with the Asterisk box and navigate to the Asterisk source code directory, then skip to Installing Net-SNMP.

If you don’t have the Asterisk source code on your Asterisk server, open a terminal session with the Asterisk box and copy these instructions to the command line:

#get asterisk source
# create source dir
mkdir -p /usr/src/digium
cd /usr/src/digium/
wget http://downloads.digium.com/pub/asterisk/asterisk-1.6-current.tar.gz tar xzvf asterisk-1.6-current.tar.gz
cd asterisk-1.6.*

Installing Net-SNMP

Asterisk SNMP support is provided by the res_snmp module.  To build this module, you need to install the following packages:

  • net-snmp
  • net-snmp-devel
  • net-snmp-utils
  • bzip2
  • bzip2-devel
  • lm_sensors
  • lm_sensors-devel
  • newt
  • newt-devel

On a CentOS or Fedora box you can use the following command to install all the packages at once:

yum -y install net-snmp net-snmp-devel net-snmp-utils bzip2-devel newt-devel lm_sensors-devel ; # snmp support – res_snmp

Preparing the Asterisk box

Once the necessary packages are installed, run the following commands from the Asterisk source code directory:

./configure
make menuselect

Running make menuselect will launch a menu that looks something like the image below.

Asterisk Module and Build Options Selection

Select the Resource Modules option from the menu and press the Return key.  Then scroll down to res_snmp, if res_snmp is not selected, press the spacebar to enable res_snmp.  The selection should now look like the image below.

Asterisk resource modules

If you are unable to select res_snmp, it means the Net-SNMP package was not installed properly or the Asterisk configure tool was unable to find the Net-SNMP package. Try running .configure -with-netsnmp from the command line and then re-run make menuselect.

Press x to save your configuration changes.

Now we can build Asterisk with SNMP support and install it by runing the following commands:

make /etc/init.d/asterisk stop ; # make sure asterisk is stopped before installing
make install

Configuring the SNMP daemon

There are three versions of SNMP, but two are insecure and should not be used over an untrusted network.  We chose SNMPv3, which requires authentication and encryption from the asteriskUser when it connects to the server.

To create an SNMPv3 user account and to configure it to require authentication and encryption, run the commands below, replacing change_this_password with your own password.

echo '# Asterisk user
rwuser asteriskUser priv
createUser asteriskUser SHA change_this_password AES
' >> /etc/snmp/snmpd.conf

Asterisk uses AgentX to communicate with the SNMP daemon.  Run the command below to configure the SNMP daemon for AgentX.  If your Asterisk daemon, does not run as a member of the asterisk group, replace asterisk in the agentXPerms command with an asterisk daemon group.

echo '
# Asterisk configuration
master agentx
agentXSocket /var/agentx/master
agentXPerms 0660 0550 nobody asterisk
' >> /etc/snmp/snmpd.conf

The commands below will install the Asterisk and Digium MIB files, configure the snmp daemon to start on boot, and launch the snmp daemon.

# copy asterisk mib files
cp doc/*-mib.txt /usr/share/snmp/mibs/

#start the snmpd daemon
chkconfig snmpd on
/etc/init.d/snmpd start

Let’s verify that the configuration is working so far by verifying that the snmp daemon set the file permissions correctly, run the following command:

ls -al /var/agentx

Your permissions must look like:

total 8
drwxr-xr-x  2 root   root     4096 Jan 31 18:01 .
drwxr-xr-x 20 root   root     4096 Jan 31 14:30 ..
srw-rw----  1 nobody asterisk    0 Jan 31 18:01 master

If the file permissions on /var/agentx and /var/agentx/master don’t allow the asterisk daemon group to write tomaster, Asterisk will not be able to communicate with the SNMP daemon. We had problems with the /var/agentx directory permissions, you may need to run the following command to fix the permissions.

chmod 755 /var/agentx

You can also check the logs to confirm that AgentX is running.

more /var/log/messages | grep snmpd

You should see lines like the following:

Jan 31 14:30:15 domU-12-31-39-00-55-E7 snmpd[27048]: Creating directory: /var/agentx
Jan 31 14:30:15 domU-12-31-39-00-55-E7 snmpd[27048]: Turning on AgentX master support.

Configuring the Asterisk res_snmp module

Now we configure Asterisk to use SNMP by running the following commands:

# configure res_snmp.conf
sed -e ‘s/;\(subagent\)/\1/’ -e ‘s/;\(enabled\)/\1/’ <configs/res_snmp.conf.sample >/etc/asterisk/res_snmp.conf

Start Asterisk from the command line:

asterisk -cvvvvvvvvvv

and look for the following Asterisk console output:

NET-SNMP version 5.4.1 AgentX subagent connected

The line above means that Asterisk is configured correctly and the res_snmp module has loaded.

You can now exit the asterisk console and then launch the Asterisk daemon, with the command below:

/etc/init.d/asterisk start

Final testing

You can now use the snmpwalk command to test that everything is configured correctly.  Replacechange_this_password with the password you created above for the snmp daemon configuration and run the commands below:

export MIBS=+ASTERISK-MIB
snmpwalk -v 3 -u asteriskUser -n “” -l authPriv -a SHA -A change_this_password -x AES -X change_this_password localhost asterisk

You should get a result like:

ASTERISK-MIB::astVersionString.0 = STRING: 1.6.0.5
ASTERISK-MIB::astVersionTag.0 = Gauge32: 10600
ASTERISK-MIB::astConfigUpTime.0 = Timeticks: (60776) 0:10:07.76
ASTERISK-MIB::astConfigReloadTime.0 = Timeticks: (60777) 0:10:07.77
...

Congratulations, you’ve finished and your Asterisk server is now configured to use SNMP.

Asterisk IP PBX ICQ Call Notification

(статью скоро переработаю, т.к. micq уже умер. 891rpm)

(АОН с Asterisk IP PBX на ICQ)

С 22 июня 2005 года работает у нас в службе тех-поддержки ICQ бот под ником Asterisk (UIN не скажу ).Занимается он тем, что по ICQ отправляет техподдержке номер телефона звонящего, дату и время.

Итак.
Имеем настроеный рабочий Asterisk на сервере.
Заходим на сайт http://www.micq.org/download.shtml.en и скачиваем последнюю версию mICQ
(на данный момент это mICQ 0.5.0.4 (released 2005-06-05)). То есть:

[roman@pbx1 log]$ cd ~
[roman@pbx1 ~]$ wget http://www.micq.org/source/micq-0.5.0.4.tgz
---bla-bla-bla---
[roman@pbx1 ~]$ tar -zxvf micq-0.5.0.4.tgz
---bla-bla-bla---
[roman@pbx1 ~]$ cd micq-0.5.0.4
[roman@pbx1 micq-0.5.0.4]$ ./configure --help #Читаем help если надо...
[roman@pbx1 micq-0.5.0.4]$ ./configure
---bla-bla-bla---
[roman@pbx1 micq-0.5.0.4]$ make
---bla-bla-bla---
[roman@pbx1 micq-0.5.0.4]$ su -
Password:
[root@pbx1 ~]# cd /home/roman/micq-0.5.0.4
[root@pbx1 micq-0.5.0.4]# make install
[root@pbx1 micq-0.5.0.4]# exit
[roman@pbx1 micq-0.5.0.4]$ micq

 

При запросе UIN смело набираем ‘0’ (просто ноль, кто не понял ) и жмем Enter. Далее придумываем архисложный пароль, вводим, Enter, вводим его еще раз, Enter, дальше если вы работаете через прокси , вводите его параметры, иначе, как все нормальные люди, смело жмете Enter.
Получаем UIN, регистрируемся на сервере.
Если хотите, в консоли mICQ есть команда ‘help’, а есть еще ‘help ‘, то есть что-то вроде ‘help msg’ даст вам справку по отправке сообщений.
Комманда ‘msg 227702532 Hello Anest!!! How are you today guy?’ спросит ‘Как дела?’ у нашего любимого Anest’а, а ‘msg 320598502 Privet rebyata! Pochemu na zvonki ne otvechaete?’ спросит у нашей техподдержки, что это она так расслабилась.
___________________________________________
# Дополнение от 03.07.2005г.
# В консоли mICQ дайте комманду
mICQ> autoaway 0
Changing status to away/not available after idling 0 seconds.
mICQ> save
Saving preferences to /home/roman/.micq/micqrc.
Your personal settings have been saved!

# Это не даст вашему боту эпизодически пропадать в offline.
___________________________________________
Поиграли, выходим из mICQ командой ‘exit’.
Далее:
[roman@pbx1 micq-0.5.0.4]# nano ~/.micq/micqrc

или другим вашим любимым редактором vi, pico, или просто по F4 в ‘mc’ на этом файле, меняем ‘ # password’ на ‘password <тут ваш пароль>’.
Продолжаем:
[roman@pbx1 micq-0.5.0.4]# screen -d -m micq

# Кто не пользуется и не знает, команда ‘screen’ создает нечто вроде виртуального терминала, от которого можно безболезненно отключаться, при этом программа, что запущена в нем, остается там работать в режиме S+, либо Ss+.
Почитайте ‘man screen’ и Краткое руководство по работе в SCREEN на www.opennet.ru.
# Проверяем, что заработало:
[roman@pbx1 micq-0.5.0.4]# ps ax | grep micq | grep -v grep
16046 ? Ss 0:00 SCREEN -d -m micq
16047 pts/2 Ss+ 0:00 micq

# Проверяем еще раз:
[roman@pbx1 micq-0.5.0.4]# screen -R
# Видим консоль mICQ, нажимаем Ctrl+c, потом отдельно ‘d’ — отключаемся от консоли.

Дальше правим конфиг Asterisk’a extentions.conf
[roman@pbx1 micq-0.5.0.4]# sudo nano /etc/asterisk/extensions.conf
# В нужном extention тепосредственно перед Dial вставляем нечто следующее:
exten => 4,7,System(/bin/echo -e "msg <тут UIN, на который хотим слать оповещение> 'Incoming Call From: ${CALLERIDNUM} To: <ваш номер> Received: ${DATETIME:0:2}/${DATETIME:2:2}/${DATETIME:4:4} at ${DATETIME:9}'" > /home/roman/.micq/scripting)
#Сохраняем файл, перезагружаем конфиги Asterisk’a
[roman@pbx1 micq-0.5.0.4]# su -
Password:
[root@pbx1 ~]# asterisk -r
pbx1*CLI> extensions reload
---bla-bla-bla---
pbx1*CLI> exit
[root@pbx1 ~]# exit
[roman@pbx1 micq-0.5.0.4]#

Все.
___________________________________________
# Дополнение от 19.07.2005г.
# Бот падает в оффлайн, если превышен некоторый лимит количества сообщений за единицу времени.
Слава Богу, обычно он сам поднимается после этого.
___________________________________________
___________________________________________
# Дополнение от 20.07.2005г.
# Дополнение к дополнению от 19.07.2005 🙂
Можно с некоторой периодичностью, например используя cron, скриптом давать боту комманду login.
___________________________________________
___________________________________________
# Дополнение от 16.03.2006г.
# Версия mICQ 0.5.0.4 с русским работала некорректно. Уже следующая работала отлично. На настоящий момент используйте версию 0.5.1.
http://www.micq.org/source/micq-0.5.1.tgz

# Про login
Добавьте в /etc/crontab
*/30 * * * * root echo "login" > /home/roman/.micq/scripting

# Про «зомбиков»
Если процесс micq умирает по какой-то причине (например кто-то сделал killall SCREEN), то в системе появляются подвисшие процессы ‘echo’, звонок не завершается нормальным образом.
Хак:
#!/bin/bash

# for pid in $(ps aux | grep "micq" | grep "scripting" | grep -v grep | awk '{print $2}'); do
for pid in $(ps aux | grep -v grep | awk '/micq|scripting/ {print $2}'); do
echo "Killing micq with PID $pid:"
kill -9 $pid
done
exit

# Дополнение от 02.08.2006г.
Автозапуск micq под пользователем roman.
Прописывается например в /etc/rc.d/rc.local
/bin/su — roman -c «/usr/bin/screen -d -m /usr/bin/micq»

http://asteriskforum.ru/viewtopic.php?p=1127

http://romik-g.livejournal.com/3690.html

FreeBSD. Полезные мелочи

Порты

Удобный поиск и установка

Иногда приходится сталкиваться с тем что не знаешь, где конкретно искать тот или иной порт для этого есть такая вещь как «whereis»
И чтобы совсем было удобно пустим по конвейеру те поставим точку с запятой «;»

и укажем что делать дальше «make config-recursive install clean», опция config-recursive позволяет сразу рекурсивно сконфигурировать все зависимости дабы не сидеть и не подтверждать каждый пакет
cd `whereis -q desktopbsd-tools`;make config-recursive install clean

Если собрали порт без поддержки какой нибудь опции, а нужно что то добавить или убрать, делаем следующее:

В диалоге настройки выбираем опции те что необходимы или убираем ненужные
cd /usr/ports/www/squid/ && make config

И собираем пакет
make FORCE_PKG_REGISTER=yes install clean
Что нужно обновлять?

Отобразить только необходимые программы для обновления.
/usr/sbin/pkg_version -v |grep ‘<‘

Или вот так:
pkg_version -vIL=
Демоны

Подсчет процессов занятых пользователем

ps -auxww | grep Raven2000 | wc -l
Железо

Скорость чтения HDD

dd if=/dev/ad4 of=/dev/null bs=1m count=1024
Какой процесс нагружает HDD

# top -m io -o total
Уборка

Уборка после пересборки ядра

Я создал себе такой файлик:
vi /uborka

#!/bin/sh
chflags -R noschg /usr/obj/usr
rm -rf /usr/obj/usr
cd /usr/src
make cleandir
make cleandir

chmod 777 /uborka

и после пересборки ядра просто запускаю его
/uborka

можно ещё удалить старое ядро:
rm -rf /boot/kernel.old

http://www.ignix.ru/node/72

FPing. Мониторинг сети.

Fping один из самых лучших инструментов для тестирования сети на основе icmp.В отличие от утилиты ping, fping можно легко использовать в скриптах, т.к вывод этой утилиты разрабатывался для парсинга. Можно написать несложные скрипты, которые будут посылать письмо в случае недоступности какого-то узла сети.

Для начала рассмотрим пример команд:

# fping router

Вывод:

router is alive

Можно дать утилите на съедение целый список серверов или ип из файла. Но опция -f джоступна только для root. Обычные пользователи могут делать следующим образом: Для примерна протестируем все хосты и ип из файла ~/.fping.conf

$ fping < ~/.ping.conf

Можно также сформировать диапозон тестируемых адресов на основе маски сети. Для примера протестируем сеть класса C 192.168.148.x:

$ fping -g 192.168.148.0/24
или
$ fping -g 192.168.148.0 192.168.148.255

Теперь рассмотрим небольшой скрипт, который посылает почтовое сообщение, если какой-то узел сети недоступен:

#!/bin/bash
HOSTS="router sun printer laptop sony-laptop xbox backup-server"
DLIST=""
for h in $HOSTS
do
fping -u $h >& /dev/null
if [ $? -ne 0 ]; then
echo ${h} host is down send email
# mail -s "Host ${h} down" admin@you.com

Другой пример:

#!/usr/bin/perl
$myHosts = ‘cat /etc/hosts.backup | fping -a‘;
foreach $host (split(/\n/,$myHosts)) {
# take action or call other function
}