Как я могу сделать формирование трафика в Linux по IP?

15

У нас есть прозрачная настройка прокси. Я пытался найти трафик в Linux, и все, что я мог найти в Интернете, это ограничить трафик по интерфейсу (eth0 / eth1 ...).

Мне нужно ограничить пропускную способность (никогда не превышая определенного предела) IP-адресом или диапазонами IP-адресов, и я не могу найти способ сделать это.

Есть ли способ сделать это?

Усама ALASSIRY
источник

Ответы:

17

Уровень формирования трафика ядра - это, в основном, планировщик пакетов, подключенный к вашей сетевой карте. Таким образом, одна политика формирования трафика применяется к одной сетевой карте.

В вашем случае вы можете создать список подключенных IP-адресов и пропускной способности, а затем для каждого IP-адреса создайте:

  • Одно правило формирования трафика, идентифицированное classid
  • Одно правило сетевого фильтра, которое помечает пакеты для определенного значения метки
  • Один фильтр, который будет привязывать эти пакеты к classid, тем самым применяя правило контроля трафика к указанным пакетам.

Пример, данный @Zoredache, работает, но я лично предпочитаю использовать возможность Netfilter вместо TC для фильтрации пакетов и HTB вместо CBQ для алгоритма шейпинга. Так что вы можете попробовать что-то вроде этого (требуется Bash 4 для ассоциативных массивов):

#! /bin/bash
NETCARD=eth0
MAXBANDWIDTH=100000

# reinit
tc qdisc del dev $NETCARD root handle 1
tc qdisc add dev $NETCARD root handle 1: htb default 9999

# create the default class
tc class add dev $NETCARD parent 1:0 classid 1:9999 htb rate $(( $MAXBANDWIDTH ))kbit ceil $(( $MAXBANDWIDTH ))kbit burst 5k prio 9999

# control bandwidth per IP
declare -A ipctrl
# define list of IP and bandwidth (in kilo bits per seconds) below
ipctrl[192.168.1.1]="256"
ipctrl[192.168.1.2]="128"
ipctrl[192.168.1.3]="512"
ipctrl[192.168.1.4]="32"

mark=0
for ip in "${!ipctrl[@]}"
do
    mark=$(( mark + 1 ))
    bandwidth=${ipctrl[$ip]}

    # traffic shaping rule
    tc class add dev $NETCARD parent 1:0 classid 1:$mark htb rate $(( $bandwidth ))kbit ceil $(( $bandwidth ))kbit burst 5k prio $mark

    # netfilter packet marking rule
    iptables -t mangle -A INPUT -i $NETCARD -s $ip -j CONNMARK --set-mark $mark

    # filter that bind the two
    tc filter add dev $NETCARD parent 1:0 protocol ip prio $mark handle $mark fw flowid 1:$mark

    echo "IP $ip is attached to mark $mark and limited to $bandwidth kbps"
done

#propagate netfilter marks on connections
iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark

- редактировать: забыл класс по умолчанию и распространять отметки в конце скрипта.

Жюльен Вехент
источник
ммм .. как добавить ограничение по умолчанию для тех, которых нет в списке?
Kokizzu
Вы использовали $ mark как определение prio. Не лучше ли использовать один и тот же приоритет для всех?
motobói
если я изменю «iptables -t mangle -A INPUT» на «iptables -t mangle -A OUTPUT», могу ли я контролировать скорость с моего сервера на определенный IP ??
Фрэнк Барсенас
как мне восстановить настройки после этого?
Стефан Рогин
Cant ', кажется, делает эту работу, писать команды вручную без цикла для одного IP.
Адонес Питого
5

Нечто подобное сработало для меня, чтобы ограничить веб-камеру подрядчика ограниченной полосой пропускания. Проверьте man-страницу для tc для деталей.

#!/bin/bash
set -x

DEV=eth0
export DEV

tc qdisc del dev $DEV root
tc qdisc del dev $DEV root
tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 100mbit

# setup a class to limit to 1500 kilobits/s
tc class add dev $DEV parent 1: classid 1:1 cbq rate 1500kbit \
   allot 1500 prio 5 bounded isolated

# add traffic from 10.2.1.37 to that class
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \
   match ip src 10.2.1.37 flowid 1:1
Zoredache
источник
3
CBQ немного заброшен ... вы бы нашли, что HTB намного проще в использовании и получите тот же результат
Julien Vehent 16.10.10
1
Нет необходимости экспортировать DEV, если он используется только в этом сценарии ....
Герт ван ден Берг
1

Я не уверен, что правильно понял ваш вопрос.

Прозрачное проксирование (как в Squid for HTTP) используется для контроля в основном входящих данных. В то время как формирование трафика используется для контроля исходящих данных.

Вы должны предоставить более подробную информацию. Если у вас много рабочих станций за HTTP-прокси и вы пытаетесь ограничить их скорость загрузки, вам лучше использовать что-то вроде пулов задержек Squid +.

halp
источник