Bonjour,
Je cherche une personne à l'aise avec Iptables pour faire une relecture de mon script actuel pour Iptables, sous Debian Buster.

La situation :
Un serveur VPS OVH qui doit servir de serveur WEB ( Apache + Mysql + FTP ) pour le moment.

Merci de vos avis :
Dans un premier temps, pour relever toutes erreurs grossières.
Dans un second temps, pour améliorer les définitions pour permettre une meilleure compréhension.


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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# Début de la règle.
*filter
 
###
# Pas de filtrage sur l'interface de loopback.
# Le serveur ne doit pas avoir de soucis à communiquer avec lui-même au niveau des services internes.
###
-A INPUT -i lo -j ACCEPT
# Pourquoi autoriser le loopback vers l'extérieur ?
# -A OUTPUT -o lo -j ACCEPT
 
###
# Ne pas casser les connexions établies pour ne pas se retrouver bloqué en cas de règles trop restrictives !
###
# Permettre à une connexion ouverte de recevoir du trafic en entrée.
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 
# Permettre à une connexion ouverte de recevoir du trafic en sortie.
# -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT
 
###
# Ajouter les services autorisés à se connecter dans Iptables.
# Adapter le port et éventuellement le protocole TCP par UDP en fonction de la configuration souhaitée.
# --sport est l'abréviation de --source-port
# --dport est l'abréviation de --destination-port 
###
#
# Autoriser le port SSH par défaut.
# Cette règle est à conserver sauf en cas de configuration du Port Knocking.
# Pour le moment, je laisse le port ouvert en INPUT, pour éviter des incidents de connexion au serveur.
# -A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# -A OUTPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
# Remplacer la commande précédente pour autoriser le serveur à se connecter à distance par SSH.
-A OUTPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#
# Autoriser SSH entrant uniquement à partir d'un réseau spécifique.
# Les règles suivantes autorisent les connexions ssh entrantes uniquement à partir du réseau 192.168.100.x.
# -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# Remplacer la commande précédente pour autoriser le serveur à se connecter à distance par SSH à partir d'un réseau spécifique.
# -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#
# Il est conseillé de laisser cache.ovh.net pour permettre à OVH d'intervenir sur le serveur.
# Si vous fermez le port 22 pour les techniciens ils ne pourront pas intervenir.
-A INPUT -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
#
# Autoriser les connexions DNS entrantes :
-A INPUT -p tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp --dport 53 -j ACCEPT
# Autoriser les connexions DNS sortantes :
# (Trouver un exemple pour comprendre pourquoi une connexion DNS sortante est nécessaire.)
-A OUTPUT -p udp --dport 53 -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT
#
# Si un serveur FTP est installé, permet de le joindre depuis l'extérieur sur le port 20 et 21 :
-A INPUT -p tcp --dport 20:21 -j ACCEPT
#
# Si un serveur de mail avec SMTP, POP3 et IMAP est installé, le rendre joignable de l'extérieur :
# Mail SMTP:25
# -A INPUT -p tcp --dport 25 -j ACCEPT
# -A OUTPUT -p tcp --dport 25 -j ACCEPT
# Mail POP3:110
# -A INPUT -p tcp --dport 110 -j ACCEPT
# -A OUTPUT -p tcp --dport 110 -j ACCEPT
# Mail IMAP:143
# -A INPUT -p tcp --dport 143 -j ACCEPT
# -A OUTPUT -p tcp --dport 143 -j ACCEPT
# Mail POP3S:995
# -A INPUT -p tcp --dport 995 -j ACCEPT
# -A OUTPUT -p tcp --dport 995 -j ACCEPT
# Combiner plusieurs ports dans la même règle avec multiport :
-A INPUT -p tcp -m multiport --dports 25,110,143,995 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m multiport --dports 25,110,143,995 -m state --state ESTABLISHED -j ACCEPT
#
# Si un serveur web est installé :
-A INPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT
#
# Si NIS est utilisé pour gérer les comptes utilisateurs, authoriser les connexions NIS.
# If you don’t allow the NIS related ypbind connections, users will not be able to login.
# The NIS ports are dynamic. When the ypbind starts it allocates the ports.
# First do a rpcinfo -p as shown below and get the port numbers. In this example, it was using port 853 and 850.
# rpcinfo -p | grep ypbind
# Now allow incoming connection to the port 111, and the ports that were used by ypbind.
# -A INPUT -p tcp --dport 111 -j ACCEPT
# -A INPUT -p udp --dport 111 -j ACCEPT
# -A INPUT -p tcp --dport 853 -j ACCEPT
# -A INPUT -p udp --dport 853 -j ACCEPT
# -A INPUT -p tcp --dport 850 -j ACCEPT
# -A INPUT -p udp --dport 850 -j ACCEPT
#
# Si un serveur Samba est installé :
# Vérifier si il faut une règle INPUT et vérifier la règle OUTPUT :
# -A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns
#
# Permettre la connexion au serveur par XDMCP :
# -A INPUT -p udp --dport 177 -j ACCEPT
# Permettre à la machine client de se connecter par XDMCP à une machine distante :
# -A INPUT -p tcp --dport 6001 -j ACCEPT
#
# Si un serveur CUPS éventuel doit être joignable de l'extérieur :
# -A INPUT -p udp -m udp --dport 631 -j ACCEPT
#
# Décommenter les lignes suivantes pour autoriser rsync depuis un réseau spécifique :
# -A INPUT -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
# -A OUTPUT -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
#
# Décommenter les lignes suivantes si OpenVPN Server est installé et tourne sur le port 913 en UDP :
# -A INPUT -p udp --dport 913 -j ACCEPT
#
# Si un serveur webmin est installé, il fonctionne en localhost, on y accède en export display, inutile de l'ouvrir :
# -A INPUT -p tcp --dport 1000 -j ACCEPT
# -A OUTPUT -p tcp --dport 1000 -j ACCEPT
#
# Décommenter la ligne suivante pour pouvoir reçevoir des flux UDP VideoLAN.
# -A INPUT -p udp --dport 1234 -j ACCEPT
#
# Si l'outil de monitoring Monit est utilisé, privilégier le transfert de port depuis la configuration de Monit vers le port proxy 8080 pour ne pas avoir à ouvrir le port 1337.
# Autoriser le port 1337. Le port dépend de la configuration de Monit. Il fonctionne en localhost
# -A INPUT -p tcp --dport 1337 -j ACCEPT
#
# Décommenter les 3 lignes suivantes pour pouvoir utiliser GnomeMeeting :
# -A INPUT -p tcp --dport 1720 -j ACCEPT
# -A INPUT -p tcp --dport 30000:33000 -j ACCEPT
# -A INPUT -p udp --dport 5000:5006 -j ACCEPT
#
# Rendre le serveur CVS joignable depuis l'extérieur via "pserver".
# Si les utilisateurs accèdent au serveur CVS exclusivement via SSH,
# seule la ligne concernant le serveur SSH doit être décommentée.
# -A INPUT -p tcp --dport 2401 -j ACCEPT
#
# Si un serveur de base de données MariaDB est installé, autoriser le trafic loopback en interne pour localhost.
# Ne pas ouvrir le port 3306 sauf pour faire communiquer des serveurs en interne.
# -A INPUT -p tcp --dport 3306 -j ACCEPT
# -A OUTPUT -p tcp --dport 3306 -j ACCEPT
# Autoriser la connexion MySQL uniquement à partir d'un réseau spécifique :
# -A INPUT -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
# -A OUTPUT -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
#
# Si le serveur de partage d'écran Teamviewer est installé :
# C'est le port 5938 TCP et UDP qui sera utilisé, puis, le port 443 ou 80 en dernier recours.
# Il semblerait qu'il soit inutile d'ouvrir les ports, puisque le serveur va effectuer sa demande de connexion vers l'extérieur. La connexion devrait alors s'établir.
# Préférer Anydesk et identifier les ports pour anydesk.
# -A INPUT -p tcp --dport 5938 -j ACCEPT
# -A INPUT -p udp --dport 5938 -j ACCEPT
#
# Si SickRage est installé, autoriser le trafic en interne pour localhost, ce qui a été fait plus haut. Ne pas ouvrir le port 8081. Je n'utilise pas SickRage, tester en situation :
# -A INPUT -p tcp --dport 8081 -j ACCEPT
#
# Si la synchronisation avec DropBox est installée :
# DropBox utilise le port 17500 TCP et UDP pour la synchronisation réseau par défaut.
# Il utilise également les ports TCP 17600 et TCP 17603 pour le bouton Web «Ouvrir».
# Il semblerait qu'il soit inutile d'ouvrir les ports, puisque le serveur va effectuer sa demande de connexion vers l'extérieur. La connexion devrait alors s'établir.
# -A INPUT -p tcp --dport 17500 -j ACCEPT
# -A INPUT -p udp --dport 17500 -j ACCEPT
# -A INPUT -p tcp --dport 17600 -j ACCEPT
# -A INPUT -p tcp --dport 17603 -j ACCEPT
 
