1
0

ddos.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #!/bin/sh
  2. ##############################################################################
  3. # DDoS-Deflate version 0.6 Author: Zaf <zaf@vsnl.com> #
  4. ##############################################################################
  5. # This program is distributed under the "Artistic License" Agreement #
  6. # #
  7. # The LICENSE file is located in the same directory as this program. Please #
  8. # read the LICENSE file before you make copies or distribute this program #
  9. ##############################################################################
  10. load_conf()
  11. {
  12. CONF="/usr/local/ddos/ddos.conf"
  13. if [ -f "$CONF" ] && [ ! "$CONF" == "" ]; then
  14. source $CONF
  15. else
  16. head
  17. echo "\$CONF not found."
  18. exit 1
  19. fi
  20. }
  21. head()
  22. {
  23. echo "DDoS-Deflate version 0.6"
  24. echo "Copyright (C) 2005, Zaf <zaf@vsnl.com>"
  25. echo
  26. }
  27. showhelp()
  28. {
  29. head
  30. echo 'Usage: ddos.sh [OPTIONS] [N]'
  31. echo 'N : number of tcp/udp connections (default 150)'
  32. echo 'OPTIONS:'
  33. echo '-h | --help: Show this help screen'
  34. echo '-c | --cron: Create cron job to run this script regularly (default 1 mins)'
  35. echo '-k | --kill: Block the offending ip making more than N connections'
  36. }
  37. unbanip()
  38. {
  39. UNBAN_SCRIPT=`mktemp /tmp/unban.XXXXXXXX`
  40. TMP_FILE=`mktemp /tmp/unban.XXXXXXXX`
  41. UNBAN_IP_LIST=`mktemp /tmp/unban.XXXXXXXX`
  42. echo '#!/bin/sh' > $UNBAN_SCRIPT
  43. echo "sleep $BAN_PERIOD" >> $UNBAN_SCRIPT
  44. if [ $APF_BAN -eq 1 ]; then
  45. while read line; do
  46. echo "$APF -u $line" >> $UNBAN_SCRIPT
  47. echo $line >> $UNBAN_IP_LIST
  48. done < $BANNED_IP_LIST
  49. else
  50. while read line; do
  51. echo "$IPT -D INPUT -s $line -j DROP" >> $UNBAN_SCRIPT
  52. echo $line >> $UNBAN_IP_LIST
  53. done < $BANNED_IP_LIST
  54. fi
  55. echo "grep -v --file=$UNBAN_IP_LIST $IGNORE_IP_LIST > $TMP_FILE" >> $UNBAN_SCRIPT
  56. echo "mv $TMP_FILE $IGNORE_IP_LIST" >> $UNBAN_SCRIPT
  57. echo "rm -f $UNBAN_SCRIPT" >> $UNBAN_SCRIPT
  58. echo "rm -f $UNBAN_IP_LIST" >> $UNBAN_SCRIPT
  59. echo "rm -f $TMP_FILE" >> $UNBAN_SCRIPT
  60. . $UNBAN_SCRIPT &
  61. }
  62. add_to_cron()
  63. {
  64. rm -f $CRON
  65. sleep 1
  66. service crond restart
  67. sleep 1
  68. echo "SHELL=/bin/sh" > $CRON
  69. if [ $FREQ -le 2 ]; then
  70. echo "0-59/$FREQ * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1" >> $CRON
  71. else
  72. let "START_MINUTE = $RANDOM % ($FREQ - 1)"
  73. let "START_MINUTE = $START_MINUTE + 1"
  74. let "END_MINUTE = 60 - $FREQ + $START_MINUTE"
  75. echo "$START_MINUTE-$END_MINUTE/$FREQ * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1" >> $CRON
  76. fi
  77. service crond restart
  78. }
  79. load_conf
  80. while [ $1 ]; do
  81. case $1 in
  82. '-h' | '--help' | '?' )
  83. showhelp
  84. exit
  85. ;;
  86. '--cron' | '-c' )
  87. add_to_cron
  88. exit
  89. ;;
  90. '--kill' | '-k' )
  91. KILL=1
  92. ;;
  93. *[0-9]* )
  94. NO_OF_CONNECTIONS=$1
  95. ;;
  96. * )
  97. showhelp
  98. exit
  99. ;;
  100. esac
  101. shift
  102. done
  103. TMP_PREFIX='/tmp/ddos'
  104. TMP_FILE="mktemp $TMP_PREFIX.XXXXXXXX"
  105. BANNED_IP_MAIL=`$TMP_FILE`
  106. BANNED_IP_LIST=`$TMP_FILE`
  107. echo "Banned the following ip addresses on `date`" > $BANNED_IP_MAIL
  108. echo >> $BANNED_IP_MAIL
  109. BAD_IP_LIST=`$TMP_FILE`
  110. netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST
  111. cat $BAD_IP_LIST
  112. if [ $KILL -eq 1 ]; then
  113. IP_BAN_NOW=0
  114. while read line; do
  115. CURR_LINE_CONN=$(echo $line | cut -d" " -f1)
  116. CURR_LINE_IP=$(echo $line | cut -d" " -f2)
  117. if [ $CURR_LINE_CONN -lt $NO_OF_CONNECTIONS ]; then
  118. break
  119. fi
  120. IGNORE_BAN=`grep -c $CURR_LINE_IP $IGNORE_IP_LIST`
  121. if [ $IGNORE_BAN -ge 1 ]; then
  122. continue
  123. fi
  124. IP_BAN_NOW=1
  125. echo "$CURR_LINE_IP with $CURR_LINE_CONN connections" >> $BANNED_IP_MAIL
  126. echo $CURR_LINE_IP >> $BANNED_IP_LIST
  127. echo $CURR_LINE_IP >> $IGNORE_IP_LIST
  128. if [ $APF_BAN -eq 1 ]; then
  129. $APF -d $CURR_LINE_IP
  130. else
  131. $IPT -I INPUT -s $CURR_LINE_IP -j DROP
  132. fi
  133. done < $BAD_IP_LIST
  134. if [ $IP_BAN_NOW -eq 1 ]; then
  135. dt=`date`
  136. if [ $EMAIL_TO != "" ]; then
  137. cat $BANNED_IP_MAIL | mail -s "IP addresses banned on $dt" $EMAIL_TO
  138. fi
  139. unbanip
  140. fi
  141. fi
  142. rm -f $TMP_PREFIX.*