This is script /usr/local/sbin/block_sip_ip.sh. It has some options, but i doubt if you really need all of them
you can just add it to your crontab:
*/3 * * * * /usr/local/sbin/block_sip_ip.sh -n 1000
where
-n 1000 - amount of las lines of asterisk log to parse. You need to adjust that part accordingly of intensity of your calls. by default its only 200 lines.
-q - how many attempts allowed before IP will be banned. 3 by default
you can just add it to your crontab:
*/3 * * * * /usr/local/sbin/block_sip_ip.sh -n 1000
where
-n 1000 - amount of las lines of asterisk log to parse. You need to adjust that part accordingly of intensity of your calls. by default its only 200 lines.
-q - how many attempts allowed before IP will be banned. 3 by default
#!/bin/bash
# checking, is someone is getting "wrong password" in last 200 lines of asterisk log:
DEBUG=0
# email to notify about banned IPs
ADMIN_EMAIL="admin@domain.com"
# our internal network. First part only
LOCAL_NET="10.0.0"
# our own external IP:
OWNIP1="111.221.211.111"
LINES=200
INFO="Use: $0 -l /PATH/TO/LOG -q ATTEMPTS -n LINES"
while getopts ":dl:q:n:" optname
do
case "$optname" in
"d")
DEBUG=1
echo "debugging is on"
;;
"n")
LINES=$OPTARG
;;
"l")
LOG_FILE=$OPTARG
;;
"q")
ATTEMPTS=$OPTARG
;;
"?")
echo "Unknown option $OPTARG"
echo $INFO
exit 0
;;
":")
echo "No argument value for option $OPTARG"
echo $INFO
exit 0
;;
*)
echo "Unknown error while processing options"
exit 0
;;
esac
done
if [ -z "$LOG_FILE" ]
then
LOG_FILE="/var/log/sip_hackers_ips"
fi
[ "$DEBUG" -eq 1 ] && echo "logfile : $LOG_FILE"
[ "$DEBUG" -eq 1 ] && echo "lines : $LINES"
if [ -z "$ATTEMPTS" ]
then
ATTEMPTS=2
fi
[ "$DEBUG" -eq 1 ] && echo "failed ext. allowed : $ATTEMPTS"
for i in `tail -$LINES /var/log/asterisk/full | grep -v $LOCAL_NET | grep -E '(Wrong password| failed for )' | grep -Eo '(([0-9]{1,3}\.){3}[0-9]{1,3})' | sort | uniq | grep -v "$OWNIP1"`
do
# checking amount of attempted extensions
EXT_CNT=$(tail -$LINES /var/log/asterisk/full | grep -oc "$i")
# if its geater than 3, block it!!
if [ "$EXT_CNT" -gt "$ATTEMPTS" ];
then
IPTABLES_CNT=$(/sbin/iptables -nvL | grep -c $i);
if [ "$IPTABLES_CNT" -eq 0 ];
then
[ "$DEBUG" -eq 1 ] && echo "To BLOCK: $i";
echo -n "[`date`]">> $LOG_FILE
echo $i >> $LOG_FILE
/sbin/iptables -I INPUT -s $i -j DROP
/sbin/iptables -A OUTPUT -d $i -j DROP
[ "$DEBUG" -eq 1 ] && echo "IP $i has been blocked"
echo "VPBX: $i has been blocked" | mail -s "VPBX: $i has been blocked" $ADMIN_EMAIL
fi
fi
done