VLAN ID 및 우선순위를 ebtables와 일치시킵니다.

VLAN ID 및 우선순위를 ebtables와 일치시킵니다.

특정 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
    }
}

관련 정보