Простой PPTP сервер для Centos 7

  • Linux
Проверенный много раз в бою скрипт, можно брать VDS и раскатывать сервер pptp.
Все шаги выполняйте как тут выложены блоки по очереди

1.
yum -y update


2.
yum install -y epel-release
yum install -y net-tools vim
yum install -y ppp pptp pptpd pptp-setup
chkconfig pptpd on

3.
mv /etc/pptpd.conf /etc/pptpd.conf.bak
vim  /etc/pptpd.conf

Содержимое
option /etc/ppp/options.pptpd
logwtmp
localip 10.0.10.1
remoteip 10.0.10.2-254

4.
mv /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak
vim /etc/ppp/options.pptpd

Содержимое
name pptpd
refuse-pap
refuse-chap
refuse-mschap
#require-chap
#require-mschap
#require-mschap-v2
require-mppe-128
require-mschap-v2
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
ms-dns 8.8.8.8
ms-dns 8.8.4.4

5.
mv /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bak
vim /etc/ppp/chap-secrets

Содержимое
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
test * test *

6.
vim /usr/lib/sysctl.d/50-default.conf

Добавить строку
net.ipv4.ip_forward=1

7.
vim /etc/selinux/config

Заменить опцию
SELINUX=disabled

8.
firewall-cmd --permanent --add-masquerade
firewall-cmd --zone=public --add-port=1723/tcp --permanent
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --reload

перегружаем и пробуем подключаться по логину паролю test/test

Записи в FreePBX в формате MP3

  • Linux
По умолчанию в mp3 freepbx писать не умеет, поэтому сделал, чтобы записи конвертировались потом, в кроне. Запускаю конвертацию ночью и все что накопилось в wav конвертируется в mp3. Имя файла в базе меняется на mp3
Сначала поставим lame
yum install lame

Можете попровать запустить конвертацию на любом wav файле
lame -h -b 32 test.wav test.mp3

Если все ок, запускайте скрипт
#!/bin/sh
#convert wav to mp3 asterisk recordings
cdrdb="asteriskcdrdb"
user="freepbxuser" #пользователь субд для отчетов
pass="password" #пароль пользователя субд

for i in `find /var/asterisk/spool/monitor -type f -name "*.wav"`
do
 if [ -e "$i" ]; then
    file=`basename "$i" .wav`;
    dir=`dirname "$i"`;
    lame -h -b 32 "$i" "$dir/$file.mp3";
    rm -f "$dir/$file.wav";
    mysql -u $user -p$pass --execute='use asteriskcdrdb;UPDATE cdr SET recordingfile="'$file'.mp3" WHERE recordingfile="'$file'.wav";';
  fi
done

Пароли к камерам

Стандартные пароли к камерам разных производителей

ACTi: admin/123456 or Admin/123456
American Dynamics: admin/admin or admin/9999
Arecont Vision: none
Avigilon: Previously admin/admin, changed to Administrator/<blank> in later firmware versions
Axis: Traditionally root/pass, new Axis cameras require password creation during first login (though root/pass may be used for ONVIF access)
Basler: admin/admin
Bosch: None required, but new firmwares (6.0+) prompt users to create passwords on first login
Brickcom: admin/admin
Canon: root/camera
Cisco: No default password, requires creation during first login
Dahua: admin/admin
Digital Watchdog: admin/admin
DRS: admin/1234
DVTel: Admin/1234
DynaColor: Admin/1234
FLIR: admin/fliradmin
FLIR (Dahua OEM): admin/admin
Foscam: admin/<blank>
GeoVision: admin/admin
Grandstream: admin/admin
Hikvision: Previously admin/12345, but firmware 5.3.0 and up requires unique password creation
Honeywell: admin/1234
Intellio: admin/admin
Interlogix admin/1234
IQinVision: root/system
IPX-DDK: root/admin or root/Admin
JVC: admin/jvc
March Networks: admin/<blank>
Mobotix: admin/meinsm
Northern: Previously admin/12345, but firmware 5.3.0 and up requires unique password creation
Panasonic: Previously admin/12345, but firmware 2.40 requires username/password creation
Pelco Sarix: admin/admin
Pixord: admin/admin
Reolink: admin/<blank>
Samsung Electronics: root/root or admin/4321
Samsung Techwin (old): admin/1111111
Samsung (new): Previously admin/4321, but new firmwares require unique password creation
Sanyo: admin/admin
Scallop: admin/password
Sentry360 (mini): admin/1234
Sentry360 (pro): none
Sony: admin/admin
Speco: admin/1234
Stardot: admin/admin
Starvedia: admin/<blank>
Trendnet: admin/admin
Toshiba: root/ikwd
VideoIQ: supervisor/supervisor
Vivotek: root/<blank>
Ubiquiti: ubnt/ubnt
Uniview: admin/123456
W-Box: admin/wbox123
Wodsee: admin/<blank>

Установка Nginx + php-fpm + perl + mysql (mariadb 10) на Centos 7

  • Linux
Мой набор для установки веб-сервера на чистую систему

yum update
yum install epel-release
yum install fail2ban
systemctl enable fail2ban
systemctl restart fail2ban
yum -y install python python-pip python-devel libxml2 
yum -y libxml2-devel python-setuptools zlib-devel wget 
yum -y openssl-devel pcre pcre-devel gcc make autoconf automake
pip install uwsgi
yum -y install nginx
pip install virtualenv
systemctl enable nginx.service
systemctl start nginx.service
yum install -y mariadb mariadb-server net-tools
systemctl enable mariadb.service
yum install -y php-devel
yum groupinstall 'Development Tools'
vim /etc/yum.repos.d/MariaDB.repo

вставить в файл:
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

потом
yum update
yum install MariaDB-server MariaDB-client
systemctl enable mariadb.service
systemctl start mariadb
mysql_secure_installation

Если пробел встал у вас на пути. Как правильно перейти в каталог (рас|место)положения скрипта?

  • BASH
Вы всё ещё делаете это так?


cd $(dirname $(readlink -e $0))


Это ленивый вариант, который работает «в большинстве случаев». Однако же он не является верным, поскольку пути (пусть это не покажется вам странным) в общем случае могут содержать пробельные символы.

Надо бы вот так:

cd "$(eval "readlink -e '$0'" | sed -r -e 's%(^|/)[^/]+$%%' -e 's%([^/])/+$%\1%')"


Попробуйте — это просто работает как надо, сколько бы ни встретилось пробелов на тернистом пути вашего скрипта.

Снять дамп разговора asterisk

Если нужно записать трафик, сделать полный дамп разговора для дальнейшего анализа например в wireshark, самый простой способ это tcpdump
tcpdump -i eth0 udp port 5060 or udp portrange 10000-20000 -s 0 -w shiffer.cap

Если нужен только sip траффик, можно так
tcpdump -i eth0 udp port 5060 -s 0 -w shiffer.cap

FreePBX / Elastix / Asterisk проблема при исходящих звонках

  • Asterisk
Проблема при большом количестве правил в исходящей маршрутизации, больше 100 правил в outbound routes, и появляется ошибка в логах ошибка:
Auto fallthrough, channel 'SIP/300-00000007' status is UNKNOWN
Maximum PBX stack exceeded

По умолчанию AST_PBX_MAX_STACK выставлен в 128, но можно его увеличить и пересобрать asterisk. Находим параметр в файлах:
./include/asterisk/extconf.h
./include/asterisk/pbx.h

Делаем
make
make install

Идеальный PS4

  • BASH
Нашёл я как-то на просторах интернет интереснейший вариант наполнения префикса PS4 полезным содержимым. Считаю необходимым сделать эту информацию достоянием широкой общественности, а посему спешу поделиться ею со своими читателями, дабы и они тоже смогли проникнуться всей силой и мощью set -x:


export PS4='+(${BASH_SOURCE}: #${LINENO}): ${FUNCNAME[0]:-main}(): '


Напомню: PS4 — это префиксный кусок текста, добавляемый в каждую интерполированную строку, которую BASH выводит в режиме отладки/трассировки, включаемый по команде set -x и отключаемый по команде set +x соответственно.

Быстрой вам отладки и доброго продакшна!

Уведомления о пропущенных вызовах FreePBX 13

  • Asterisk
В интернете есть много примеров как сделать уведомления о пропущенных вызовах, но только для внешних вызовов и только для очередей. Мне же потребовалось сделать это для всех вызовов, только я убрал звонки юзер-юзер, только группы и очереди, внутренние или внешние без разницы. Так же без разницы кто положил трубку.
[macro-hangupcall]
include => macro-hangupcall-custom
exten => s,1(start),NoOp("------------------------")
exten => s,n,Set(chan=${CUT(CHANNEL,/,1)})
exten => s,n,NoOp(${chan})
exten => s,n,GotoIf($["${NODEST}" = ""]?nosip)
exten => s,n,GotoIf($[${chan} != SIP]?nosip)
exten => s,n,ExecIf($["${CDR(disposition)}"="NO ANSWER"]?System(/usr/bin/php -q /var/lib/asterisk/agi-bin/sendemail.php "Пропущен звонок q${NODEST} от ${CALLERID(name)}  Время ${CDR(billsec)}" ))
exten => s,n(nosip),GotoIf($["${USE_CONFIRMATION}"="" | "${RINGGROUP_INDEX}"="" | "${CHANNEL}"!="${UNIQCHAN}"]?theend)