###
# Règles complémentaires pour optimiser le serveur.
###
# Faire face au flood :
-A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
-A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
-A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
 
# Limiter à 2 demandes de connexion par seconde pour une IP sur le protocole SSH.
# -A INPUT -p tcp --syn --dport ssh -m connlimit --connlimit-above 2 -j DROP
# Autoriser uniquement 3 connexions en SSH sur un intervalle de 120 secondes (2 minutes).
-A INPUT -p tcp --dport ssh -m state --state NEW -m recent --update --seconds 120 --hitcount 3 -j DROP
 
# Limiter le nombre de connexions entrantes par minute à 100 et définit une rafale limite de 200.
-A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT
 
# Bloquer ICMP pour interdire les réponses du serveur suite à une requête PING :
-A INPUT -p icmp --icmp-type echo-request -j DROP
-A OUTPUT -p icmp --icmp-type echo-reply -j DROP
# Autoriser le serveur a lancer une requête PING de l'intérieur vers un serveur externe :
-A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
-A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
#
# Autoriser ICMP pour OVH et le monitoring :
# Si toutes les requêtes PING sont bloquées, même celles d'OVH, le bon état de marche du serveur ne sera plus surveillé et si il tombe en panne OVH n'en sera pas avertis.
# Autoriser au moins les adresses suivantes de OVH a PING : ping.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, proxy.ovh.net, proxy-rbx2.ovh.net, proxy.sbg.ovh.net, proxy.bhs.ovh.net
#
# L'adresse IP de votre serveur, pour exemple, 213.186.57.143 doit laisser passer :
# 213.186.57.249 si vous êtes sur un serveur HG. (Règle temporaire.)
# 213.186.57.250 pour le serveur SLA.
# 213.186.57.251 pour le serveur mrtg pour pouvoir bénéficier de RTM.
#
# Renseigner le début de l'adresse IP de votre serveur :
# DEBUT_ADRESSE_IP_SERVEUR="213.186.57"
#
# Adresses à autoriser d'après la documentation OVH : https://docs.ovh.com/gb/en/cloud/dedicated/monitoring-ip-ovh/
# Mise en application : https://community.centminmod.com/threads/ovh-icmp-ping-whitelist-for-csf-firewall.11427/
#
# -A INPUT -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
# -A INPUT -p icmp --source proxy.ovh.net -j ACCEPT
# -A INPUT -p icmp --source proxy.p19.ovh.net -j ACCEPT
# -A INPUT -p icmp --source proxy.rbx.ovh.net -j ACCEPT
# -A INPUT -p icmp --source proxy.sbg.ovh.net -j ACCEPT
# -A INPUT -p icmp --source proxy.bhs.ovh.net -j ACCEPT
# -A INPUT -p icmp --source ping.ovh.net -j ACCEPT
# -A INPUT -p icmp --source 151.80.231.244 -j ACCEPT # Monitoring
# -A INPUT -p icmp --source 151.80.231.245 -j ACCEPT # Monitoring
# -A INPUT -p icmp --source 151.80.231.246 -j ACCEPT # Monitoring
# -A INPUT -p icmp --source 151.80.231.247 -j ACCEPT # Monitoring
# -A INPUT -p icmp --source 37.187.231.251 -j ACCEPT # Monitoring
# -A INPUT -p icmp --source a2.ovh.net -j ACCEPT
# -A INPUT -p icmp --source 92.222.184.0/24 -j ACCEPT
# -A INPUT -p icmp --source 92.222.185.0/24 -j ACCEPT
# -A INPUT -p icmp --source 92.222.186.0/24 -j ACCEPT
# -A INPUT -p icmp --source 167.114.37.0/24 -j ACCEPT
# -A INPUT -p tcp --source 192.168.0.0/16 -j ACCEPT
# -A INPUT -p udp --source 192.168.0.0/16 -j ACCEPT
# SLA server :
# -A INPUT -p icmp --source DEBUT_ADRESSE_IP_SERVEUR.251 -j ACCEPT
# DEBUT_ADRESSE_IP_SERVEUR = aaa.bbb.ccc according to the previous rule :
# -A INPUT -p icmp --source DEBUT_ADRESSE_IP_SERVEUR.250 -j ACCEPT
# temporary, only for HG server :
# -A INPUT -p icmp --source DEBUT_ADRESSE_IP_SERVEUR.249 -j ACCEPT
# -A OUTPUT -p udp --dport 6100:6200 -j ACCEPT # OVH RTM
#
# Vérifier les paquets ICMP bloqués depuis le fichier de journalisation /var/log/messages :
# grep -i 'ICMP_IN Blocked' /var/log/messages| tail -5| awk '{print $1,$2,$3,$5,$6,$7,$8,$9,$12,$13,$19,$20}'; date
# Vérifier les informations des adresses IP bloquées pour s'assurer que ce n'est pas un service de OVH :
# curl ipinfo.io/92.222.185.1
 
