태그 보관물: linux-kernel

linux-kernel

tc u32 — 최근 커널에서 L2 프로토콜을 일치시키는 방법은 무엇입니까?

해시 필터링을 사용하여 Linux 브리지에 구축 된 멋진 셰이퍼가 있습니다. 즉, br0연결 externalinternal물리적 인터페이스, VLAN 태그가 지정된 패킷은 “투명하게”브리지됩니다 (즉, VLAN 인터페이스가 없음).

이제 다른 커널이 다르게 작동합니다. 정확한 커널 버전 범위에 문제가있을 수 있습니다. 용서해주십시오. 감사.

2.6.26

따라서 데비안에서 2.6.26 이상 (최대 2.6.32까지) — 이것은 작동합니다.

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

여기서 “kernel”은 “protocol”필드에서 2 바이트를 0x8100과 일치하지만 ip 패킷의 시작 부분을 “zero position”으로 계산합니다.

2.6.32

다시, 데비안에서는 (바닐라 커널을 만들지 않았습니다) 2.6.32-5 —이 작동합니다 :

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200

여기서 “커널”은 프로토콜과 동일하지만이 프로토콜 헤더의 시작 부분부터 오프셋을 계산합니다. — 오프셋에 4 바이트를 추가해야합니다 (dst 주소의 경우 16이 아니라 20). 괜찮아요, 더 논리적으로 보입니다.

3.2.11, 최신 안정

이것은 802.1q 태그가 전혀없는 것처럼 작동합니다.

tc filter add dev internal protocol ip parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

문제는 지금까지 802.1q 태그와 일치하는 방법을 찾을 수 없다는 것입니다.

과거에 일치하는 802.1q 태그

다음과 같이 전에이 작업을 수행 할 수 있습니다.

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 match u16 0x0ed8 0x0fff at -4 flowid 1:300

지금은와 802.1Q 태그와 일치 할 수없는거야 at 0, at -2, at -4, at -6또는 같은 것을. 적중 횟수 가 0 인 주된 문제는 —이 필터는 전혀 “잘못된 프로토콜”입니다.

제발, 누구든지 도와주세요 🙂

감사!



답변

최근 커널에서는 VLAN 태그가 skb에서 제거되었습니다. skb에서 메타 일치를 수행하려면 다음과 같이하십시오.

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300


답변

나는 이것을 정확하게해야했습니다. @Thusitha가 제안한 답변이 새로운 커널에 대한 올바른 방법이라는 것을 알았습니다.

데비안 wheezy 커널 3.2.0-4 및 iproute (tc 명령의 출처) 버전 20120521-3 + b3으로 테스트

다음은 완전한 스크립트입니다. tc filter줄은 @Thusitha에서 지정한 것과 거의 동일합니다.

function qos() {
    if="$1"
    vlan1="$2"
    vlan2="$3"

    # delete previous
    tc qdisc del dev $if root >/dev/null 2>&1
    tc qdisc del dev $if ingress >/dev/null 2>&1

    # Root HTB for $if
    tc qdisc add dev $if root handle 1: htb r2q 1 default 1

    # Root class to borrow from
    tc class add dev $if parent 1: classid 1:1 htb quantum 1000000 rate 500mbit ceil 500mbit burst 64k prio 2
    tc qdisc add dev $if parent 1:1 handle 101 sfq perturb 10

    # class for vlan1
    tc class add dev $if parent 1:1 classid 1:106 htb quantum 1000000 rate 1.00mbit ceil 1.00mbit burst 6k
    tc qdisc add dev $if parent 1:106 handle 107 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan1})" flowid 1:106

    # class for vlan2
    tc class add dev $if parent 1:1 classid 1:108 htb quantum 1000000 rate 1.00mbit ceil 10.00mbit burst 6k
    tc qdisc add dev $if parent 1:108 handle 108 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan2})" flowid 1:108

}

qos eth1 1234 1235
qos eth2 2345 2346


답변

wireshark를 사용하여 사용자 공간에 표시되는 인터페이스를 통해 진행되는 작업을 캡처하고이를 사용하여 필터를 작성하는 것이 좋습니다. 인터페이스가 어떤 이유로 VLAN 태그를 제거하는지 궁금합니다 (투명하게 브리지되도록 구성되어 있음). 아마도 추가 태그 또는 무언가를 추가하고 있습니까?


답변

당신과 VLAN을 packtes 표시 할 수 있습니다 ebtables를 .

# mark packets according to the vlan id
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2

그런 다음 표시에 따라 모양을 적용하십시오. ebtables 및 iptables는 동일한 표시를 공유합니다.

아직이 작업을 수행하지 않았습니다. 그래서 오히려 직감.


답변

reorder_hdrVLAN 인터페이스 에서 옵션 을 끄십시오 . 헤더 순서 변경 옵션을 사용하면 프레임의 태그가 제거됩니다. 명령으로 확인하십시오 ip -d link list dev vlan_iface.


답변