Comment gérer les règles iptables à la volée?
je dois interroger les règles existantes, en plus d'être capable d'ajouter et de supprimer facilement des règles. Je n'ai pas trouvé D'API pour faire ça. Y a-t-il quelque chose que je manque?
la solution la plus proche que j'ai trouvée est iptables-save | iptables-xml
pour interroger et appeler manuellement la commande iptables elle-même pour ajouter/supprimer des règles. Une autre solution que j'ai envisagée est simplement de régénérer l'ensemble des règles sorties de la base de données de mon application et de vider toute la chaîne, puis de l'appliquer à nouveau. Mais Je je veux éviter ça car je ne veux pas laisser tomber de paquets ... à moins qu'il y ait un moyen de faire ça atomiquement. Je me demande s'il y a un meilleur moyen.
une API en C serait génial; cependant, comme j'ai l'intention de le construire dans un programme suid autonome, les bibliothèques qui font cela dans N'importe quelle langue sont très bien aussi.
8 réponses
La réponse est malheureusement Non.
Maintenant, vous pourriez penser " mais qu'libiptc?'. Comme cela a été souligné à de nombreuses reprises sur la(Les) liste (s) de diffusion, libiptc était jamais destiné à être utilisé comme une interface publique. Nous ne garantissons pas une interface stable, et il est prévu de la supprimer dans la prochaine incarnation du filtrage de paquets linux. libiptc est une couche beaucoup trop basse pour être utilisée raisonnablement de toute façon.
nous sommes bien conscients qu'il y a un manque fondamental pour une telle API, et nous travaillons à améliorer cette situation. Jusqu'alors, il est recommandé d'utiliser system() ou ouvrir un tuyau dans stdin de iptables-restore. Ce dernier vous permettra de meilleures performances.
utiliser les règles iptables-save et iptables-restore to query and regenerate est facilement le moyen le plus efficace de le faire. Ceux-ci étaient, autrefois, des scripts shell, mais maintenant ce sont des programmes C qui fonctionnent très efficacement.
cependant, je dois souligner qu'il y a un outil que vous pouvez utiliser qui rendra la maintenance d'iptables beaucoup plus facile. La plupart des règles dynamiques sont en fait la même règle répétée plusieurs fois, comme:
iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT
ipset -N ssh_allowed nethash
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT
ipset -A ssh_allowed 1.1.1.1
ipset -A ssh_allowed 2.2.2.0/24
il y a même une façon atomique d'échanger un ensemble avec un autre, donc un rafraîchissement signifie créer un nouvel ensemble temporaire, puis l'échanger comme le nom de l'ensemble existant.
vous pouvez utiliser rfw qui est L'API REST pour iptables. Il sérialise les commandes iptables à partir de diverses sources potentiellement concurrentes et exécute iptables à distance à la volée.
rfw est conçu pour les systèmes distribués qui essayent de mettre à jour les règles de pare-feu sur plusieurs boîtes, mais il peut être exécuté aussi sur une seule machine sur l'interface localhost. Ensuite, il permet d'éviter les frais généraux de SSL et d'authentification car il peut être exécuté sur un HTTP simple dans ce cas.
Exemple de commande:
PUT /drop/input/eth0/11.22.33.44
ce qui correspond à:
iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP
vous pouvez insérer et supprimer des règles ainsi que demander l'état actuel pour obtenir les règles existantes dans le format JSON:
GET /list/input
Avertissement: j'ai commencé ce projet. Il est open source sous la licence MIT.
d'après ce que je comprends (bien qu'aucune référence ne semble le mentionner), iptables-restore
est atomique. À la fin, lorsque l' COMMIT
la ligne est lue,iptables
appelle iptc_commit
libiptc
(qui, dans une interface interne vous n'êtes pas censé utiliser), puis appelle setsockopt(SO_SET_REPLACE)
avec vos nouvelles règles.
cela semble aussi atomique que possible: avec un appel du noyau. Toutefois, les parties mieux informées sont invitées à contester cette décision. : -)
Modifier:
Je peux confirmer que votre description est correcte. iptables-restore
est fait comme une opération atomique dans le noyau.
Pour être encore plus certains l'opération "seulement"est atomique sur une base CPU. Comme nous stockons la totalité des blobsets de règles par CPU (en raison des optimisations de cache).
il n'y a délibérément pas D'API pour gérer ces règles. Vous n'êtes pas censé vouloir le faire. Ou quelque chose.
si vous avez besoin de règles qui sont suffisamment dynamiques vous vous souciez de la performance de l'exécution /sbin/iptables, il y a d'autres façons de le faire:
- en utilisant quelque chose comme la correspondance" recent " ou la correspondance ip set, vous pouvez ajouter/supprimer les adresses IP des listes noir/blanc sans changer la règle set.
- Vous pouvez transmettre des paquets dans l'espace utilisateur pour filtrage à L'aide de NFQUEUE
ce matin, je me suis réveillé pour découvrir qu'il recevait une attaque de déni de Service (DOS) de la Russie. Ils me frappaient depuis des douzaines de blocs de propriété intellectuelle. Ils devaient avoir soit un grand bassin de pi, soit une sorte de liste ou de service de procuration. Chaque fois que j'ai bloqué une adresse IP, une autre est apparue. Finalement, j'ai cherché un script, et j'ai trouvé que j'avais besoin d'écrire ma propre solution. Ce qui suit est un peu agressif, mais ils étaient en cours d'exécution mon niveau de charge maximale à plus de 200.
voici un script rapide I écrit pour bloquer le DOS en temps réel.
cat **"output of the logs"** | php ipchains.php **"something unique in the logs"**
==> Script PHP:
<?php
$ip_arr = array();
while(1)
{
$line = trim(fgets(STDIN)); // reads one line from STDIN
$ip = trim( strtok( $line, " ") );
if( !array_key_exists( $ip, $ip_arr ) )
$ip_arr[$ip] = 0;
$regex = sprintf( "/%s/", $argv[1] );
$cnt = preg_match_all( $regex, $line );
if( $cnt < 1 ) continue;
$ip_arr[$ip] += 1;
if( $ip_arr[$ip] == 1 )
{
// printf( "%s\n", $argv[1] );
// printf( "%d\n", $cnt );
// printf( "%s\n", $line );
printf( "-A BLOCK1 -s %s/24 -j DROP\n", $ip );
$cmd = sprintf( "/sbin/iptables -I BLOCK1 -d %s/24 -j DROP", $ip );
system( $cmd );
}
}
?>
suppositions:
1) BLOCK1 is a Chain already created.
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file.
4) You are familiar with PHP
5) You understand web log line items/fields and output.
ceci est un exemple d'utilisation de bash et iptables pour bloquer dynamiquement les hackers abusant de sshd sur CentOS. Dans ce cas, j'ai configuré sshd pour interdire la connexion par mot de passe (permet les clés). Je regarde dans /var/log/secure pour les entrées de "Bye Bye", qui est la façon polie de sshd de dire f-off...
IP=$(awk '/Bye Bye/{print }' /var/log/secure |
sed 's/://g' |sort -u | head -n 1)
[[ "$IP" < "123" ]] || {
echo "Found $IP - blocking it..." >> /var/log/hacker.log
/sbin/iptables -A INPUT -s $IP -j DROP
service iptables save
sed -i "/$IP/d" /var/log/secure
}
je fais ça en boucle à chaque seconde, ou minute, ou ce qui me rend heureuse. Je teste la valeur de $IP pour vérifier qu'elle a trouvé une valeur utile, si c'est le cas j'invoque iptables pour la laisser tomber, et j'utilise sed pour purgez le fichier log de $IP pour que l'entrée ne soit pas ajoutée de nouveau.
je fais un petit pré-traitement (non affiché) pour lister quelques IPs importants qui sont toujours valides et qui pourraient avoir eu des problèmes de connexion (en raison d'une erreur de l'utilisateur).
de temps en temps, je trie la liste des filtres iptables et je crée des plages IP à partir de ceux - ci (en utilisant un script différent-et lorsqu'elles sont vérifiées, elles sont généralement des plages IP de l'Inde, de la Chine et de la Russie). Ainsi, mon ensemble de règles de filtrage iptables reste entre 50 et 500 entrées; ipset n'améliore pas vraiment beaucoup sur une liste si courte.
MarkR a raison, tu n'es pas censé faire ça. Le plus simple est d'appeler iptables à partir d'un script ou d'écrire la config iptables et "restauration".
encore, si vous voulez, lisez la source d'iptables. iptables utilise les correspondances et les tables comme objets partagés. Vous pouvez utiliser la source ou.
le Linux netfilter a aussi des fichiers include sous /usr/include/netfilter*. Il s'agit de fonctions de niveau relativement bas. C'est ce que iptables utilise. C'est aussi proche d'une API que on peut obtenir sans iptables.
mais cette API est "désordonnée". Gardez à l'esprit qu'il a été conçu pour être utilisé uniquement par iptables. Ce n'est pas très bien documenté, vous pouvez frapper des problèmes très spécifiques, L'API peut changer assez rapidement sans aucun avertissement, donc une mise à jour va probablement casser votre code, etc.