#!/bin/sh modprobe nf_conntrack_ftp modprobe ip_conntrack_ftp # maximum number of simultaneous entries per banlist modprobe ipt_recent ip_list_tot=200; # # This implies -F, -X, -P and all rules (-A).. # /sbin/iptables-restore <<-EOF *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :ddos_watch - [0:0] :limit01 - [0:0] :permanent - [0:0] -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # # Filter invalid connections # -A INPUT -m conntrack ! --ctstate NEW -j RETURN # # If banned, drop. Ban time: 1 day = 86400 sec # ############################ RATE LIMIT ######################### -A INPUT -j permanent -A INPUT -m recent --name ban01 --rcheck --seconds 86400 -j DROP -A limit01 -m hashlimit --hashlimit 50/second --hashlimit-burst 50 --hashlimit-mode srcip,dstport --hashlimit-name limit01 -j RETURN -A limit01 -m recent --name ban01 --set -A limit01 -j LOG --log-prefix "[Banned: http limit] " -A limit01 -p tcp -m tcp -j REJECT --reject-with tcp-reset -A INPUT -d x.x.x.x -p tcp -m tcp -m multiport --dports 80,443 -j limit01 ########################### DDOS PROTECTION (SOS) ################################### # # If a packet passed limit01 (was below 50/s) and the whole thing is below 5000/s, finally accept it # -A ddos_watch -m hashlimit --hashlimit-name ddos_watch --hashlimit 5000/second --hashlimit-mode dstport -j ACCEPT -A ddos_watch -p tcp -m tcp -j REJECT --reject-with tcp-reset -A INPUT -d x.x.x.x -p tcp -m tcp -m multiport --dports 80,443 -j ddos_watch ############################ UN-RATE LIMITED PORTS HERE ############################# ##################################################################################### # # If someone steps on a closed port, remember his address # -A INPUT -m recent --name closed_tap --set # Ban saved in /proc/net_ipt_recent/ban01 COMMIT EOF echo "Stopping old watch-bans instance"; #killproc -p /tmp/watch-bans.pid /usr/bin/perl; killall watch-bans echo echo echo Starting watch-bans screen -A -m -d -S watch-bans /etc/init.d/watch-bans echo echo echo