Вопрос: 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
2018-04-28 21:09


Источник




Ответы:


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.


165
2018-04-28 23:35



Ну, я не могу вас поблагодарить. Это очень описательно и очень информативно. Позже я понял, что знание TC потребуется, и с тех пор я начал изучать это. Еще раз спасибо! - James
О, и для потери связи. Я уверен, что у меня есть конфигурация, прежде чем переходить с моего VPS на главный компьютер. Кроме того, у меня есть VPN-доступ к частной сети на ETH0. Я буду работать только над ETH1, поэтому теоретически у меня не будет проблемы. Но предупреждение было слышно! - James
Я не могу сказать вам, сколько раз я читал похожие учебники, это первый, который имел смысл - RC1140
В качестве побочного элемента его обычно более целесообразно ограничивать ресурсы таким же образом в контрольных группах (опять же, также возможно, а также недоиспользуемым и удивительным), поскольку вы можете определять ограничения на приложение для процессора, памяти, ввода-вывода и сети в централизованном хранилище политик ». Но еще не видел, чтобы такой вопрос был поставлен, чтобы дать ответ. - Matthew Ife
Если вам не нравится tc синтаксис, который вы могли бы дать tcng попытка, которая добавляет немного более удобный язык, который генерирует tc команды. Мне это нравилось в сценариях оболочки: echo '... multi line tcng configuration ...' | tcng | sh, - Mattias Wadman


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


5
2018-04-28 21:12



Спасибо за ваш быстрый ответ. К сожалению, моя главная проблема - вторая половина. Я изучил -лимит, и я не видел ничего, что позволяло мне ограничивать на основе KB / s - любое направление, на которое вы можете указать мне? - James
@ Джеймс, я бы вернулся к тебе, но мне пришлось выйти в дом друга. Только что вернулся, и я вижу, что MIfe проделал большую работу. знак равно - Wesley