Назад | Перейти на главную страницу

IPTABLES - ограничение скорости определенного входящего IP

Я не хочу ограничивать скорость конкретной услуги. Моя цель - ограничить скорость исключительно на основе входящего IP-адреса. Например, используя псевдоправило:

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

Как я могу ограничить скорость использования IPTables на основе входящих IP-адресов?

IPTables не предназначен для такого рода работы, когда необходимо анализировать множество пакетов для принятия этих решений. IPTables - отчасти ответ!

Настоящий ответ на этот вопрос - прекрасные и недостаточно используемые средства управления трафиком в Linux. Обратите внимание, что возиться с этим, не зная, что происходит, может привести к потере сетевого подключения к машине! Вы были предупреждены!

Предполагая, что eth0 является исходящим устройством, вам нужно будет создать очередь управления трафиком на основе классов, которая по умолчанию будет выводить большую часть трафика через «быструю» очередь и помещать определенный список людей в «медленную» очередь.

Прелесть этого заключается в том, что вы можете создать ситуацию, при которой вы разрешаете большой исходящий трафик для медленного пользователя, если преобладающий класс не хочет пропускную способность, но в этом примере этого не происходит (всегда будет предоставлять 10 кбит / с для медленных пользователей). Система массового обслуживания будет выглядеть примерно так:

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

Для этого сначала вам нужно настроить в ядре дисциплину очередей. Следующее сделает это за вас .. вы должны запустить это как единый скрипт

#!/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

Значение «по умолчанию 11» важно, поскольку оно сообщает ядру, что делать с незарегистрированным трафиком.

Как только это будет сделано, вы можете настроить правило iptables для классификации пакетов, соответствующих определенным критериям. Если вы планируете использовать это правило медленной обработки для множества и многих людей, более подходящим будет правило ipset (которое, как я полагаю, должно быть доступно на rhel6).

Итак, создайте базу данных ipset для сопоставления с ...

ipset create slowips hash:ip,port

Затем создайте правило iptables для сопоставления.

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

Это указывает ядру, что если вы сопоставляете IP-адрес назначения с исходным портом из набора, классифицируйте его в медленную очередь, которую вы устанавливаете с контролем трафика.

Теперь, наконец, всякий раз, когда вы хотите замедлить IP-адрес, вы можете использовать команду ipset, чтобы добавить ip в набор, например:

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

Вы можете проверить его работу, используя команду «tc -s class show dev eth0», и вы увидите там статистику, указывающую, что пакеты перенаправляются в медленную очередь.

Обратите внимание, что единственным реальным недостатком этого является то, что он выживает после перезагрузки. Я не думаю, что есть какие-либо сценарии инициализации для создания ipset из дампов при перезагрузке (и они также должны быть созданы перед iptables rules), и я уверен, что нет сценариев инициализации для сброса правил управления трафиком при перезагрузке. Если вас это не беспокоит, вы можете просто воссоздать все это, вызвав скрипт в rc.local.

Это так же просто, как взять правило ограничения скорости и добавить -s переключатель. В -s switch соответствует входящим IP-адресам. Например iptables -A INPUT -s 1.1.1.1 а затем закончите с предпочитаемым методом ограничения скорости для этого правила.