IPTABLES - Гранична швидкість конкретного вхідного IP


103

Я не хочу обмежувати ціну конкретної послуги. Мої цілі - обмежити ставку виходячи виключно з вхідної 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-адрес?

Відповіді:


165

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.


3
Ну, я не можу вам подякувати достатньо. Це дуже описово і дуже інформативно. Пізніше я зрозумів, що знання ТС знадобляться, і з того часу я почав розбиратися в цьому. Знову дякую!
Джеймс

О, і щодо втрати зв'язку. Я переконуюсь, що у мене конфігурація знищена, перш ніж перейти від мого VPS до хост-машини. Також у мене є доступ до VPN до приватної мережі на ETH0. Я буду працювати тільки над ETH1, тому теоретично я не маю проблеми. Але попередження почуте!
Джеймс

2
Не можу сказати, скільки разів я читав подібні підручники, це перший, який мав сенс
RC1140

5
З іншого боку, як правило, більш доцільним є обмеження ресурсів, подібне до цього, у контрольних групах (знову ж, також можливе, а також недовикористане та дивовижне), оскільки ви можете визначити обмеження для кожного додатка на процесорі, пам'яті, вводі даних та мережі в централізованому магазині політик '. Але ще не вдається побачити таке питання, щоб запропонувати відповідь.
Метью Іфе

2
Якщо вам не подобається tcсинтаксис, ви можете спробувати tcng, який додасть трохи більш зручну мову, що генерує tcкоманди. Я любив це в сценаріях оболонки: echo '... multi line tcng configuration ...' | tcng | sh.
Маттіас Вадман

5

Це так само просто, як прийняти правило обмеження швидкості та додати -sкомутатор. -sПеремикача відповідає входять IP - адрес. Наприклад, iptables -A INPUT -s 1.1.1.1а потім закінчити ваш бажаний метод обмеження ставок для цього правила.


Дякую за швидку відповідь. На жаль, моя головна проблема - це друга її половина. Я переглянув --limit, і я не бачив нічого, що дозволяє мені обмежуватись на основі КБ / с - в будь-якому напрямку, на який ви можете вказувати?
Джеймс

1
@James Я б повернувся до тебе, але мені довелося вийти до будинку друга. Тільки що повернувся і я бачу, що MIfe зробив цілком свою роботу. =)
Веслі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.