# [網路安全系列] CCkiller 安裝
###### tags: `cc`
## :beginner: Product Info
- 功能申明
分享之前我必須先申明一下,眾所周知,DDoS攻擊指的是分佈式拒絕服務。而CC攻擊只是DDoS攻擊的一種,本文所闡述的CC攻擊,指的是單個IP達到我們設定好的閾值並發請求,而非海量IP的低並發攻擊!對於個人低配服務器,除了使用CDN來防護,至少我是沒有想到如何抵擋海量IP攻擊的!因為每個IP都模擬正常的用戶瀏覽器請求,並不會觸發防禦閾值,同時來1000個,甚至上萬個,個人低配服務器的帶寬在第一時間就會被佔滿,就無法繼續提供服務了。
當然,用腳本也是無法防禦DDoS大流量攻擊的,因為所有機房的防禦帶寬是有限的,當攻擊的流量超過了機房的防禦帶寬,要么機房把你的服務器IP拉黑洞,要么就一起死。因此,如果你的服務器正遭受大流量攻擊,比如幾十G上百G,一般機房或CDN節點都是扛不住的,腳本也無能為力了,趕緊換高防服務器吧!
- 功能介紹
通過以上申明,也就大致給CCKiller一個定位:CCKiller是用於個人低配服務器的輕量級CC攻擊防禦,可以抵擋單個IP產生的高並發攻擊。
目前設計的功能特性如下:
- [ ] 秒級檢查
- [ ] 拉黑時長
- [ ] 並發閾值
- [ ] 郵件發送這邊有設定tg告警
- [ ] 並發顯示
- [ ] 手動拉黑
### :small_blue_diamond: 詳細說明
:::warning
①、秒級檢查
很多人寫的防禦腳本都是使用了Linux系統的計劃任務crontab來定時檢查的。而crontab的最細顆粒是1分鐘,也就是說腳本最快也只能1分鐘檢查一次。對於一些強迫症來說就會很不爽。
所以,我還是按照以前分享的思路,利用while循環實現秒級檢查,實現更細的顆粒。當然,CCKiller更是被我寫成了系統服務,更加靈活穩定。
②、拉黑時長
CCKiller可以設置拉黑時長,默認為10分鐘。當發現有惡意請求時,會自動拉黑目標IP,並在拉黑時長結束後自動釋放,這個功能算是對我之前寫的腳本的一個大的改進。
③、並發閾值
CCKiller 可以設定單個IP的最高請求數,如果某個IP同時請求數超過了設定的閾值,就會被暫時拉黑一段時間。
④、郵件發送
這個功能沒啥好說的,意義並不大。而且發送成功率和服務器的環境也有很大關係。
⑤、並發顯示
安裝後,直接運行cckiller會列出當前系統的請求排行,可以清晰的看到當前請求IP和並發數。使用-s參數還可以繼續定制需求,比如cckiller -s 10 就能顯示當前並發數排行前10名的IP。
⑥、手動拉黑
支持手動拉黑,執行後會立即檢查,將並發請求超過n的IP拉黑一段時間,比如cckiller -k 100 就會將目前超過100個請求的IP拉黑一段時間,如果沒有則不會執行任何拉黑操作。
:::
## :triangular_flag_on_post: 工具安裝
## :feet: 在線安裝
由於我可能經常會更新一些功能,或修復一些BUG,所以僅提供在線安裝,以保證腳本是最新的。
安裝非常簡單,執行如下命令就能進入配置步驟了:
```shell=
curl -ko install.sh https://zhang.ge/wp-content/uploads/files/cckiller/install.sh?ver=1.0.8 && sh install.sh -i
```
默認配置如下:
:::success
The Time interval : 20 s #每20s檢查一次系統請求情況
The Forbidden Time: 600 s #拉黑時長設為10分鐘
Adminstrator Email: root@localhost #郵件對象設置為root@localhost(即關閉郵件發送)
Connections Allow: 100 #單個IP並發限制為100
:::
如果不符合你的需求,你可以使用ctrl + c 組合鍵終止腳本,或者先繼續安裝,因為工具設計了配置修改的功能,所以無需著急。
## :feet: 安裝腳本 install.sh
```shell=
#!/bin/sh
###################################################################
# CCKiller version 1.0.8 Author: Jager <ge@zhang.ge> #
# For more information please visit https://zhang.ge/5066.html#
#-----------------------------------------------------------------#
# Copyright ©2015-2019 zhang.ge. All rights reserved. #
###################################################################
conf_env()
{
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DKName=CCKiller
export Base_Dir=/usr/local/cckiller
export DKVer=1.0.8
clear
}
check_env()
{
which sendmail || yum install -y sendmail
mailx -V || yum install -y mailx
test -x $0 || chmod +x $0
#Centos 7 install iptables
if [ -n "`grep 'Aliyun Linux release' /etc/issue`" -o -e /etc/redhat-release ];then
which iptables >/dev/null
if [ -n "`grep ' 7\.' /etc/redhat-release`" -a $? -ne 0 ] ; then
yum -y install iptables-services
systemctl mask firewalld.service
systemctl enable iptables.service
fi
fi
/etc/init.d/iptables start > /dev/null 2>&1
}
header()
{
printf "
###################################################################
# $DKName version $DKVer Author: Jager <ge@zhang.ge> #
# For more information please visit https://zhang.ge/5066.html#
#-----------------------------------------------------------------#
# Copyright @2015-2019 zhang.ge. All rights reserved. #
###################################################################
"
}
showhelp()
{
conf_env
header
echo 'Usage: cckiller [OPTIONS]'
echo
echo 'OPTIONS:'
echo "-h | --help : Show help of $DKName"
echo "-u | --update : update Check for $DKName"
echo "-c | --config : Edit The configure of $DKName again"
echo "-i | --install : install $DKName version $DKVer to This System"
echo "-U | --uninstall : Uninstall cckiller from This System"
echo
}
get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
Check_U()
{
userid=$(id | awk '{print $1}' | sed -e 's/=/ /' -e 's/(/ /' -e 's/)/ /'|awk '{print $2}')
if [[ $userid -ne 0 ]]
then
echo "No root permissions,Please run with root user..."
exit
fi
}
Update()
{
conf_env
curl -ko $Base_Dir/log/version.txt --connect-timeout 300 --retry 5 --retry-delay 3 https://zhangge.net/wp-content/uploads/files/cckiller/version.txt
CONF_FILE=$(awk -F":" '/configure/ {print $2}' $Base_Dir/log/version.txt)
FINAL_VER=$(awk -F":" '/version/ {print $2}' $Base_Dir/log/version.txt)
if [[ -f $Base_Dir/ck.conf ]]
then
source $Base_Dir/ck.conf
else
echo "Error: Not Found $Base_Dir/ck.conf, Please install CCkiller Again."
exit 1
fi
if [[ $DKVer != $FINAL_VER ]]
then
echo =============================================================================
echo "Local Version: $DKVer"
echo
echo "Remote information:"
echo
cat $Base_Dir/log/version.txt
echo
echo =============================================================================
read -p "New Version Found, Do You Want Update Now? (y/n, default y): " CHOICE
if [[ $CHOICE == 'y' ]] || [[ $CHOICE == 'Y' ]] || [[ $CHOICE == "" ]]
then
clear
Version=$FINAL_VER
install update
else
echo "It‘s Skiped."
fi
else
echo "Good, It's the latest versions."
fi
}
Configure()
{
if [[ "$1" == "config" ]] && [[ ! -d "$Base_Dir" ]]
then
echo; echo; echo "Warn: CCkiller not found, Please used -i install first"
echo
exit 0
fi
if [[ "$1" == "default" ]]
then
SLEEP_TIME=20
BAN_PERIOD=600
EMAIL_TO=root@localhost
NO_OF_CONNECTIONS=100
IGNORE_PORT=
LOG_LEVEL=INFO
echo
echo "You choice the default configuration:"
echo 'Configure info,Please Review:'
echo "======================================="
echo " The Time interval : $SLEEP_TIME s"
echo
echo " The Forbidden Time: $BAN_PERIOD s"
echo
echo " Adminstrator Email: $EMAIL_TO"
echo
echo " Connections Allow: $NO_OF_CONNECTIONS"
echo
echo " Ignore Port: Null "
echo
echo " Log Level: $LOG_LEVEL "
echo "========================================"
echo "Press any key to continue..."
else
echo
read -p "Please Input The Rate(seconds) of CCkiller Check(default: 20): " SLEEP_TIME
if [[ -z $SLEEP_TIME ]] || [[ 0 -eq $SLEEP_TIME ]] ;then
echo "The Time interval of CCkiller Check will set default 20s"
SLEEP_TIME=20
fi
echo
read -p "Please Input the Forbidden Time(seconds) of banned IP(default: 600, if set 0 ip will banned until Restart System or iptables ): " BAN_PERIOD
if [[ -z $BAN_PERIOD ]];then
echo "The Forbidden Time will set default 600s"
BAN_PERIOD=600
fi
echo
read -p "Please Input the E-mail of Adminstrator(default: root@localhost): " EMAIL_TO
if [[ -z $EMAIL_TO ]];then
echo "The Adminstrator E-mail will set default root@localhost"
EMAIL_TO=root@localhost
fi
echo
read -p "Please Input the Maximum number of connections allowed(default 100): " NO_OF_CONNECTIONS
if [[ -z $NO_OF_CONNECTIONS ]];then
echo "The Max number for connections Allowed will set default 100"
NO_OF_CONNECTIONS=100
fi
echo
read -p "Please Input the ignore Ports of check like 21,8080,1080(default null): " IGNORE_PORT
if [[ -z $IGNORE_PORT ]];then
echo "The ignore Ports of check will set default null"
IGNORE_PORT=
fi
echo
read -p "Please Input the level of log like INFO,DEBUG,WARNING,OFF (default INFO): " LOG_LEVEL
if [[ -z LOG_LEVEL ]];then
echo "The ignore Ports of check will set default INFO"
LOG_LEVEL=INFO
fi
clear
echo
echo 'Configure info,Please Review:'
echo "======================================="
echo " The Time interval : $SLEEP_TIME s"
echo
echo " The Forbidden Time: $BAN_PERIOD s"
echo
echo " Adminstrator Email: $EMAIL_TO"
echo
echo " Connections Allow: $NO_OF_CONNECTIONS"
echo
echo " Ignore Port: $IGNORE_PORT"
echo
echo " Log Level : $LOG_LEVEL"
echo "========================================"
echo "Press any key to continue..."
fi
char=`get_char`
mkdir -p $Base_Dir/log
cat << EOF >$Base_Dir/ck.conf
##### Paths of the script and other files
PROGDIR="$Base_Dir"
LOGDIR="$Base_Dir/log"
PROG="$Base_Dir/cckiller"
IGNORE_IP_LIST="$Base_Dir/ignore.ip.list"
IPT=$(which iptables | awk '{print $1}')
IPT_SVR="/etc/init.d/iptables"
DKName=$DKName
DKVer=$DKVer
##### Rate of running the script in proccess mode(default 20s)
SLEEP_TIME=$SLEEP_TIME
##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=$NO_OF_CONNECTIONS
##### An email is sent to the following address when an IP is banned.
EMAIL_TO="$EMAIL_TO"
##### The Forbidden seconds of banned IP(default:600 if set 0 ip will banned forever).
BAN_PERIOD=$BAN_PERIOD
##### The ignore Ports like 21,2121,8000 (default null)
IGNORE_PORT=$IGNORE_PORT
##### The level of log like INFO,DEBUG,WARNING,OFF (default INFO)
LOG_LEVEL=$LOG_LEVEL
EOF
echo
test -f /etc/init.d/cckiller && /etc/init.d/cckiller restart
echo
echo "Configure Completed."
}
install()
{
if [[ -d "$Base_Dir" ]] && [[ -z $1 ]]; then
echo; echo; echo "Warn: cckiller is already installed, Please used -U uninstall first"
echo
exit 0
fi
if [[ $CONF_FILE == 'updated' ]] || [[ -z $CONF_FILE ]];then
read -p 'Do you want to use the default configuration? (y/n): ' CHOICE
if [[ $CHOICE == "n" ]]
then
Configure
else
Configure default
fi
fi
source $Base_Dir/ck.conf
clear
echo; echo "Installing $DKName version ${FINAL_VER:-$DKVer} by zhang.ge"; echo
echo; echo "Checking the operating environment..."
check_env >/dev/null 2>&1
echo; echo "Downloading source files..."
curl -ko $Base_Dir/cckiller --connect-timeout 300 --retry 5 --retry-delay 3 https://zhangge.net/wp-content/uploads/files/cckiller/cckiller?ver=${FINAL_VER:-$DKVer}
test -d /etc/init.d || mkdir -p /etc/init.d
curl -ko /etc/init.d/cckiller --connect-timeout 300 --retry 5 --retry-delay 3 https://zhangge.net/wp-content/uploads/files/cckiller/cckiller_servicefile?ver${FINAL_VER:-$DKVer}
chmod 0755 $Base_Dir/cckiller
chmod 0755 /etc/init.d/cckiller
chkconfig cckiller on 2>/dev/null || \
test -f /etc/rc.d/rc.local && \
echo "/etc/init.d/cckiller start" >>/etc/rc.d/rc.local
ln -sf $Base_Dir/cckiller /bin/cckiller
cp -f $0 $Base_Dir/ >/dev/null 2>&1
if [[ -z $1 ]]
then
ip addr | awk -F '[ /]+' '/inet / {print $3}' | grep -v '127.0.' > $Base_Dir/ignore.ip.list
fi
echo "...done"
echo
echo
if [[ -z $1 ]]
then
/etc/init.d/cckiller start
echo
echo "Installation has completed."
echo
echo "Config file is at $Base_Dir/ck.conf"
else
/etc/init.d/cckiller restart
echo
echo "Update success."
fi
echo
echo 'Your can post comments or suggestions on https://zhang.ge/5066.html'
echo
}
function uninstall()
{
echo "Uninstalling cckiller..."
echo;
test -f /etc/init.d/cckiller && /etc/init.d/cckiller stop
echo; echo; echo -n "Deleting script files....."
if [ -e "$Base_Dir/cckiller" ]; then
rm -f $Base_Dir/cckiller
rm -f /bin/cckiller
echo -n ".."
fi
if [ -d "$Base_Dir" ]; then
rm -rf $Base_Dir
echo -n ".."
fi
echo "done"
echo; echo -n "Deleting system service....."
if [ -e '/etc/init.d/cckiller' ]; then
rm -f /etc/init.d/cckiller
echo -n ".."
fi
echo "done"
echo; echo "Uninstall Complete"; echo
}
conf_env
if [[ -z $1 ]];then
showhelp
exit
fi
header
Check_U
while [ $1 ]; do
case $1 in
'-h' | '--help' | '?' )
showhelp
exit
;;
'--install' | '-i' )
install
exit
;;
'--uninstall' | '-U' )
uninstall
exit
;;
'--update' | '-u' )
Update
exit
;;
'--config' | '-c' )
Configure config
exit
;;
* )
showhelp
exit
;;
esac
shift
done
```
## :feet: 服務控制
:::success
安裝後,會將cckiller註冊成系統服務,這時你就可以使用service來控制cckiller了。使用標準的service定義,支持start | stop | restart | status 四個參數。所以,你可以使用service cckiller stop來停止cckiller,也可以使用service cckiller status來查看狀態。
:::
## :feet: 集成命令
:::success
成功安裝後,系統還會多出一個cckiller的命令,這個命令現有功能如下:
cckiller -h可以調出幫助信息:
:::
## :feet: 操作圖示
:::success
iptables -nvL | grep DROP
查看被禁IP

