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", и вы увидите там статистику, указывающую, что пакеты перенаправляются в медленную очередь.
Обратите внимание, что единственным реальным недостатком является выживание перезагрузок. Я не думаю, что есть какие-либо сценарии инициализации, доступные для создания ipsets из дампов при перезагрузке (и они также должны быть созданы до правил iptables), и я уверен, что нет сценариев init для сброса правил управления трафиком при перезагрузке. Если вас это не беспокоит, вы можете просто воссоздать все это, вызвав скрипт в rc.local.
tc
синтаксис, вы можете попробовать tcng, который добавляет немного более удобный язык, который генерируетtc
команды. Я любил это в сценариях оболочки:echo '... multi line tcng configuration ...' | tcng | sh
.Это так же просто, как принять правило ограничения скорости и добавить
-s
переключатель.-s
Переключателя соответствует входящих IP - адресов. Например,iptables -A INPUT -s 1.1.1.1
а затем закончите с вашим предпочтительным методом ограничения скорости для этого правила.источник