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)

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

101 голос | спросил James 29 AMpSun, 29 Apr 2012 01:09:26 +040009Sunday 2012, 01:09:26

2 ответа


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», и вы увидите статистику там, указав, что пакеты перенаправляются в медленную очередь.

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

ответил Matthew Ife 29 AMpSun, 29 Apr 2012 03:35:52 +040035Sunday 2012, 03:35:52
5

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

ответил Wesley 29 AMpSun, 29 Apr 2012 01:12:59 +040012Sunday 2012, 01:12:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132