Iptables pour les débutants

Iptables pour les débutants
Les iptables sont considérés comme l'une des principales ressources défensives pour de nombreux administrateurs système bien qu'ils soient remplacés par NFTABLES. Les meilleurs fabricants de réseautage ont incorporé les iptables au matériel encore dans les environnements de production.

Iptable est très polyvalent et accepte les commandes directes de l'utilisateur qui peuvent charger et décharger les règles en fonction du besoin.

Ce tutoriel montre Comment protéger un serveur Web, Les connexions transmises aux adresses IP internes de notre LAN et offrent des services spécifiques aux adresses IP de liste blanche uniquement.

Note: Ce tutoriel iptables a été publié pour la première fois il y a deux ans et mis à jour le 23/05/2021 avec des exemples améliorés et des captures d'écran de meilleure qualité.

Comment installer

Les iptables sont omis par défaut dans les distributions qui incorporent les NFTables.

Pour installer iptables sur les distributions Linux basées sur Debian, exécutez la commande suivante:

Sudo Apt Update && apt install iptables

Ouverture des ports HTTP et HTTPS

Tout d'abord, ajoutons toutes les politiques à accepter par le serveur Web.

Note: Si vous créez un script avec des règles, vous n'avez pas besoin d'utiliser Sudo.

sudo iptables -a entrée -p tcp --dport 80 -j accepter
sudo iptables -a entrée -p tcp --dport 443 -j accepter

Pour voir des règles supplémentaires s'exécuter "iptables -l"

Où:

Iptables = appelle le programme

-UN = ajoute une règle

SAISIR = trafic entrant

-p = protocole

-ddport = port de destination

-J = Spécifiez la «cible»; La cible est le type de politique: accepter, dépasser, rejeter (intégré)…

Iptables -l = répertorie toutes les règles chargées iptables (Iptables -l -v = la même chose avec la verbosité.)

Dans l'exemple ci-dessus, nous demandons aux iptables d'ajouter une règle pour le trafic entrant via le protocole TCP et les ports 80 (HTTP) et 443 (HTTPS).

Nous pouvons modifier la commande pour accepter la connexion uniquement à partir d'une IP spécifique en ajoutant le paramètre "-s»:

sudo iptables -a entrée -s 127.0.0.1 -p TCP --DPORT 80 -J Accepter

Où:

s = source

Vous pouvez également tester votre pare-feu avec NMAP:

Note: Dans l'exemple ci-dessus, le port 443 n'est pas affiché car le serveur n'a pas de certificat SSL adéquatement configuré.

Note: Pour plus d'informations sur NMAP, vous pouvez lire ceci.

Protéger votre serveur avec des iptables:

#Open HTTP et HTTPS Services.
iptables -a entrée -p tcp --dport 80 -J accepter
iptables -a entrée -p tcp --dport 443 -j accepter
Service portuaire #Open SSH
iptables -a entrée -p tcp --dport 22 -m Conntrack --ctstate new, établi -j accepter

Où sont les nouveaux paramètres:

-M signifie «Match» et est utilisé pour appeler des extensions iptables comme Conntrack, qui ne fait pas partie des fonctions de base iptables.

grack = Permet de suivre les informations sur les connexions comme des adresses spécifiques ou, dans ce cas, l'état de la connexion. Cela doit être utilisé avec soin car de nombreuses règles pour défendre les serveurs de certaines attaques utilisent Conntrack tandis que le matériel limite son utilisation, et une telle limitation peut être utilisée pour surcharger les ressources du serveur.

-ctstate = détermine l'état de la règle à correspondre; Les états possibles sont: NOUVEAU, ÉTABLI, EN RAPPORT et INVALIDE.

#Protect votre service SSH contre les attaques de force brute en ne permettant qu'une propriété intellectuelle spécifique
pour accéder aux iptables -a entrée -p tcp -s x.X.X.X --DPORT 22 -M Conntrack --ctstate Nouveau,
Établi -J accepter
#Protect votre service SSH contre les attaques de force brute en limitant les tentatives de connexion
Iptables -a entrée -p tcp -m tcp --dport 22 -m Conntrack --ctstate new -j 22 test
Iptables -a 22-test -m Connexions récentes --Name - set - masque 255.255.255.255 - rsource
Iptables -a 22 test -m Connexions récentes - RCHECK --MASK 255.255.255.255
--rsource - secondes 30 - Hitcount 3 -J 22 Protection
Iptables -a 22 test -J accepter
Iptables -a 22 protection -j goutte

