Je veux faire quelques règles simples iptables pour refuser toutes les connexions entrantes et permettre les connexions sortantes. Comment puis je faire ça?
Essayez ceci avec un accès root:
# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Notez que cela va couper brutalement toutes les connexions en cours d'exécution - cela inclut des éléments tels que la connexion SSH que vous pouvez utiliser pour administrer le serveur. Utilisez-le uniquement si vous avez accès à une console locale.
Voir la réponse de Miphix pour savoir comment ajouter une exception pour SSH.
Si vous travaillez à distance via SSH, vous pouvez ajouter ceci (-I
l'insère avant toutes les autres règles dans INPUT
):
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
Si votre service SSH écoute sur un autre port, vous devrez utiliser ce port au lieu de 22
.
Sinon, vous pourriez perdre accidentellement l'accès.
Les deux réponses ci-dessus sont correctes d'une manière ou d'une autre, mais elles ne sont pas assez précises pour permettre à la réponse de Origin de répondre (Désolé, je n'ai pas assez de réputation pour ajouter un commentaire, écrivez donc une réponse complète).
J'ai rencontré le serveur Apache surchargé, surchargé de tâches cron, utilisant trop de processeurs. Les limites de threads étaient stockées dans la base de données SQL, mais je respectais la limite de ses connexions. Je voulais limiter les connexions Apache entrantes à partir de l'hôte local (cette partie est facultative), tout en conservant toute autre connexion possible. Y compris ceux qui ont été effectivement établis.
Je l'ai fait avec commande
Sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT
Cela signifie que: pour chaque paquet tcp entrant sur le port 80, chargez le module state
et, s’il s’agit du premier paquet (connexion entrante), refusez-le. Pour localhost, vous pouvez simplement utiliser -s 127.0.0.0/8
Et pour une utilisation réelle, dans certains cas, vous pouvez ajouter "INVALID" aux états, NEW,INVALID
, car vous pouvez envoyer des packages "malveillants" en essayant de contourner votre règle. Et remplacez également par -j DROP
pour enregistrer votre trafic sortant (il n’enverra pas de balise de rejet)
Sachez que les autres réponses ne couvrent pas IPv6! Si votre système accepte le trafic IPv6, aucune règle iptables ne s’appliquera au trafic ipv6.
au lieu d'utiliser iptables/ip6tables directement, je recommande d'utiliser iptables-restore et de sauvegarder. Ces outils permettent de spécifier une configuration iptables avec plusieurs règles et de la charger facilement avec une seule commande.
créez un fichier (je l'ai nommé iptables.rules) avec le contenu suivant:
*filter
# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]
# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]
# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]
# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# do not block localhost
-A INPUT -i lo -j ACCEPT
# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT
# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# commit changes
COMMIT
Notez que j'ai ajouté quelques exemples supplémentaires si vous souhaitez autoriser le trafic ICMP et le trafic sur des ports spécifiques.
maintenant vous pouvez le charger avec ces commandes:
iptables-restore < iptables.rules
ip6tables-restore < iptables.rules
Maintenant, vos règles couvrent également ipv6 et sont faciles à gérer.
Remarque supplémentaire pour les utilisateurs de Debian: si vous êtes satisfait de vos règles, vous pouvez apt install iptables-persistent
pour que les règles soient restaurées après le redémarrage. Les règles ne sont pas automatiquement enregistrées à l'arrêt, exécutez donc netfilter-persistent save
pour mettre à jour les règles persistantes.