# DROP le Multicast :
# Je ne pense pas en avoir besoin pour le moment, il me semble inutile de l'autoriser.
# Ce système est plus efficace que l'unicast pour diffuser des contenus simultanément vers une large audience. (Audio, Vidéo.)
-A INPUT -m pkttype --pkt-type multicast -j DROP
-A FORWARD -m pkttype --pkt-type multicast -j DROP
-A OUTPUT -m pkttype --pkt-type multicast -j DROP
# DROP IGMP également pour bloquer le multicast ? Quelle méthode préférer ?
# Si nécessaire, tenter de logger tout paquet igmp sans spécifier de source pour voir ce que ça donne dans "/var/log/syslog".
# iptables -A INPUT -p igmp -j LOG --log-level info --log-prefix "IGMP: "
# L'IGMP est un protocole standard utilisé par la suite de protocoles TCP/IP pour la multidiffusion dynamique, le multicast.
-A INPUT -p igmp -j DROP
-A FORWARD -p igmp -j DROP
-A OUTPUT -p igmp -j DROP
# Reçevoir des annonces SAP de session multicast :
# L'adresse IP doit sûrement être celle de votre serveur finissant par 254.
# Si je ne configure rien, les dernières lignes du script Iptables devraient rejeter ce genre de requêtes.
# -A INPUT -p udp -d 224.2.127.254 --dport 9875 -j ACCEPT
 