exten => s,n(delrgi),Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
exten => s,n(theend),ExecIf($["${ONETOUCH_RECFILE}"!="" & "${CDR(recordingfile)}"=""]?Set(CDR(recordingfile)=${ONETOUCH_RECFILE}))
exten => s,n,Hangup
exten => s,n,MacroExit()

Asterisk/FreePBX возврат при переводе вызова

  • Asterisk
Часто требуется функция возврата звонка при переводе, если абонент не взял трубку.

globals_custom.conf:
TRANSFER_CONTEXT = custom-test_transfer

extensions_custom.conf:
[custom-test_transfer]
exten => _X.,1,NoOp(Entering custom-test_transfer)
exten => _X.,n,Set(timeoutd=25) ; set timeout in seconds
exten => _X.,n,Set(extLeng=${LEN(${EXTEN})})
exten => _X.,n,NoOp(The extenlength is ${extLeng})
exten => _X.,n,Dial(Local/${EXTEN}@from-internal,${timeoutd})
exten => _X.,n,Set(CALLERID(name)=RB:${CALLERID(name)})
exten => _X.,n,Dial(Local/${BLINDTRANSFER:4:${extLeng}}@from-internal)
exten => _X.,n,Hangup()

Потоки исполнения как инструмент опытного "повара"

Ещё раз прочитайте внимательно вопрос в заголовке. Прочитали? А теперь без всякого промедления правильный ответ:

Потоки или нити — куски кода, использующие одни и те же данные в памяти, исполняемые процессором компьютера попеременно, либо одновременно, либо и так, и так.

Читать дальше →

Уведомление на почту о заполнении диска в Linux

  • Linux
Для отправки уведомления у вас должна работать стандартная утилита mail. Адреса кому отправлять уведомление для удобства можно прописать в /etc/aliases, я добавляю строку admins и в нее прописываю нужные адреса.
Сам скрипт (найден где-то на форуме, немного переделан под себя):
#!/bin/bash

##Global vars
threshold=90  ##Порог критического значения свободного места, после 90% шлем уведомление
subject="Disk status $( hostname )"
temp_file=/tmp/disk_status

##Function      : check_disk_space
##Description   : it will check all partitions and it will return                  # non-zero exist status if use >= threshold 

check_disk_space(){
         awk -v threshold=$threshold 'BEGIN{
         status = 0
         cmd = "LC_ALL=C df -Ph" 
         while( cmd | getline ) {
             used=$5 
             if ( $1 != "Filesystem" && int(used) >= threshold ) {
                 printf "CRITICAL : Disk space alert (%s) :: [ Partition %s | mount point %s ]n", 
                 used,$1, $NF > "/dev/stderr"
                 status = 1
             }
         }
    exit status
    }'
}

check_disk_space > $temp_file 2>&1

if [[ -s $temp_file ]]
   then
       mail -s $subject admins < $temp_file
fi

Адресная книга для телефонов Grandstream из FreePBX 13

Адресная книга удобная опция, которую часто спрашивают заказчики, поэтому разберемся как прописать ее для телефонов Grandstream

Сначала нам нужен скрипт который выгрузит номера и их Caller ID (он же поле «Имя») из настроек внутренних номеров FreePBX. Я делал на версии FreePBX 13, возможно будет работать и на более ранних.
<?php
$config = include("db/config.php");

$db = new PDO($config["db"], $config["username"], $config["password"], $config["options"]);

$sql = "SELECT extension, name from users";   // Делаем выборку записей книги
$q = $db->prepare($sql);
$q->execute();
$rows = $q->fetchAll();

unlink($config["pb_file_gs"]);  // Удалим старый файл

$fp = fopen($config["pb_file_gs"],"w+");
fputs($fp, '<?xml version="1.0" encoding="UTF-8"?><AddressBook>');

