특정 VLAN ID(0이 아님)와 특정 VLAN PCP 값을 일치시키기 위해 ebtables를 사용하려고 합니다.
나는 다음을 시도했다:
ebtables -A 앞으로 -p 0x8100 --vlan-id 5 --vlan-prio 3 -j DROP
Ebtables는 불평하지 않지만(검사가 ebtables에서 주석 처리되었기 때문에) "ebtables -L"을 사용하여 반환된 규칙에는 VLAN ID와 일치하는 항목만 포함됩니다.
ebtables 매뉴얼 페이지에서 vlan-prio를 사용할 때 vlan-id가 0이거나 지정되지 않아야 한다는 것을 보았습니다.
왜 그런 상황이 있습니까? 지금까지 우선순위 비트를 사용할 때 ID가 0이어야 함을 지원하는 참조를 찾지 못했습니다.
vlan-id와 vlan-prio를 별도로 일치시키기 위해 별도의 체인을 만드는 것 외에 이를 달성할 수 있는 방법이 있습니까?
답변1
이 설명은 실제로 의미가 없지만 커널에 있습니다.linux/net/bridge/netfilter/ebt_vlan.c
:
if (GET_BITMASK(EBT_VLAN_ID)) { if (!!info->id) { /* if id!=0 => check vid range */ if (info->id > VLAN_N_VID) { pr_debug("id %d is out of range (1-4096)\n", info->id); return -EINVAL; } /* Note: This is valid VLAN-tagged frame point. * Any value of user_priority are acceptable, * but should be ignored according to 802.1Q Std. * So we just drop the prio flag. */ info->bitmask &= ~EBT_VLAN_PRIO; } /* Else, id=0 (null VLAN ID) => user_priority range (any?) */ }
내가 아는 한,핵심ebtables의 한쪽에서는 비어 있지 않은 VLAN ID(VID)가 있는 규칙을 수신할 때 prio(PCP) 플래그/옵션이 무시되도록 강제하므로 다음과 같은 두 가지 규칙이 있는 사용자 체인을 사용하지 않고 어떻게 성공할 수 있는지 모르겠습니다. 해결 방법.
계정이 없으면 공식적인 802.1Q 문서를 확인하기 어렵지만 2005년 버전에서는 이 댓글에 대한 설명을 찾을 수 없었습니다. VID=0은 PCP만 의미한다는 것을 알고 있지만 PCP가 VID=0을 의미하거나 두 매개변수 사이에 상호 작용이 없다는 의미는 아닙니다(아무것도 기록되지 않았음을 의미합니다).
노트:nftables그러한 제한은 없습니다.
nft add table bridge filter
nft add chain bridge filter forward '{ type filter hook forward priority -200; policy accept; }'
nft add rule bridge filter forward ether type vlan vlan id 5 vlan pcp 3 counter drop
제공된 내용을 반환합니다(여기서는 리틀 엔디안으로 표시된 디버그 바이트 코드를 포함하여 0x8100 대신 0x81 등).
# nft --debug=netlink list chain bridge filter forward -a
bridge filter forward 2
[ payload load 2b @ link header + 12 => reg 1 ]
[ cmp eq reg 1 0x00000081 ]
[ payload load 2b @ link header + 14 => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x0000ff0f ) ^ 0x00000000 ]
[ cmp eq reg 1 0x00000500 ]
[ payload load 1b @ link header + 14 => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x000000e0 ) ^ 0x00000000 ]
[ cmp eq reg 1 0x00000060 ]
[ counter pkts 0 bytes 0 ]
[ immediate reg 0 drop ]
table bridge filter {
chain forward { # handle 1
type filter hook forward priority -200; policy accept;
vlan id 5 vlan pcp 3 counter packets 0 bytes 0 drop # handle 2
}
}