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", і ви побачите статистику, що вказує на переадресацію пакетів у повільну чергу.
Зауважте, що єдиний реальний недолік цього - це змусити його пережити перезавантаження. Я не думаю, що доступні скрипти init для створення ipsets з дампів при перезавантаженні (і вони також повинні бути створені перед правилами iptables), і я впевнений, що немає сценаріїв init для перезавантаження правил управління трафіком при перезавантаженні. Якщо вас це не турбує, ви можете просто відтворити всю річ із виклику сценарію в rc.local.