Linux: limita a taxa de porta específica combinando tc com iptables e não funciona como esperado

1

O golpe de script tenta limitar a taxa de entrada da porta 2000, ao usar iptables para marcar os pacotes INPUT não funciona, mas OUTPUT funciona bem.

Eu uso nc -kl 2000 na máquina 10.0.1.54 e iperf -c 10.0.1.54 -p 2000 -t 10 em outra máquina para testá-la.

Por que OUTPUT funciona, mas não 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
    
por tianchaijz 04.02.2015 / 12:28

3 respostas

2

Eu tento responder a essa pergunta listando os links abaixo:

There are two modes of traffic shaping, INGRESS and EGRESS. INGRESS handles incoming traffic and EGRESS outgoing traffic. Linux does not support shaping/queuing on INGRESS, but only policing. Therefore IFB exists, which we can attach to the INGRESS queue while we can add any normal queuing like FQ_CODEL as EGRESS queue on the IFB device. [http://wiki.gentoo.org/wiki/Traffic_shaping]

Então, minha solução para essa pergunta é:

#!/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
    
por 09.02.2015 / 14:02
1

O que o jinzheng disse está certo, você não pode moldar o tráfego de ingresso. mas você pode fazer isso como capitão jack pardal ... mudar os fatos.

crie uma conexão openvpn entre seu host e um vps com "redirect-gateway" para que todo o tráfego ultrapasse o vps. para que fique assim: sua rede doméstica / pc - > internet - > vps - > internet

o que para sua rede doméstica é INGRESS é EGRESS para o vps em seguida, formatar a interface de saída no vps.

algumas dicas: lembre-se de especificar sua rede doméstica / ip ou você vai matar a taxa de upload vps. o vps tem que ter uma largura de banda melhor que a sua rede doméstica, meça a largura de banda. na Alemanha, você pode obter apenas 7 € vps de hetzner.de eles são bastante confiáveis.

    
por 08.09.2015 / 09:39
0

Não é necessário fazer isso, é simples, você só precisa corrigir o kernel e o iptables e então você pode modelar o tráfego de entrada, + se você estiver usando o LXC, você nem precisa corrigir nada, apenas no KVM

    
por 01.11.2018 / 12:20