Гостей запрещать не хочу, поэтому озаботился банилкой. Раньше банил только за сип флуд (по количеству пакетов в минуту), но решил добраться и до остальных.
Дефолтный контекст для SIP - from-external, звонки на "правильный" did идут дальше, а остальные банить! :)
И, конечно же, звонки через транки не должны попадать в этот контекст!
[from-external]
exten => 1111111,1,Goto(ext-did,1111111,1)
exten => _X.,1,Ringing
exten => _X.,n,System(/var/lib/asterisk/bin/sipban.sh ${CHANNEL} ${EXTEN})
exten => _X.,n,Wait(900)
exten => _X.,n,Hangup
Ringing и Wait(900) для удобства отладки. Для работы ringing можно убрать и сделать Wait(10). ${EXTEN} передается просто для инфы, он в логе присутствовать будет.
скрипт /var/lib/asterisk/sipban.sh
channels=`asterisk -rx "sip show channels"|awk '/Rx: INVITE/&&/<guest>/'`
oldIFS=$IFS
IFS=$'\n'
for line in $channels
do
peer=`echo $line|awk -F' ' '{print($1)}'`
chan_id=`echo $line|awk -F' ' '{print($3)}'`
chan=`asterisk -rx "sip show channel $chan_id"|grep 'Owner channel ID'|awk '{print($4)}'`
if [[ "$chan" == "$1" ]]
then
logger -t sipguest "peer:$peer channel:$chan extension:$2"
break
fi
done
IFS=$oldIFS
Если при выводе каналов "sip show peers" в конце не выдается локальный пир, то нужно заменить в первой строке на аsterisk -rx "sip show channels"|grep 'Rx: INVITE'
Скрипт кидает в /var/log/messages строку
Sep 28 12:55:42 hostname sipguest: peer:192.187.115.66 channel:SIP/xx.xx.xx.xx-000000c0 extension:00441904891101
А дальше пусть с этим fail2ban разбирается.
Строка разбора для fail2ban:
.* sipguest: peer:<host> channel:SIP.* extension:.*
спросил
2013-09-28 13:56:48 +0400
borispr 281 ● 2 ● 5
а если клиент за натом? всю организацию забанит из-за одного? все эти банилки - от лукавого из-за возможность false positive...
octopas ( 2013-09-28 16:18:16 +0400 )редактироватьдаже если астериск за натом, то пакеты все равно приходят с внешних адресов это во-первых, во-вторых ничто не мешает в fail2ban прописать исключения адресов
borispr ( 2013-09-28 16:58:36 +0400 )редактировать