Назад | Перейти на главную страницу

Как использовать iptables или tc для ограничения количества пакетов на одного клиента.

У меня есть проблемы с сетевыми клиентами, которые слишком быстро отправляют данные.

Я хочу их замедлить, используя iptables или, возможно, tc.

Я видел такие решения iptables, как:

sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT

но я думаю, что ограничение распространяется на все, что соответствует правилу, а не на адрес клиента.

Есть ли способ сделать это правило ограничивать количество пакетов на адрес клиента?

Я сделал это, используя комбинацию TC и iptables hashlimit. Я создал ограничитель исходящей пропускной способности TC на интерфейсе LAN (для целевого трафика загрузки), установленный на 5 Мбит / с. Затем я использую модуль iptables hashlimit в выходной цепочке интерфейса, чтобы, если скорость пакетов превышает определенный порог, между любыми двумя отдельными IP-адресами источника и назначения, он начинает классифицировать эти пакеты в класс формирования трафика TC 5 Мбит / с. .

Тем не менее, вы должны правильно установить порог пакетов, и я основал свой на том факте, что мой MTU составляет 1500 байт, поэтому использовал это, чтобы вычислить, сколько пакетов в секунду должно было бы создать порог 1,5 Мбит в секунду (1000 пакетов в секунду ). В сочетании с установкой максимально возможного значения пакета в модуле hashlimit iptables (который в моей настройке кажется равным 10000), результатом всего этого является то, что короткие загрузки выполняются на полной скорости, а более длинные начинают замедляться, поскольку некоторые пакеты передается в класс ограничения пропускной способности TC, который затем, очевидно, снижает скорость передачи пакетов и т.д. и т.п. И поскольку используется TC, никакие пакеты никогда не сбрасываются - просто задерживаются и замедляются из-за того, что они попадают в класс TC после достижения скорости передачи пакетов.

Это на коробке с CentOS 6. Я думаю, что более современные вещи позволяют модулю hashlimit поддерживать байты в секунду, а не только пакеты в секунду, что даже лучше, но я попробовал это на своей установке, и он просто вернулся к использованию пакетов в секунду.

Я сейчас использую мобильный телефон, поэтому не могу вставить какую-либо конфигурацию, но если вам нужны примеры, дайте мне знать, и я отредактирую этот ответ. Мне очень нравится это решение, потому что ограничение, на которое я пошел, основано на IP-адресе источника и назначения. Таким образом, система видит каждую отдельную комбинацию IP src + dst как свой собственный поток пакетов для ограничения. Модуль hashlimit поддерживает также порты источника и назначения (в основном любая комбинация IP-адреса источника, порта источника, IP-адреса назначения, порта назначения), поэтому вы даже можете установить ограничение для каждого сеанса между исходным IP + портом и целевым IP + портом. .

ОБНОВИТЬ

Ниже показано, как вы это делаете; потребуются эксперименты.

tc:

/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 5Mbit

iptables:

#!/bin/bash

[[ "$1" =~ ^[ADI]$ ]] || exit 1

for IPT in /sbin/ip{,6}tables
do
  $IPT -t mangle -$1 POSTROUTING -o eth0 -m hashlimit --hashlimit-above 1000/second --hashlimit-burst 10000 --hashlimit-mode srcip,dstip --hashlimit-name limiter -j CLASSIFY --set-class 1:1
done

вы можете решить эту проблему простым способом, попробуйте использовать последний модуль с iptables, последний отслеживает адрес источника:

iptables -m recent -h
recent match options:
[!] --set                       Add source address to list, always matches.
[!] --rcheck                    Match if source address in list.
[!] --update                    Match if source address in list, also update last-seen time.
[!] --remove                    Match if source address in list, also removes that address from list.
    --seconds seconds           For check and update commands above.
                                Specifies that the match will only occur if source address last seen within
                                the last 'seconds' seconds.
    --reap                      Purge entries older then 'seconds'.
                                Can only be used in conjunction with the seconds option.
    --hitcount hits             For check and update commands above.
                                Specifies that the match will only occur if source address seen hits times.
                                May be used in conjunction with the seconds option.
    --rttl                      For check and update commands above.
                                Specifies that the match will only occur if the source address and the TTL
                                match between this packet and the one which was set.
                                Useful if you have problems with people spoofing their source address in order
                                to DoS you via this module.
    --name name                 Name of the recent list to be used.  DEFAULT used if none given.
    --rsource                   Match/Save the source address of each packet in the recent list table (default).
    --rdest                     Match/Save the destination address of each packet in the recent list table.
    --mask netmask              Netmask that will be applied to this recent list.

пример блокировки брутфорса ssh:

iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --set
iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --rcheck --seconds  30 --hitcount 2 -j DROP

Возможно, вы сможете решить эту проблему с помощью модуля connlimit:

http://www.cyberciti.biz/faq/iptables-connection-limits-howto/