Я не хочу ограничивать скорость конкретной услуги. Моя цель - ограничить скорость исключительно на основе входящего 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
а затем закончите с предпочитаемым методом ограничения скорости для этого правила.