Où:

Dans la première ligne, notre règle dit «-M Conntrack -Ctstate Nouveau, " Ce qui signifie que si la connexion est nouvelle, passez à la règle «22 test».

La deuxième ligne indique que les paquets Masker 255.255.255.255 sont nommés comme CONNEXIONS.

La troisième ligne dit si un CONNEXIONS est plus de 3 fois en 30 secondes, le pare-feu continue d'appliquer la chaîne 22 protections. La quatrième ligne dit si le CONNEXIONS n'étaient pas vus plus de 3 fois en 30 secondes, ils pouvaient être acceptés.

La cinquième ligne, qui appartient au 22 protections chaîne, dit tomber CONNEXIONS S'ils semblent être plus de 3 fois en 30 secondes.

Maintenant, pour terminer, refusons toutes les connexions entrantes non étendues et permettons à tout le trafic sortant:

iptables -putput accepter
Iptables -p Drop d'entrée

P fait référence à la politique de la chaîne; N'oubliez pas que l'objectif est la politique, accepter, tomber, rejeter. Dans ce cas, nous disons que la politique par défaut pour le trafic sortant est d'accepter, et la politique par défaut pour le trafic entrant est de refuser à moins que nous ne spécifiions quelque chose de différent dans les règles précédentes. Il s'agit d'un pare-feu très basique qui n'inclut pas de règles pour de nombreuses attaques, à des fins d'apprentissage et non pour la production; À la fin de l'article, j'attache un pare-feu que j'ai utilisé pour la production sur un serveur; il a des commentaires expliquant chaque règle.

Transfert d'une connexion à un port spécifique à une adresse IP spécifique

Ceci est également très utile pour les utilisateurs de bureau qui souhaitent entendre une connexion via un appareil spécifique; Il peut être utile même pour les joueurs; Habituellement, nous le faisons à partir des paramètres du routeur, mais supposons que le dispositif de routage exécute des iptables.

iptables -a pré -out -t nat -p tcp -d x.X.X.X --DPORT 8080 -J Dnat --to-destation y.Y.Y.Y: 80
iptables -a postrouting -t nat -p tcp -j snat --to-source x.X.X.X