設定檔預設位置

狀態查詢

配置講解

安裝確認

日誌

TG告警

:::
## :feet: CCkiller (配置添加TG告警)
```shell=
#!/bin/sh
###################################################################
# CCKiller version 1.0.8 Author: Jager <im@zhang.ge> #
# For more information please visit https://zhang.ge/5066.html#
#-----------------------------------------------------------------#
# Copyright ©2015-2019 zhang.ge. All rights reserved. #
###################################################################
#tg發送指令
send_tg(){
curl "https://api.telegram.org/bot1033770595:AAH6-wqoOw37Z2A5LQruDQTt-c9cmcoLdtA/sendMessage?chat_id=-651507342&text=$1"
}
#机器hostname
ip=`hostname`
header()
{
echo "CCKiller version 1.0.8 Author: Jager <ge@zhang.ge>"
echo "Copyright ©2015-2019 zhang.ge. All rights reserved. "
}
load_conf()
{
CONF="/usr/local/cckiller/ck.conf"
if [[ -f "$CONF" ]]; then
source $CONF
if [[ ! -z $IGNORE_PORT ]]
then
IGNORE_PORT=\:\($(echo $IGNORE_PORT|tr ',' '|')\)\|
fi
else
header
echo "$CONF not found."
exit 1
fi
}
#write_log INFO "Messages"
write_log()
{
LOG_FILE=$LOGDIR/cckiller_$(date +%Y-%m-%d).log
logout=""
for((i=2;i<=$#;i++)); do
j=${!i}
logout="${logout} $j "
done
elif [[ $LOG_LEVEL == "DEBUG" ]];then
echo "[`date "+%Y-%m-%d %H:%M:%S"`][$1]: ${logout}" | tee -ai $LOG_FILE
else
echo "[`date "+%Y-%m-%d %H:%M:%S"`][$1]: ${logout}"
fi
}
showhelp()
{
header
echo
echo 'Usage: cckiller [OPTIONS] [N]'
echo 'N : number of tcp/udp connections (default 100)'
echo
echo 'OPTIONS:'
echo "-h | --help: Show this help screen"
echo "-k | --kill: Block the offending ip making more than N connections"
echo '-s | --show: Show The TOP "N" Connections of System Current'
echo "-b | --banip: Ban The IP or IP subnet like cckiller -b 192.168.1.1"
echo "-u | --unban: Unban The IP or IP subnet which is in the BlackList of iptables"
echo
}
banip()
{
LOG_FILE=$LOGDIR/cckiller_$(date +%Y-%m-%d).log
if [[ ! -z $1 ]]
then
$IPT -nvL | grep DROP | grep $1 >/dev/null
if [[ 0 -ne $? ]]
then
$IPT -I INPUT -s $1 -j DROP && \
#echo "[`date "+%Y-%m-%d %H:%M:%S"`]: $1 Was Baned successfully." | tee -ai $LOG_FILE
write_log INFO "$1 Was Baned successfully."
send_tg "$ip 侦测异常IP %0A$1 Was Baned successfully"
return 0
else
write_log DEBUG "$1 is already in iptables list, please check..."
return 1
fi
else
write_log DEBUG "Error: Not Found IP Address... Usage: cckiller -b IPaddress"
fi
}
unbanip()
{
LOG_FILE=$LOGDIR/cckiller_$(date +%Y-%m-%d).log
if [[ -z $1 ]]
then
UNBAN_SCRIPT=$(mktemp /tmp/unban.XXXXXXXX)
cat << EOF >$UNBAN_SCRIPT
#!/bin/sh
sleep $BAN_PERIOD
while read line
do
$IPT -D INPUT -s \$line -j DROP
if [[ "$LOG_LEVEL" != "OFF" ]];then
echo "[\`date "+%Y-%m-%d %H:%M:%S"\`][INFO]: \$line is Unbaned successfully." | tee -ai $LOG_FILE
send_tg "$ip 的 \$line is Unbaned successfully."
else
echo "[\`date "+%Y-%m-%d %H:%M:%S"\`][INFO]: \$line is Unbaned successfully."
fi
done < $BANNED_IP_LIST
rm -f $BANNED_IP_LIST $BANNED_IP_MAIL $BAD_IP_LIST $UNBAN_SCRIPT
EOF
. $UNBAN_SCRIPT &
else
$IPT -nvL | grep DROP | grep $1 >/dev/null
if [[ 0 -eq $? ]]
then
$IPT -D INPUT -s $1 -j DROP
write_log INFO "$1 is Unbaned successfully."
send_tg "$ip 的 $1 手动 Unbaned successfully."
else
write_log DEBUG "$1 is not found in iptables list, please check..."
fi
fi
}
# Copyright by DDoS-Defender version 2.1.0
core_netstat() {
cat /proc/net/tcp6 /proc/net/tcp 2>/dev/null > /dev/shm/core_netstat
awk '{print $2,$3,$4}' /dev/shm/core_netstat | awk '
BEGIN {
#分割符
FS = "[ ]*|:" ;}
#开始统计IP数
( $0 !~ /local_address/ ){
#统计ipv4
if (length($1) == 8)
{
local_ip_col4 = strtonum("0x"substr($1,1,2)) ;
local_ip_col3 = strtonum("0x"substr($1,3,2)) ;
local_ip_col2 = strtonum("0x"substr($1,5,2)) ;
local_ip_col1 = strtonum("0x"substr($1,7,2)) ;
rem_ip_col4 = strtonum("0x"substr($3,1,2)) ;
rem_ip_col3 = strtonum("0x"substr($3,3,2)) ;
rem_ip_col2 = strtonum("0x"substr($3,5,2)) ;
rem_ip_col1 = strtonum("0x"substr($3,7,2)) ;
}
else
#统计ipv6
{
local_ip_col4 = strtonum("0x"substr($1,1,2)) ;
local_ip_col3 = strtonum("0x"substr($1,3,2)) ;
local_ip_col2 = strtonum("0x"substr($1,5,2)) ;
local_ip_col1 = strtonum("0x"substr($1,7,2)) ;
rem_ip_col4 = strtonum("0x"substr($3,25,2)) ;
rem_ip_col3 = strtonum("0x"substr($3,27,2)) ;
rem_ip_col2 = strtonum("0x"substr($3,29,2)) ;
rem_ip_col1 = strtonum("0x"substr($3,31,2)) ;
}
local_port = strtonum("0x"$2) ;
#rem_port = strtonum("0x"$4) ;
#分析连接状态
if ( $5 ~ /06/ ) tcp_stat = "TIME_WAIT"
else if ( $5 ~ /02/ ) tcp_stat = "SYN_SENT"
else if ( $5 ~ /03/ ) tcp_stat = "SYN_RECV"
else if ( $5 ~ /04/ ) tcp_stat = "FIN_WAIT1"
else if ( $5 ~ /05/ ) tcp_stat = "FIN_WAIT2"
else if ( $5 ~ /01/ ) tcp_stat = "ESTABLISHED" ;
else if ( $5 ~ /07/ ) tcp_stat = "CLOSE"
else if ( $5 ~ /08/ ) tcp_stat = "CLOSE_WAIT"
else if ( $5 ~ /09/ ) tcp_stat = "LAST_ACK"
else if ( $5 ~ /0A/ ) tcp_stat = "LISTEN"
else if ( $5 ~ /0B/ ) tcp_stat = "CLOSING"
else if ( $5 ~ /0C/ ) tcp_stat = "MAX_STATES"
printf("%d.%d.%d.%d [%d] %d.%d.%d.%d %s\n",local_ip_col1,local_ip_col2,local_ip_col3,local_ip_col4,local_port,rem_ip_col1,rem_ip_col2,
rem_ip_col3,rem_ip_col4,tcp_stat);}'
}
check_ip()
{
#check_ip if in the $IGNORE_IP_LIST
grep -q $CURR_LINE_IP $IGNORE_IP_LIST && return 0
#check ip belongs to IP subnet
result=$(grep '/' $IGNORE_IP_LIST | awk -F'[./]' -v ip=$1 '
{for (i=1;i<=int($NF/8);i++){a=a$i"."}
if (index(ip, a)==1){split( ip, A, ".");if (A[4]<2^(8-$NF%8)) print "hit"}
a=""}' )
if [[ "$result" = "hit" ]]
then
return 0
else
return 1
fi
}
show_stats()
{
if [[ ! -z $1 ]] && [[ ! -z $2 ]]
then
core_netstat | awk '{print $1,$2,$3}' | \
egrep -v "\[${IGNORE_PORT}\]|127.0.0.1|0.0.0.0"|sort|uniq -c
else
core_netstat | \
egrep -v "\[${IGNORE_PORT}\]|127.0.0.1|0.0.0.0"|sort|uniq -c|sort -rn|\
awk '{printf("%d %s\n",$1,$4)}'
fi
}
cc_check()
{
TMP_PREFIX='/tmp/cckiller'
TMP_FILE="mktemp $TMP_PREFIX.XXXXXXXX"
BANNED_IP_MAIL=$($TMP_FILE)
BANNED_IP_LIST=$($TMP_FILE)
LOG_FILE=$LOGDIR/cckiller_$(date +%Y-%m-%d).log
echo "Banned the following ip addresses on `date`" > $BANNED_IP_MAIL
echo >> $BANNED_IP_MAIL
BAD_IP_LIST=$($TMP_FILE)
show_stats | awk -v str=$NO_OF_CONNECTIONS '{if ($1>=str){print $0}}' > $BAD_IP_LIST
IP_BAN_NOW=0
while read line; do
CURR_LINE_CONN=$(echo $line | cut -d" " -f1)
CURR_LINE_IP=$(echo $line | cut -d" " -f2)
check_ip $CURR_LINE_IP
if [ $? -eq 0 ]; then
continue
fi
banip $CURR_LINE_IP
if [ $? -eq 1 ]; then
continue
else
let IP_BAN_NOW+=1
fi
write_log INFO "Banned $CURR_LINE_IP with $CURR_LINE_CONN connections" >> $BANNED_IP_MAIL
echo $CURR_LINE_IP >> $BANNED_IP_LIST
done < $BAD_IP_LIST
if [[ $IP_BAN_NOW -ge 1 ]]; then
dt=$(date)
if [[ $EMAIL_TO != "" ]] && [[ $EMAIL_TO != "root@localhost" ]]; then
cat $BANNED_IP_MAIL | mailx -s "IP addresses banned on $dt" $EMAIL_TO
fi
if [[ $BAN_PERIOD -gt 0 ]];then
unbanip
fi
else
rm -f $BANNED_IP_LIST $BANNED_IP_MAIL $BAD_IP_LIST
fi
}
process_mode()
{
while true
do
cc_check
sleep $1
done
}
process_mode()
{
while true
do
cc_check
sleep $1
done
}
#kill now
check_now()
{
if [[ ! -z $1 ]]
then
NO_OF_CONNECTIONS=$1
fi
cc_check
}
load_conf
while [ $1 ]; do
case $1 in
'-h' | '--help' | '?' )
showhelp
exit
;;
'--kill' | '-k' )
check_now $2
;;
'--show' | '-s')
show_stats show $2
break;
;;
'--banip' | '-b' )
banip $2
break
;;
'--unban' | '-u' )
unbanip $2
break
;;
'--process' | '-p' )
process_mode $SLEEP_TIME
break
;;
*[0-9]* )
check_now $1
;;
* )
showhelp
exit
;;
esac
shift
done
[[ -z $1 ]] && show_stats
```