1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
#!/bin/bash
#
# Création de différentes variables.
IPT="/sbin/iptables"
SPAMLIST="blockedip"
SPAMDROPMSG="BLOCKED IP DROP"
# Interface connectée à Internet.
PUB_IF="eth0"
# IP fixe.
IPNET="X.X.X.X"
# Variables des classes privées.
LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
BROADCAST="192.168.1.255"
#creation fichier d'ip à bannir .
cd /var/scriptdepot/
route -n | grep "\!H" | awk '{print $1}' > portsentry.txt
$IPT -L | grep DROP > fail2banTmp
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' fail2banTmp > fail2ban.txt
cat fail2ban.txt portsentry.txt | sort | uniq > blocked.ips.txt
rm -f /var/scriptdepot/fail2banTmp
rm -f /var/scriptdepot/portsentry.txt
rm -f /var/scriptdepot/fail2ban.txt
[ -f /var/scriptdepot/blocked.ips.txt ] && BADIPS=$(egrep -v -E "^#|^$" /var/scriptdepot/blocked.ips.txt)
# flush tout
$IPT -F
$IPT -X
$IPT -Z
$IPT -t filter -F
$IPT -t filter -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
# On remet la police par défaut à ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
# On remet les polices par défaut pour la table NAT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
# Politiques par défaut, on DROP tout.
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
if [ -f /var/scriptdepot/blocked.ips.txt ];
then
# -N, --new-chain chaîne Crée une nouvelle chaîne définie par l'utilisateur avec le nom indiqué. Il ne doit pas déjà exister de cible de même nom.
$IPT -N $SPAMLIST
for ipblock in $BADIPS
do
$IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
$IPT -A $SPAMLIST -s $ipblock -j DROP
done
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
fi
# Les états de connexions :
# --state NEW
# Une nouvelle connexion est établie. (elle contient le flag SYN)
#
# --state ESTABLISHED
# La connexion analysée a déjà été établie, elle ne devrait pas contenir de SYN ni de FIN.
#
# --state RELATED
# La connexion est en relation avec une autre connexion déjà établie.
#
# --state INVALID
# la connexion n'est pas conforme, elle contient un jeu de flags anormal.
# SYN-FLOODING PROTECTION
$IPT -N syn-flood
$IPT -A INPUT -i $PUB_IF -p tcp --syn -j syn-flood
$IPT -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A syn-flood -j DROP
# Pour être sur que les nouvelles connexions TCP sont des paquets SYN.
$IPT -A INPUT -i $PUB_IF -p tcp ! --syn -m state --state NEW -j DROP
# Refuse les paquets venant des réseaux privés de classe A,B et C.
$IPT -A INPUT -i $PUB_IF -s $CLASS_A -j DROP
$IPT -A INPUT -i $PUB_IF -s $CLASS_B -j DROP
#$IPT -A INPUT -i $PUB_IF -s $CLASS_C -j DROP
# Refuse les paquets d'adresses multicast (classe D).
$IPT -A INPUT -i $PUB_IF -s $CLASS_D_MULTICAST -j DROP
# Refuse les paquets d'adresses réservées de classe E.
$IPT -A INPUT -i $PUB_IF -s $CLASS_E_RESERVED_NET -j DROP
#hashlimit limite à 3 connections sur le port ssh par ip
$IPT -I INPUT -m hashlimit -m tcp -p tcp --dport 22 --hashlimit 3/min --hashlimit-mode srcip --hashlimit-name ssh -m state --state NEW -j ACCEPT
# Block Fragments
$IPT -A INPUT -i PUB_IF -f -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragments Packets"
$IPT -A INPUT -i PUB_IF -f -j DROP
# Block bad stuff
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# NULL packets
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
#XMAS
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# FIN packet scans
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
$IPT -A INPUT -i PUB_IF -p tcp --tcp-flags FIN,ACK FIN -j DROP
#antispoofing
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
then
for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $filtre
done
fi
#autorise les requetes locales (interface loopback)
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Accepter les packets relatifs à des connexions déjà établies
$IPT -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# allow incomming ICMP ping pong stuff
$IPT -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
##### DEBUT OUVERTURE DE PORT
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 3690 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3690 -m state --state ESTABLISHED -j ACCEPT
##### FIN
exit 0 |
Partager