이전 답변을 찾았습니다(https://serverfault.com/questions/461153/vlan-based-rate-limiting-using-tc), 그러나 내 스크립트에 VLAN 일치를 추가하려고 하면 다음이 생성됩니다.
"손잡이"란 무엇입니까? 사용법: ...basic[EMATCH_TREE 일치][액션 ACTION_SPEC][classid CLASSID]
그 중: SELECTOR := SAMPLE SAMPLE ... FILTERID := X:Y:Z ACTION_SPEC := ... 각 작업 보기
참고: CLASSID는 16진수 입력으로 구문 분석됩니다.
내 스크립트는 다음과 같습니다. 물리적 인터페이스에서는 잘 작동하지만 (XX는 VLAN 번호입니다!) 로 em1
바꾸면 실패합니다.vlanXXX
운영 체제는 openSUSE LEAP15(4.12.14-lp150.12.16-default #1 SMP Tue Aug 14 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
VLAN 일치에 대한 다른 답변을 기반으로 시도한 필터는 다음과 같습니다.
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
***고쳐 쓰다:
잘 설치하려면 다음 구문을 찾았습니다.
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 필터 상위 1: 프로토콜 ip pref 49152
기본 필터 상위 1: 프로토콜 ip pref 49152 기본 핸들 0x14
flowid 1:20 위안(VLAN 마스크 0x00000fff eq 178)
하지만 구문이 작동하도록 하는 방법을 모르겠습니다 fw
(전체 인터페이스의 속도를 제한하는 대신 iptables를 사용하여 속도 제한이 적용되는 포트를 설정할 수 있음).
예를 들어 다음은 작동하지 않습니다.
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
기본 일치 "meta(vlan 마스크 0xfff eq 0xB2)" flowid 1:20
"기본"이란 무엇입니까? 사용법: ... fw [ classid CLASSID ] [ indev DEV ] [ action ACTION_SPEC ] CLASSID := X:Y CLASSID 형식으로 식별된 클래스에 일치하는 패킷을 푸시합니다. CLASSID는 16진수 입력으로 구문 분석됩니다. DEV := 수신 장치 클래스의 장치를 지정합니다. ACTION_SPEC := 일치하는 패킷에 작업을 적용합니다. 참고: 핸들은 HANDLE[/FWMASK]로 표시됩니다. FWMASK의 기본값은 0xffffffff입니다.
답변1
매개변수의 순서가 중요합니다. 매뉴얼 페이지에서:
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
따라서 핸들 사양이 앞에 와야 합니다 protocol
.
tc 명령 자체는 이를 반대 방향으로 표시하지만:
$ 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 ] ]
^^^
하지만 여전히 실제 필터 조건인 FILTER_TYPE 앞에 옵니다.
귀하의 명령에 따라:
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
...핸들은 필터(기본 일치...) 뒤에 오므로 더 이상 인식되지 않습니다. 물론 handle
자체 매개변수를 가진 필터를 갖는 것이 가능하지만 여기서는 그렇지 않다고 생각합니다.
이 필터가 적합한지는 확인하지 않았지만 "핸들이 무엇입니까?" 구문 분석 오류는 인수 순서만으로 발생해야 합니다. 표시되는 다른 명령에 대해서도 이 오류가 발생하지 않습니다.