Les règles ci-dessus appellent NAT (traduction d'adresse réseau) pour spécifier les connexions via le protocole TCP à l'adresse x.X.X.X, et le port 8080 sera redirigé pour s'adresser à Y.Y.Y.Y, port 80. La deuxième règle spécifie les réponses doivent être envoyées à l'adresse source (x.X.X.X). Nous pouvons utiliser ces règles pour permettre l'accès à une caméra IP, activer les jeux en ligne avec des réseaux externes, etc.

Ce tutoriel était censé présenter les débutants aux iptables et explique uniquement un nombre limité de bases. Vous trouverez ci-dessous un échantillon d'un pare-feu bien planifié utilisé pour un serveur de production; Il comprend certaines des règles que nous avons déjà vues à des règles plus complexes pour empêcher les DDO, entre autres types d'attaques.

Bonus: échantillon de pare-feu de production

iptables -f
# ---- Activer la mauvaise protection des messages d'erreur
Activer / proc / sys / net / ipv4 / icmp_ignore_bogus_error_responsses
# ---- Activez le filtrage du chemin inversé. Plus sûr, mais brise le routage asymétrique et / ou iPsec
Activer / proc / sys / net / ipv4 / conf / * / rp_filter
# ---- n'acceptez pas les paquets routés source. Le routage source est rarement utilisé pour
fins désactiver / proc / sys / net / ipv4 / conf / * / accept_source_route
# ---- Désactiver l'acceptation de redirection ICMP qui peut être utilisée pour modifier vos tables de routage
désactiver / proc / sys / net / ipv4 / conf / * / accept_redirects
# ---- Comme nous n'acceptons pas les redirections, n'envoyez pas non plus de messages de redirection
désactiver / proc / sys / net / ipv4 / conf / * / send_redirects
# ---- Ignorer les paquets avec des adresses impossibles
Désactiver / proc / sys / net / ipv4 / conf / * / log_martians
# ---- Protéger contre les numéros de séquence d'emballage et aider la mesure du temps aller-retour
Activer / proc / sys / net / ipv4 / tcp_timestamps
# ---- Aide contre les attaques DOS ou DDOS synflood
Les numéros de séquence TCP Activer / Proc / Sys / Net / IPv4 / TCP_SYNCOOKIES
# ---- Utilisez un ACK sélectif qui peut être utilisé pour signifier que des paquets spécifiques manquent
Désactiver / proc / sys / net / ipv4 / tcp_sack
modprobe nf_conntrack_ipv4
modprobe nf_nat
# modprobe nf_conntrack_ipv6
# modprobe nf_conntrack_amanda
# modprobe nf_nat_amanda
modprobe nf_conntrack_h323
modprobe nf_nat_h323
modprobe nf_conntrack_ftp
modprobe nf_nat_ftp
# modprobe nf_conntrack_netbios_ns
# modprobe nf_conntrack_irc
# modprobe nf_nat_irc
# modprobe nf_conntrack_proto_dccp
# modprobe nf_nat_proto_dccp
modprobe nf_conntrack_netlink
# modprobe nf_conntrack_pptp
# modprobe nf_nat_pptp
# modprobe nf_conntrack_proto_udplite
# modprobe nf_nat_proto_udplite
# modprobe nf_conntrack_proto_gre
# modprobe nf_nat_proto_gre
# modprobe nf_conntrack_proto_sctp
# modprobe nf_nat_proto_sctp
# modprobe nf_conntrack_sane
modprobe nf_conntrack_sip
modprobe nf_nat_sip
# modprobe nf_conntrack_tftp
# modprobe nf_nat_tftp
# modprobe nf_nat_snmp_basic
#Now, nous pouvons commencer à ajouter des services sélectionnés à notre filtre à pare-feu. La première telle chose
est une interface locale iptables -a entrée -i lo -j accepter
#Nous ont dit au pare-feu de prendre tous les paquets entrants avec des drapeaux TCP nul et de les laisser tomber.
iptables -a entrée -p tcp ! -m Conntrack --ctstate New -J Drop
#Nous dire iptables d'ajouter (-a) une règle à la entrée (entrée) - SSH fonctionne sur le port 50683
Au lieu de 22.
iptables -a entrée -p tcp -m tcp --dport 50683 -j accepter
iptables -a entrée -p tcp -m tcp -s ip spécifique - dport 50683 -j accepter
iptables -a entrée -p tcp -m tcp -s ip spécifique - dport 50683 -j accepter
iptables -a entrée -p tcp -m tcp -s ip spécifique - dport 50683 -j accepter
iptables -a entrée -p tcp --dport 50683 -m Conntrack --ctstate new -m récent --Tet
--nom ssh -j accepter
iptables -a entrée -p tcp --dport 50683 -m récent --update - secondes 60 - hitcount 4
--rttl --name ssh -j log - log-prefix "ssh_brute_force"
iptables -a entrée -p tcp --dport 50683 -m récent --update - secondes 60 - hitcount 4
--rttl --name ssh -j drop
iptables -a entrée -p tcp --dport 50683 -m Conntrack --ctstate new -m récent --Tet
--nom ssh
iptables -a entrée -p tcp --dport 50683 -m Conntrack --ctstate new -j ssh_whitelist
iptables -a entrée -p tcp --dport 50683 -m Conntrack --ctstate new -m récent - update
--secondes 60 --hitcount 4 --rttl --name ssh -j ulog --ulog-prefix ssh_bru
iptables -a entrée -p tcp --dport 50683 -m Conntrack --ctstate new -m récent - update
--secondes 60 --hitcount 4 --rttl --name ssh -j drop
#Now je permets IMAP et SMTP.
-Une entrée -p tcp --dport 25 -j accepter
# Permet les connexions pop et pops
-Une entrée -p tcp --dport 110 -j accepter
-Une entrée -p tcp --dport 995 -j accepter
############ imap & iMaps ###########
-Une entrée -p tcp --dport 143 -J accepter
-Une entrée -p tcp --dport 993 -j accepter
########### Mysql ###################
iptables -a entrée -i eth0 -p tcp -m tcp --dport 3306 -j accepter
########## R1Soft CDP Système ##############
iptables -a entrée -p tcp -m tcp -s ip spécifique - dport 1167 -j accepter
############### sortant ###################
iptables -i entrée -m Conntrack --ctstate établi, lié -j accepter
### Autoriser en cours, bloc entrant non défini ###
iptables -putput accepter
Iptables -p Drop d'entrée
iptables -l -n
Iptables-Save | tee / etc / iptables.test.règles
iptables-restore < /etc/iptables.test.rules
#Service iptables redémarrer