Je veux faire quelques règles iptables simples pour refuser toutes les connexions entrantes et autoriser les sorties. Comment puis je faire ça?
17
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 coupera brutalement toutes les connexions en cours d'exécution - cela inclut des choses comme 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 (l'
-I
insère avant toutes les autres règlesINPUT
):Si votre service SSH écoute sur un autre port, vous devrez utiliser ce port à la place de
22
.Sinon, vous pourriez accidentellement perdre l'accès.
la source
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 directement iptables / ip6tables, je recommande d'utiliser iptables-restore et save. Ces outils permettent de spécifier une configuration iptables avec plusieurs règles et de la charger facilement avec une seule commande.
créer un fichier (je l'ai nommé iptables.rules) avec le contenu suivant:
Notez que j'ai ajouté un exemple supplémentaire si vous souhaitez autoriser ICMP et le trafic vers des ports spécifiques.
vous pouvez maintenant le charger avec ces commandes:
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 le
apt install iptables-persistent
faire pour qu'elles soient restaurées après le redémarrage. Les règles ne sont pas enregistrées automatiquement à l'arrêt, alors exécuteznetfilter-persistent save
pour mettre à jour les règles persistantes.la source
Les deux réponses ci-dessus sont en quelque sorte correctes, mais elles ne sont pas assez précises pour répondre à l'origine. (Désolé, je n'ai pas assez de réputation pour ajouter un commentaire, donc écrivez une réponse complète).
Dans mon cas, j'ai rencontré un serveur Apache surchargé, surchargé de tâches cron, utilisant trop le processeur. Les limites de threads étaient stockées dans la base de données SQL, mais j'ai rencontré la limite de ses connexions. Je voulais limiter les connexions Apache entrantes de l'hôte local (cette partie est facultative), mais garder toutes les autres connexions possibles. Y compris ceux qui ont été effectivement créés.
Je l'ai fait avec commande
sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT
Cela signifie: pour chaque paquet TCP entrant sur le port 80, chargez le
state
module, et s'il s'agit du premier paquet (connexion entrante), rejetez-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 'INVALIDE' aux états
NEW,INVALID
, car on peut envoyer des paquets "malveillants" en essayant de contourner votre règle. Et également remplacer par-j DROP
pour enregistrer votre trafic sortant (il n'enverra pas de balise de rejet)la source