web-dev-qa-db-fra.com

IPTABLES - Taux limite d'une IP entrante spécifique

Je ne souhaite pas limiter le tarif d'un service spécifique. Mon objectif est de limiter le taux basé uniquement sur l'adresse IP entrante. Par exemple, en utilisant une pseudo-règle:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

Comment pourrais-je évaluer la limite en utilisant IPTables en fonction des adresses IP entrantes?

103
James

IPTables n'est pas fait pour ce type de travail, où de nombreux lots de paquets doivent être analysés pour prendre ces décisions. IPTables est en partie la réponse!

La vraie réponse à cela est les installations impressionnantes et sous-utilisées de contrôle du trafic sous Linux. Notez que contourner cela sans savoir ce qui se passe peut vous faire perdre la connectivité réseau avec la machine! Tu étais prévenu!

En supposant que eth0 est le périphérique sortant, vous aurez besoin de créer une file d'attente de contrôle du trafic basée sur les classes qui, par défaut, générera le plus de trafic via la file d'attente "rapide" et placera une liste spécifique de personnes dans la file d'attente "lente".

La beauté de ceci est que vous pouvez créer une situation dans laquelle vous autorisez beaucoup de trafic sortant pour l'utilisateur lent, sauf si une classe prioritaire veut la bande passante, mais cet exemple ne le fait pas (fournira toujours 10 kbps aux utilisateurs lents). Le système de mise en file d'attente ressemblera à ceci:

                         Inbound traffic
                              +
                              |
                              |
                              v
                     +------------------+
                     |   Class 1:1      |
                     |------------------|
                     |  Root (all flows)|
                     |       100mbit    |
                     +-----+-----+------+
                           |     |
                           |     |
                           |     |
                           |     |
                           |     |
          +----------+     |     |     +----------+
          |    1:11  +-----+     +-----+    1:12  |
          |----------|                 |----------|
          | Default  |                 | Slow     |
          |100mb-80kb|                 |   80kb   |
          +----------+                 +----------+

Pour ce faire, vous devez d'abord configurer la discipline de mise en file d'attente dans le noyau. Ce qui suit fera cela pour vous .. vous devez l'exécuter comme un script entier

#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit

tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo

Le "11 par défaut" est important car il indique au noyau quoi faire avec le trafic non classé.

Une fois cela fait, vous pouvez ensuite configurer une règle iptables pour classer les paquets qui correspondent à certains critères. Si vous envisagez de mettre beaucoup de gens dans cette règle lente, une règle ipset est plus appropriée (qui devrait être disponible sur rhel6 je crois).

Alors, créez une base de données ipset pour faire la correspondance avec ...

ipset create slowips hash:ip,port

Créez ensuite la règle iptables pour faire la correspondance.

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

Cela indique au noyau que si vous faites correspondre l'IP de destination avec le port source de l'ensemble, le classer dans la file d'attente lente que vous configurez avec le contrôle du trafic.

Maintenant, enfin, chaque fois que vous voulez ralentir une adresse IP, vous pouvez utiliser la commande ipset pour ajouter l'adresse IP à l'ensemble, comme ceci:

ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...

Vous pouvez tester son fonctionnement en utilisant la commande "tc -s class show dev eth0" et vous verrez des statistiques indiquant les paquets redirigés vers la file d'attente lente.

Notez que le seul véritable inconvénient est de lui faire survivre aux redémarrages. Je ne pense pas qu'il existe des scripts d'initialisation disponibles pour créer les ipsets à partir de vidages au redémarrage (et ils doivent également être créés avant règles iptables) et je suis certain qu'il n'y a pas de scripts d'initialisation pour réinitialiser le contrôle du trafic règles de redémarrage. Si cela ne vous dérange pas, vous pouvez simplement recréer le tout en appelant un script dans rc.local.

166
Matthew Ife

C'est aussi simple que de prendre une règle de limitation de débit et d'ajouter le -s commutateur. Le -s le commutateur correspond aux adresses IP entrantes. Par exemple iptables -A INPUT -s 1.1.1.1 puis terminer avec votre méthode préférée de limitation de taux pour cette règle.

5
Wesley