# DROP des scans XMAS et NULL :
# Vérifier la nécessite.
-A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
 
# DROP silencieusement les paquets broadcastés.
# Vérifier la nécessite.
-A INPUT -m pkttype --pkt-type broadcast -j DROP
 
###
# LOG
###
# On log les paquets en entrée.
-A INPUT -j LOG
# On log les paquets forward.
-A FORWARD -j LOG
 
# Fermer tous les ports pour les connexions entrantes.
# REJECT les paquets est plus propre mais DROP est plus sécurisé !
# Avec DROP, si un paquet arrive et n'est pas accepté, on l'efface. Le client attendra de son côté une réponse en vain, jusqu'au timeout.
# Avec REJECT, si un paquet non sollicité arrive, on renvoie au client une erreur et il n'attend plus car il a une réponse négative.
# En cas d'envoi de paquets à répétition sur un mauvais port, avec DROP le serveur ne traitera pas les requêtes, alors qu'avec REJECT le serveur prendra le temps de répondre.
# -A INPUT -j DROP
# Interdire toutes les autres connexions entrantes et sortantes.
# Les connexions entrantes seront bloquées par défaut.
-P INPUT -j DROP
# Les connexions destinées à être forwardées seront bloquées par défaut.
-P FORWARD -j DROP
# Les connexions sortantes seront bloquées par défaut.
-P OUTPUT -j DROP
 
COMMIT
# Fin de la règle.
Ce même script, depuis pastebin : https://pastebin.com/YJjXuQze