четверг, 10 мая 2018 г.

Защита от SIP флуда.

При получении более 20 SIP пакетов с одного адреса в течение секунды, генерируем событие флуда, которое ловит fail2ban. И блокируем трафик на следующую секунду.

# Пишем количество пакетов, соответствующих правилу, и IP-адрес их источника в список SIP.
-A INPUT -p udp --dport 5060 -i ens34 -m recent --set --name SIP
# Если за секунду поступило больше 20 пакетов, то пишем в лог и блокируем адрес.
-A INPUT -p udp --dport 5060 -i ens34 -m recent --update --seconds 1 --hitcount 20 --name SIP -j LOG --log-prefix "Iptables: SIP flood "
-A INPUT -p udp --dport 5060 -i ens34 -m recent --update --seconds 1 --hitcount 20 --name SIP -j REJECT

Правила нужно вставлять до общего разрешения RELATED,ESTABLISHED.

Далее отлавливаем событие с помощью fail2ban. Создаем новый джеил.
[sip_flood]
enabled = true
filter = sip_flood
port     = 5060,5061
action   = iptables-allports[name=SIP_FLOOD, protocol=all]
               sendmail[name=SIP_FLOOD, dest=admin@domain, sender=server@domain]
logpath  = /var/log/iptables.log
maxretry = 1
bantime  = 600 ; 10 min

В /etc/fail2ban/filter.d/sip_flood.conf.
[INCLUDES]
before = common.conf
[Definition]
failregex = ^(.*)Iptables: SIP flood(.*)SRC=<HOST>(.*)$
ignoreregex =

понедельник, 26 марта 2018 г.

Bash. Сравнения.

Сравнение файлов:

-d my_file Checks if its a folder.

-e my_file Checks if the file is available.

-f my_file Checks if its a file.

-r my_file Checks if it’s readable.

my_file –nt my_file2 Checks if my_file is newer than my_file2.

my_file –ot my_file2 Checks if my_file is older than my_file2.

-O my_file Checks if the owner of the file and the logged user match.

-G my_file Checks if the file and the logged user have the idetical group.

четверг, 22 марта 2018 г.

Настройка сервиса CallBack на LiveZilla 7.

Идея в том, чтобы заставить LiveZilla осуществлять исходящий вызов через Asterisk, при выборе клиентом функции "Обратный звонок".
Схема следующая: клиент на сайте заполняет форму "Обратный звонок", указывая свой телефон. LiveZilla создает запись в базе с признаком callback. В процедуру записи в базу вставляется строка, вызывающая PHP-скрипт на сервере Астериска с передачей параметров. PHP-скрипт создает call-файл, соединяющий оператора с клиентом.

вторник, 27 февраля 2018 г.

Ограничение роста бинарных логов

Бинарные логи mysql со временем разрастаются в количестве
mysqld-bin.000001
mysqld-bin.000002
mysqld-bin.000003
и т.д.
За количество логов отвечает переменная expire_logs_days.
Прописываем expire_logs_days=7 в my.cnf и рестартуем mysql.

Починка сразу всех таблиц всех баз данных

#mysqlcheck -u root -p --auto-repair --check --all-databases
Ну или всех таблиц одной базы
#mysqlcheck -u root -p DB_NAME --auto-repair --check --all-databases:

понедельник, 26 февраля 2018 г.

Параметры PJSIP, на которые стоит обратить внимание.

auth_rejection_permanent=yes
Определяет, продолжать ли попытки регистрации, если превышено число max_retries.
По-умолчанию включен, т.е. регистрация останавливается до pjsip reload.

Так же по-умолчанию прекращаются попытки регистрации при получении ответа 403.
Это не всегда хорошо.
;forbidden_retry_interval=0     ; Interval used when receiving a 403 Forbidden
                                ; response (default: "0")
;fatal_retry_interval=0 ; Interval used when receiving a fatal response.
                        ; (default: "0") A fatal response is any permanent
                        ; failure (non-temporary 4xx, 5xx, 6xx) response
                        ; received from the registrar. NOTE - if also set
                        ; the 'forbidden_retry_interval' takes precedence
                        ; over this one when a 403 is received. Also, if
                        ; 'auth_rejection_permanent' equals 'yes' a 401 and
                        ; 407 become subject to this retry interval.


вторник, 30 января 2018 г.

Важный момент безопасности PJSIP

Endpoint и AOR определяются тремя способами:
1) ip - по IP-адресу источника;
2) username - по содержимому поля From;
3) auth_username - по полю Authentication.
За выбор способа отвечает параметр identify_by секции endpoint.
По-умолчанию определение происходит в порядке ip,username. То есть сначала проверяется совпадение IP-адреса источника с указанным в секции identify/match, а если не совпало,  то совпадение имени и домена из поля From с именем endpoint или AOR.
Таким образом, если у нас есть endpoint [trunk301], с указанным в параметре identify/match адресом 10.10.10.1, то любой может указать своим именем trunk301, и совершить вызов с любого IP-адреса.
Поэтому важно ограничивать значение identify_by только нужным в каждом конкретном случае, указывая его через шаблон или непосредственно.
При этом необходимо помнить, что identify_by=auth_username будет работать только в том случае, если есть секция auth и она привязана к endpoint. Если нет, то auth_username работает просто как username! Со всеми вытекающими потенциальными проблемами.

Так же имеет смысл изменить значение параметра endpoint_identifier_order секции global на подходящий текущим настройкам.

четверг, 25 января 2018 г.

Таймеры в SIP.

In this blog article I will deal with the three basic SIP timer parameters – T1Timer B, and Timer F.  T1 is the estimated round trip time of an IP packet.  By default, T1 is set to 500 milliseconds which for many networks can be a little on the high side.   However, the SIP standard allows you to ignore the default and set it to something that better matches your network characteristics.

среда, 24 января 2018 г.

CentOS 7. Отдельный лог iptables.

Создаем файл /etc/rsyslog.d/iptables.conf. Пишем в него:
:msg, contains, "Iptables: " -/var/log/iptables.log
& stop
Перегружаем rsyslog.
В правила iptables добавляем логирование, например:
-A INPUT -p udp --dport 5060 -j LOG --log-prefix "Iptables: SIP "
-A INPUT -p tcp --dport 22 -j LOG --log-prefix "Iptables: SSH "



CentOS 7. Ротация логов Asterisk.

Создаем файл /etc/logrotate.d/asterisk.
Пишем в него:
/var/log/asterisk/messages
/var/log/asterisk/security
/var/log/asterisk/*log {
    missingok
    rotate 60
    daily
    create 0640 asterisk asterisk
    sharedscripts
    compress
    postrotate
    /usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null
    endscript
}
И лучше перенести logrotate в cron.hourly, чтобы cron его запускал, а не anacron.

CentOS 7. Избавляемся от мусора в /var/log/messages (Created slice..., Stopping User...)

Создаем файл garbage.conf в /etc/rsyslog.d/ с таким содержанием:
if $programname == "systemd" and ($msg contains "Starting Session" or $msg contains "Started Session" or $msg contains "Created slice" or $msg contains "Starting User" or $msg contains "Removed slice User" or $msg contains "Stopping User") then stop

Перегружаем rsyslog:
# systemctl restart rsyslog

вторник, 23 января 2018 г.

Разворачиваем LAMP+Asterisk 15 на CentOS 7.

# yum update
# systemctl stop firewalld && systemctl disable firewalld
Правим SELINUX=disabled в /etc/sysconfig/selinux

# yum -y install mariadb-server mariadb
# systemctl enable mariadb.service
# systemctl start mariadb.service
# mysql_secure_installation