foreach($rows as $row) {         // Пробежим по всем записям, подготовив XML файл нужного вида
    	fputs($fp, '<Contact>
                        <FirstName>'.$row['name'].'</FirstName>
                        <LastName></LastName>
                        <Phone>
                                   <phonenumber>'.$row['extension'].'</phonenumber>
                                   <accountindex>1</accountindex>
                                   <downloaded>1</downloaded>
                        </Phone>
                        <Groups>
                                   <groupid>4</groupid>
                        </Groups>
            </Contact>
	'); 
}
fputs($fp, '<Group id="4">Server</Group> </AddressBook>');
fclose($fp);
?>


Файл «db/config.php»
<?php
return array(
    "db" => "mysql:host=localhost;dbname=asterisk",
    "pb_file_gs" => "/var/www/html/phonebook/phonebook.xml",
    "username" => "freepbxuser",     //Mysql login
    "password" => "123456", //Mysql password
    "options" => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
);


Потом заходим в телефон «Phonebook -> Phonebook Management»

Enable Phonebook XML Download -> Enabled, HTTP
Phonebook XML Server Path -> http://serverpbx/phonebook/
Phonebook -> Phonebook Management
Phonebook Download Interval -> 60
Remove Manually-edited Entries on Download -> No

В крон прописываем запуск скрипта, который будет выгружать книгу. Для проверки можно посмотреть логи httpd, чтобы удостовериться, что телефон загружает нужный файл. Чтобы не ждать, можно телефон перегрузить, тогда он при загрузке подтянет телефонную книгу.

Как проверить какие компьютеры в сети уязвимы к WannaCry Wcry?

Есть много способов, wsus, sccm, kaspersky, nod32 и т.д. Но я решил попробовать другой метод, на хабре был скрипт на powershell, который опрашивал сеть и выдавал список уязвимых ПК. Я его немного переделал и попробовал на своей сети. Возможно пригодится и вам.
Список компьютеров нужно поместить в файл comp.csv формата:
name
p1
pc2
...

И сам скрипт
# Powershell
# Скрипт проверки на подверженность атаки Wana decrypt0r 2.0 (WannaCry)
# Не проверяет заражена ли система (мне пока не чем проверить)
# При запуске с клиентского ПК требует установленной RSAT и возможно WMF5
# habrahabr / @sergey-s-kovalev / 15.05.2017 / free for use
cls

$ResultPath = "D:\wannacry\" # Указываем путь до папки, куда складывать отчеты

# Задаем списки для сохранения списков ПК
$SafeHosts = @()
$VulnerabilityHosts = @()
$OfflineHosts = @()
$NotManagedHosts = @()

$SafeDate = Get-Date -Date 11-2-2017 -Hour 0 -Minute 0 -Second 1 # Определяем безопасную дату файла

#имя файла с списком ПК
import-csv d:\wannacry\comp.csv | foreach { 

$ComputerName=$_.name

Write-host "Проверяем",$ComputerName

if ((Test-connection $ComputerName -count 2 -quiet) -eq "True")
  { 
      $Command = {(Get-Item c:\WINDOWS\system32\drivers\srv.sys).LastWriteTime} # Команда которая получает дату файла
     
     $Result = "Empty" # Задаем значение по умолчанию

     # Пробуем запустить команду на удаленном ПК
     Try {$Result = Invoke-Command -ComputerName $ComputerName -ScriptBlock $Command -ErrorAction Stop} Catch {write-host -foreground yellow $ComputerName, "включен, но управление через WinRM недоступно";$NotManagedHosts = $NotManagedHosts + $ComputerName}
     
     
     if ($Result -ne "Empty") { # Если результат не пустой
     # Сравнить дату файла с контрольной датой
        if ($Result -lt $SafeDate) {write-host -foreground red $ComputerName,"уязвим! Дата файла",$Result;$VulnerabilityHosts = $VulnerabilityHosts + $ComputerName} else {write-host -foreground green $ComputerName, "имеет необходимое обновление. Дата файла",$Result;$SafeHosts = $SafeHosts + $ComputerName} 
        }
    # Если результат пинга пустой
  } else {
	write-host -foreground DarkRed $ComputerName, "не в сети, не имеет IP-адреса или фаерволлом запрещен PING";$OfflineHosts = $OfflineHosts + $ComputerName
  } 
}
$LogTime = get-date -format yyyy-MM-dd_HH-mm-ss # Получить текущее время

# Выгрузить списки компьютеров в той или иной категории
$SafeHosts | Out-file -FilePath $ResultPath$LogTime"_-SafeHosts.log" -Encoding utf8 -Force
$VulnerabilityHosts | Out-file -FilePath $ResultPath$LogTime"_-VulnerabilityHosts.log" -Encoding utf8 -Force
$OfflineHosts | Out-file -FilePath $ResultPath$LogTime"_-OfflineHosts.log" -Encoding utf8 -Force
$NotManagedHosts | Out-file -FilePath $ResultPath$LogTime"_-NotManagedHosts.log" -Encoding utf8 -Force

WannaCry лечится Eset NOD32?

Eset сегодня написали на своем сайте следующее:
5. Для детектирования еще неизвестных угроз в наших продуктах используются поведенческие, эвристические технологии. Если вирус ведет себя как вирус — скорее всего, это вирус. Так, облачная система ESET LiveGrid успешно отражала атаку с 12 мая, еще до обновления сигнатурных баз.
Это довольно странно, потому что я видел сам как успешно заразились десятки компьютеров предприятия, на котором использовали NOD32. Базы антивируса были обновлены. Но Windows не была обновлена, да… В этом проблема.
Там же пробовали сканировать зараженный комп касперским с последними базами, тоже не видел. Единственное кто 12-14 мая успешно лечил комп, это Dr.WEB.

Ссылки на официальные обновления Windows от вируса WannaCry Wcry

Патч MS17-010 для исправления уязвимости Windows от вируса WCry, Petya

Обновление для системы безопасности Windows XP SP3 (KB4012598)
www.microsoft.com/ru-RU/download/details.aspx?id=55245

Windows 8.1 Update for x64-based Systems (KB4012213)
www.catalog.update.microsoft.com/Search.aspx?q=KB4012213

Windows 8.1 Update (KB4012213)
www.catalog.update.microsoft.com/Search.aspx?q=KB4012213

Каталог обновлений для Windows 7 и Windows 2008 R2
www.catalog.update.microsoft.com/Search.aspx?q=KB4012215

Ежемесячный набор исправлений качества системы безопасности для Windows 7 (KB4012215), март 2017 г.
March, 2017 Security Monthly Quality Rollup for Windows 7 (KB4012215)
download.windowsupdate.com/d/msdownload/update/software/secu/2017/03/windows6.1-kb4012215-x86_e5918381cef63f171a74418f12143dabe5561a66.msu

Ежемесячный набор исправлений качества системы безопасности для систем Windows 7 на базе процессоров x64 (KB4012215), март 2017 г.
March, 2017 Security Monthly Quality Rollup for Windows 7 for x64-based Systems (KB4012215)
download.windowsupdate.com/c/msdownload/update/software/secu/2017/03/windows6.1-kb4012215-x64_a777b8c251dcd8378ecdafa81aefbe7f9009c72b.msu

Накопительный пакет обновления для Windows 10 Version 1511 (KB4013198)
Накопительный пакет обновления для Windows 10 Version 1511 для систем на базе процессоров x64 (KB4013198)
www.catalog.update.microsoft.com/Search.aspx?q=KB4013198

Накопительный пакет обновления для Windows 10 Version 1607 (KB4013429)
Накопительный пакет обновления для Windows 10 Version 1607 для систем на базе процессоров x64 (KB4013429)
Накопительный пакет обновления для Windows Server 2016 для систем на базе процессоров x64 (KB4013429)
www.catalog.update.microsoft.com/Search.aspx?q=KB4013429

FreePBX 13 не применяет изменения в конфигурации

FreePBX 13 в Centos 7 выдал ошибку:
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
Exception: Unable to connect to Asterisk through the CLI in file /var/lib/asterisk/bin/retrieve_conf on line 30
Stack trace:
1. Exception->() /var/lib/asterisk/bin/retrieve_conf:30

А дело в том, что изменились права на какой-то папке и нужно обновить права, запустим для этого скрипт
/usr/sbin/fwconsole start

Можете добавить его в запуск при загрузке в файл /etc/rc.d/rc.local

Не работает fail2ban... опять

  • Linux
По неведомой причине у меня уже 2ой раз после обновления ломается fail2ban. Сначала перестал работать парсер, но получилось найти в сети у кого была такая же проблема и решение. Проблема была в том, что fail2ban не находил в логах нужных записей, все время показывал, что ничего не обнаружено. Для решения проблемы нужно было вернуть старый парсер, для чего в конфиге добавить такую строку:
[DEFAULT]
backend = gamin

Но разработчики не спят, а кодят! Поэтому после следующего обновления через yum update прилетело обновление fail2ban до 0.9.2. И вдруг перестало работать обнаружение проблем в ssh. При старте выдает «jail ssh does not exist». Попытки перенастроить и нагуглить такую проблему оказались безрезультатны. Поэтому обновил fail2ban вручную до актуальной версии 0.9.6. Вроде работает :)
Для обновления выполните следующее:
cd /usr/src
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban/
python setup.py install
service fail2ban restart