introduction
iptables
est un outil puissant utilisé pour configurer le pare-feu intégré du noyau Linux. Il est préinstallé sur la plupart des distributions Ubuntu, mais si vous utilisez une version personnalisée d'Ubuntu ou que vous exécutez dans un conteneur, vous devrez probablement l'installer manuellement.
sudo apt-get install iptables iptables-persistent
Après l'installation, si vous êtes invité à enregistrer vos règles actuelles, cela n'a pas d'importance pour le moment car vous allez supprimer ou créer de nouvelles règles plus tard.
Conseils
Vous pouvez utiliser la netcat
commande (sur un autre ordinateur que votre serveur) pour tester quels ports sont ouverts ou fermés.
nc -z -w5 -v SERVER_IP PORT
nc
est la commande netcat.
-z
il suffit d'envoyer un paquet sans charge utile.
-w5
attendez jusqu'à 5 secondes pour une réponse.
-v
mode verbeux.
- Remplacez
SERVER_IP
par votre adresse de serveur.
- Remplacez
PORT
par le port que vous souhaitez tester s'il est ouvert (par exemple 22
).
Sur votre serveur, vous pouvez utiliser la netstat
commande pour voir quels ports écoutent actuellement les connexions.
sudo netstat -tulpn
Remarque: Bien qu'il netstat
soit pratique de trouver les ports avec lesquels vous souhaitez travailler, vous devez connaître les applications que vous avez actuellement installées sur votre serveur et quels ports sont à l'écoute, vous n'avez pas à autoriser tous les ports que vous trouvez dans la netstat
sortie .
Syntaxe
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
-A INPUT
ajouter une règle à la INPUT
chaîne, une chaîne est un groupe de règles, celles que nous utilisons le plus dans ce guide seront INPUT
, OUTPUT
et PREROUTING
.
-p tcp
défini tcp
comme le protocole auquel cette règle s'appliquera, vous pouvez également utiliser d'autres protocoles tels que udp
, icmp
ou all
.
-m tcp
utilisez le tcp
module. iptables
prend en charge des fonctionnalités supplémentaires via des modules, dont certains sont déjà préinstallés iptables
et d'autres, comme le geoip
module.
--dport 22
les commandes commençant par --
indiquent des options supplémentaires pour le module utilisé précédemment, dans ce cas, nous dirons au tcp
module de ne s'appliquer qu'au port 22
.
-m geoip
utilisez le geoip
module. Il limitera les paquets par pays (plus d'informations à l'étape 5).
--src-cc PE
dites au geoip
module de limiter les paquets entrants à ceux qui viennent du Pérou. Pour plus de codes de pays, recherchez ISO 3166 country codes
sur Internet.
-j ACCEPT
l' -j
argument indique iptables
ce qu'il faut faire si un paquet correspond aux contraintes spécifiées dans les arguments précédents. Dans ce cas, il s'agira de ACCEPT
ces paquets, d'autres options le sont REJECT
, DROP
et plus encore. Vous pouvez trouver plus d'options en recherchant iptables jump targets
sur Internet.
1. Bases
Liste toutes les règles.
sudo iptables -L
Liste toutes les commandes utilisées pour créer les règles actuellement utilisées, utiles pour modifier ou supprimer des règles.
sudo iptables -S
Pour supprimer une règle spécifique, choisissez une règle sudo iptables -S
et remplacez-la -A
par -D
.
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Liste toutes les règles numérotées de la INPUT
chaîne.
sudo iptables -L INPUT --line-numbers
Supprimez une règle numérotée.
sudo iptables -D INPUT 2
Pour effacer toutes les règles.
sudo iptables -F
Avertissement: vous risquez de perdre la connexion si vous êtes connecté par SSH .
Effacer uniquement les règles de la OUTPUT
chaîne.
sudo iptables -F OUTPUT
2. Créez des règles initiales
Autoriser SSH
sur l' eth0
interface
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-i eth0
appliquer la règle à une interface spécifique, pour permettre à toute interface de supprimer cette commande.
Pour limiter les paquets entrants à une adresse IP spécifique (par exemple 10.0.3.1/32
).
sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-s 10.0.3.1/32
spécifie un IP / sous-réseau à partir duquel autoriser les connexions.
Définissez les règles de chaîne par défaut.
Avertissement: avant de continuer, assurez-vous d'avoir appliqué les règles SSH correctes si vous travaillez sur un serveur distant .
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
-P INPUT DROP
refuse tous les paquets entrants (c'est-à-dire que personne ne pourra se connecter à vos serveurs en cours d'exécution tels qu'Apache, SQL, etc.).
-P FORWARD DROP
refuse tous les paquets transférés (c'est-à-dire lorsque vous utilisez votre système comme routeur).
-P OUTPUT ACCEPT
autorise tous les paquets sortants (c'est-à-dire lorsque vous effectuez une HTTP
demande).
Autorisez tout le trafic sur l'interface de bouclage ( recommandé ).
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
3. Rendre les règles persistantes
Enregistrez les iptables
règles actuelles .
sudo netfilter-persistent save
sudo netfilter-persistent reload
Si vous exécutez à l'intérieur d'un conteneur, la netfilter-persistent
commande ne fonctionnera probablement pas, vous devez donc reconfigurer le iptables-persistent
package.
sudo dpkg-reconfigure iptables-persistent
4. Autoriser les connexions sortantes
Autorisez les requêtes DNS.
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Utilisez le state
module pour autoriser RELATED
et ESTABLISHED
sortir les paquets.
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Autorisez les ports souhaités; dans ce cas, les HTTP
ports.
sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
Plus de ports que vous voudrez peut-être utiliser.
FTP
: TCP au port 21
HTTPS
: TCP sur le port 443
DHCP
: udp au port 67
NTP
: udp au port 123
Remarque: Si vous souhaitez autoriser, apt-get
il peut être nécessaire d'autoriser FTP
etHTTPS
.
Autoriser le trafic renvoyé uniquement pour RELATED
et déjà les ESTABLISHED
connexions ( recommandé car parfois une communication bidirectionnelle est requise).
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Autres règles utiles
Autorisez les requêtes ping de l'extérieur.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Transférer le trafic sur le eth0
port 2200
vers 10.0.3.21:22
(utile si vous souhaitez exposer un serveur SSH qui s'exécute à l'intérieur d'un conteneur).
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22
Si vous vous connectez avec succès à votre serveur en utilisant SSH, une connexion persistante sera créée (c.-à-d. Aucune nouvelle connexion même si vous êtes connecté pendant plus d'une heure). Si vous échouez et essayez de vous reconnecter, une nouvelle connexion sera créée. Cela bloquera les tentatives de connexion SSH continues en limitant les nouvelles connexions par heure.
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP
Redirigez toutes les demandes sur le port 443
vers le port 4430
(utile si vous souhaitez vous lier au port 443
sans root
).
sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
ens3
l'interface réseau.
-m geoip
module de bloc de pays (voir étape 5).
Avertissement: ne l'utilisez pas lo
, le système d'exploitation supprimera tous les paquets redirigés vers l'interface de bouclage .
5. Autoriser ou bloquer des pays entiers
5.1 Installer xtables-addons
Vous pouvez installer le xtables-addons
module en utilisant différentes méthodes, n'hésitez pas à utiliser la méthode d'installation qui vous convient le mieux.
-
Installez en utilisant apt-get
.
sudo apt-get install xtables-addons-common
-
Installez en utilisant module-assistant
.
sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant --verbose --text-mode auto-install xtables-addons
-
Installez depuis la source.
sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
cd xtables-addons
./autogen.sh
./configure
make
sudo make install
Créer une base de données "pays".
sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv
Redémarrez votre système.
sudo reboot
Après xtables-addons
avoir été installé avec succès, après le premier redémarrage, exécutez depmod
sinon le blocage par pays ne fonctionnera pas correctement (cela n'est requis que pour la première fois).
sudo depmod
Créez un script à /etc/cron.monthly/geoip-updater
pour mettre à jour la geoip
base de données mensuellement.
#!/usr/bin/env bash
# this script is intended to run with sudo privileges
echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip
echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl
echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater
Rendez /etc/cron.monthly/geoip-updater
exécutable.
sudo chmod +x /etc/cron.monthly/geoip-updater
5.2 Exemples de règles
_Remarque: Si vous recevez une iptables: No chain/target/match by that name
erreur lorsque vous essayez d'appliquer une geoip
règle, il est possible qu'elle xtables-addons
n'ait pas été installée correctement. Essayez une autre méthode d'installation.
Bloquer tous les paquets entrants en provenance de Chine, Hong Kong, Russie et Corée.
sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP
Autorisez les paquets entrants sur le port 80
de partout, sauf dans les pays ci-dessus.
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Autorisez les paquets entrants sur l' ens3
interface sur le port 22
uniquement du Pérou (n'hésitez pas à choisir le code de pays dont vous souhaitez accepter les paquets, par exemple US
pour les États-Unis).
sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT
Autoriser les paquets entrants sur le port 443
uniquement du Pérou.
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT