Як я можу зробити IP-трафік формуванням трафіку?


16

У нас є прозора установка проксі-сервера. Я намагався шукати форму трафіку в Linux, і все, що я міг знайти в Інтернеті, - це обмежити трафік за допомогою інтерфейсу (eth0 / eth1 ...).

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

Чи можна це зробити?

Відповіді:


18

Шар формування трафіку ядра - це, в основному, планувальник пакетів, приєднаний до вашої мережевої карти. Так одна політика формування трафіку поширюється на одну мережеву карту.

Що ви можете зробити, у вашому випадку, це створити список IP-адрес і пропускної здатності, що додається, а потім для кожного IP-адреси ви створюєте:

  • Одне правило формування трафіку, ідентифіковане класідом
  • Одне правило netfilter, яке позначатиме пакети до певного значення позначки
  • Один фільтр, який прив’яже ці пакети до позначки 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

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


гмм .. як додати обмеження пропускної здатності за замовчуванням для тих, хто не в списку?
Кокідзу

Ви використовували $ mark як пріоритетне визначення. Не було б краще використовувати однаковий пріоритет для всіх?
motobói

якщо я зміню "iptables -t mangle -A INPUT" на "iptables -t mangle -A OUTPUT", чи можу я контролювати швидкість від свого сервера до певного IP?
Франк Барсенас

як відновити налаштування після цього?
Стефан Рогін

Cant ', здається, робить цю роботу, пише команди вручну без циклу для одного ip.
Адонес Пітого

5

Щось подібне працювало для мене, щоб обмежити веб-камеру підрядника обмеженою пропускною здатністю. Ознайомтеся з довідковою сторінкою для 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

3
CBQ трохи відмовився ... ви знайдете HTB набагато простіше у використанні та отримаєте такий же результат
Julien Vehent

1
Не потрібно експортувати DEV, якщо він використовується лише в цьому сценарії ....
Герт ван ден Берг

1

Я не впевнений, що я правильно розумію ваше запитання.

Прозоре проксі (як у Squid для HTTP) використовується для управління в основному вхідними даними. У той час як формування трафіку використовується для контролю вихідних даних.

Вам потрібно надати більше деталей. Якщо у вас є багато робочих станцій за проксі-сервером HTTP і ви намагаєтесь обмежити їх швидкість завантаження, вам краще скористатися чимось на зразок пулів Squid + затримки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.