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

Linux: ограничение конкретной скорости порта путем объединения tc с iptables не работает должным образом

Сценарий удар пытается ограничить скорость входящего трафика порта 2000, при использовании iptables для отметки INPUT пакеты не работают, но OUTPUT работает отлично.

я использую nc -kl 2000 на машине 10.0.1.54 и iperf -c 10.0.1.54 -p 2000 -t 10 на другой машине, чтобы проверить это.

Зачем OUTPUT работает, но не INPUT?

dev=enp3s0
ip_addr=10.0.1.54
ip_port=2000

rate_limit=20kbit
htb_class=10

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

if [ "$1" = "enable" ]; then
    echo "enabling rate limits"
    tc qdisc del dev $dev root > /dev/null 2>&1
    tc qdisc add dev $dev root handle 1: htb

    tc class add dev $dev parent 1: classid 1:$htb_class htb rate $rate_limit ceil $rate_limit
    tc filter add dev $dev parent 1: prio 0 protocol ip handle $htb_class fw flowid 1:$htb_class

    # marking the INPUT chain does dot work as expected
    #iptables -t mangle -A INPUT -d $ip_addr -p tcp --dport $ip_port -j MARK --set-mark $htb_class

    # marking the OUTPUT chain works fine
    iptables -t mangle -A OUTPUT -s $ip_addr -p tcp --sport $ip_port -j MARK --set-mark $htb_class
elif [ "$1" = "disable" ]; then
    echo "disabling rate limits"
    tc qdisc del dev $dev root > /dev/null 2>&1

    #iptables -t mangle -D INPUT -d $ip_addr -p tcp --dport $ip_port -j MARK --set-mark $htb_class
    iptables -t mangle -D OUTPUT -s $ip_addr -p tcp --sport $ip_port -j MARK --set-mark $htb_class
elif [ "$1" = "show" ]; then
    tc qdisc show dev $dev
    tc class show dev $dev
    tc filter show dev $dev
    iptables -t mangle -vnL INPUT
    iptables -t mangle -vnL OUTPUT
else
    echo "invalid arg $1"
fi

Я пытаюсь ответить на этот вопрос, перечисляя ссылки ниже:

Существует два режима формирования трафика: INGRESS и EGRESS. INGRESS обрабатывает входящий трафик и исходящий трафик EGRESS. Linux не поддерживает формирование / формирование очередей на INGRESS, а только контроль. Следовательно, существует IFB, который мы можем присоединить к очереди INGRESS, в то время как мы можем добавить любую обычную очередь, такую ​​как FQ_CODEL, в качестве очереди EGRESS на устройстве IFB. [http://wiki.gentoo.org/wiki/Traffic_shaping]

Итак, мое решение этого вопроса:

#!/bin/bash

dev=enp3s0
ifb_dev=ifb0
ip_addr=10.0.1.54
ip_port=2000

rate_limit=20kbit
htb_class=10

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

modprobe ifb
ifconfig ifb0 up

if [ "$1" = "enable" ]; then
    echo "enabling rate limits"

    tc qdisc add dev $dev handle ffff: ingress
    tc filter add dev $dev parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $ifb_dev

    tc qdisc add dev $ifb_dev root handle 1: htb
    tc class add dev $ifb_dev parent 1: classid 1:$htb_class htb rate $rate_limit ceil $rate_limit

    tc filter add dev $ifb_dev parent 1: protocol ip prio 1000 u32 match ip dport 2001 0xffff flowid 1:$htb_class

elif [ "$1" = "disable" ]; then
    echo "disabling rate limits"

    tc qdisc del dev $dev root > /dev/null 2>&1
    tc qdisc del dev $dev ingress > /dev/null 2>&1
    tc qdisc del dev $ifb_dev root > /dev/null 2>&1
    tc qdisc del dev $ifb_dev ingress > /dev/null 2>&1

elif [ "$1" = "show" ]; then

    tc qdisc show dev $dev
    tc class show dev $dev
    tc filter show dev $dev

else
    echo "invalid arg $1"
fi

Цзиньчжэн сказал правильно, вы не можете сформировать входящий трафик. но вы можете сделать это как капитан Джек Воробей ... измените факты.

создайте соединение openvpn между вашим хостом и vps с помощью «redirect-gateway», чтобы весь трафик проходил через vps. чтобы это выглядело так: ваша домашняя сеть / компьютер -> интернет -> vps -> интернет

то, что для вашей домашней сети является INGRESS, является EGRESS для vps, а затем формирует исходящий интерфейс на vps.

несколько советов: не забудьте указать свою домашнюю сеть / ip, иначе вы убьете скорость загрузки vps. у vps должна быть лучшая пропускная способность, чем у вашей домашней сети, измерьте пропускную способность. в Германии вы можете просто получить 7 € vps от hetzner.de, они довольно надежны.

Это не обязательно, это просто, вам просто нужно исправить ядро ​​и iptables, а затем вы можете формировать входящий трафик, + если вы используете LXC, вам даже не нужно ничего исправлять, только на KVM