Rate limiting with tc on vlans

1

Eu encontrei essa resposta anterior ( link ), mas tentando adicionar a correspondência de vlan ao meu script produz:

What is "handle"? Usage: ... basic [ match EMATCH_TREE ] [ action ACTION_SPEC ] [ classid CLASSID ]

Where: SELECTOR := SAMPLE SAMPLE ... FILTERID := X:Y:Z ACTION_SPEC := ... look at individual actions

NOTE: CLASSID is parsed as hexadecimal input.

Meu script é como abaixo. Ele funciona bem com uma interface física, mas se eu substituir em1 wtih vlanXXX (onde XX é o número da VLAN!) Ele falhará.

O sistema operacional é o openSUSE LEAP15 (4.12.14-lp150.12.16-padrão # 1 SMP Ter 14 de agosto 17:51:27 UTC 2018 (28574e6) x86_64 x86_64 x86_64 GNU / Linux)

#!/bin/bash
tc qdisc add dev vlanXX root handle 1:0 htb default 10
tc class add dev vlanXX parent 1:0 classid 1:10 htb rate 1000mbit ceil 1000mbit prio 0
tc class add dev vlanXX parent 1:0 classid 1:20 htb rate  15mbit ceil 16mbit prio 0
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 20
iptables -A OUTPUT -t mangle -p tcp --dport 443 -j MARK --set-mark 20
tc filter add dev vlanXX parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20

Esta é a correspondência de VLAN de filtro que tentei com base na outra resposta:

tc filter add dev em1 parent 1:0 prio 0 protocol ip basic match "meta(vlan mask 0xfff eq 0x07D1)" handle 20 fw flowid 1:20

*** ATUALIZAÇÃO:

Eu encontrei esta sintaxe instala ok:

 tc filter add dev em1 parent 1:0 prio 0 protocol ip handle 20 basic match "meta(vlan mask 0xfff eq 0xB2)" flowid 1:20

sudo tc filter show dev em1 filter parent 1: protocol ip pref 49152

basic filter parent 1: protocol ip pref 49152 basic handle 0x14

flowid 1:20 meta(vlan mask 0x00000fff eq 178)

Mas não consigo descobrir como fazer com que a sintaxe fw funcione (para que eu possa usar o iptables para definir em quais portas o limite de taxa se aplica, em vez de limitar a taxa na interface inteira)

por exemplo. isso não funciona:

 sudo tc filter add dev em1 parent 1:0 prio 0 protocol ip handle 20 fw basic match "meta(vlan mask 0xfff eq 0xB2)" flowid 1:20

basic match "meta(vlan mask 0xfff eq 0xB2)" flowid 1:20

What is "basic"? Usage: ... fw [ classid CLASSID ] [ indev DEV ] [ action ACTION_SPEC ] CLASSID := Push matching packets to the class identified by CLASSID with format X:Y CLASSID is parsed as hexadecimal input. DEV := specify device for incoming device classification. ACTION_SPEC := Apply an action on matching packets. NOTE: handle is represented as HANDLE[/FWMASK]. FWMASK is 0xffffffff by default.

    
por Little Code 26.09.2018 / 16:28

1 resposta

0

A ordem dos parâmetros é importante. Na página do manual:

tc [ OPTIONS ] filter [ add | change | replace | delete | get ] dev DEV
   [ parent qdisc-id | root ] [ handle filter-id ] protocol protocol prio priority 
   filtertype [ filtertype specific parameters ] flowid flow-id

De acordo com isso, a especificação do identificador deve ser antes de protocol .

Embora o próprio comando tc mostre o contrário:

$ tc filter help
Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]
[...]
   [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]
   [ estimator INTERVAL TIME_CONSTANT ]
   [ root | ingress | egress | parent CLASSID ]
   [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]
     ^^^

Mas ainda é antes FILTER_TYPE, que é o critério de filtro real.

Em seu comando:

tc filter add dev em1 parent 1:0 prio 0 protocol ip
   basic match "meta(vlan mask 0xfff eq 0x07D1)"
   handle 20 fw flowid 1:20

... o identificador é após o filtro (correspondência básica ...) e, portanto, não é mais reconhecido. É claro que pode haver um filtro com seu próprio parâmetro handle , mas acho que não é o caso aqui.

Por favor, note que eu não verifiquei se esse filtro faz algum sentido em contrário, mas o "o que é manipular?" o erro de análise deve ser causado apenas pela ordem dos parâmetros. Eu também não recebi este erro para os outros comandos que você mostrou.

Espero que isso ajude de qualquer maneira. ;)

    
por 26.09.2018 / 18:36

Tags