Bonjour
En farfouillant sur le net , j'ai récupérer un bon paquet de regles iptable , que je me suis "amusé" à résumer en un seul script pour obtenir le graal du script de firewalling .
Voila le contexte :
Un serveur debian avec une ip Fixe contenant un depot svn ( port 3690 ) et git ( basé sur ssh ) .
Avec en plus un portsentry et fail2ban .

J'ai testé une majorité de régles , mais je ne suis pas sur de la pertinence de chacune .


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Une discussion sur certaines régles serait le bienvenue . Particulierement les régles syn , XMAS , antispoofing, Block Fragments ,hashlimit ,null packet ... , sur lesquelles j'ai un gros doute .
Tout avis sera le bienvenu (si autre que "Pourquoi t as mis le port 22 pour le ssh " )

En remerciant par avance