nftables에서 이름으로 명명된 인터페이스 세트를 만드는 방법은 무엇입니까?

nftables에서 이름으로 명명된 인터페이스 세트를 만드는 방법은 무엇입니까?

컬렉션 사용nftables정말 멋진. 나는 현재 내 규칙 세트에서 다음과 같은 명령문을 많이 사용합니다 nftables.conf.

iifname {clients0, dockernet} oifname wan0 accept \
    comment "Allow clients and Docker containers to reach the internet"

위의 규칙 중 {clients0, dockernet}하나익명의(인라인) 인터페이스 세트. 규칙을 반복해서 반복하는 대신 파일 상단에 다음과 같은 인터페이스 세트를 정의하고 싶습니다.명명된 집합nftables에서. 이것맨페이지(데비안 버스터)여러 유형의 컬렉션에 대해 이 작업을 수행하는 방법을 보여줍니다.ipv4_주소,ipv6_주소,에테르 주소,inet_proto,inet_service그리고표시. 그러나 이름이나 문자열과 같은 간단한 기본 유형으로 인터페이스에서는 작동하지 않는 것 같습니다.

다음 방법이 있지만 주어진 오류에서는 작동하지 않습니다.

  1. 유형 생략:

    table inet filter {
      set myset {
        elements = {
          clients0,
          dockernet,           
        }
      }
      [...]
    }
    

    결과: Error: set definition does not specify key.

  2. 사용법 string유형:

    table inet filter {
      type string;
      set myset {
        elements = {
          clients0,
          dockernet,           
        }
      }
      [...]
    }
    

    결과: Error: unqualified key type string specified in set definition.

상단에 표시되는 익명성 세트의 이름을 지정할 방법이 정말 없나요?

답변1

검색해서버전 0.9.0의 소스 코드:

static const struct datatype *datatypes[TYPE_MAX + 1] = {

[...]

  [TYPE_IFINDEX]      = &ifindex_type,

[...]

  [TYPE_IFNAME]       = &ifname_type,
};

그런 다음 그들이 어디에 있는지 찾아보세요 한정된:

const struct datatype ifindex_type = {
  .type       = TYPE_IFINDEX,
  .name       = "iface_index",
  .desc       = "network interface index",

[...]

const struct datatype ifname_type = {
  .type       = TYPE_IFNAME,
  .name       = "ifname",
  .desc       = "network interface name",

(이 답변을 작성할 당시) 필수 유형은 iface_index(예: iif lo) 및 ifname(예: )임을 알 수 있습니다.iifname "lo"nft매뉴얼 페이지에는 문서화되어 있지 않습니다..

nft add set inet filter if-index-set '{ type iface_index;  }'
nft add set inet filter if-name-set '{ type ifname;  }'

nft add element inet filter if-index-set '{ lo }'
nft add element inet filter if-name-set '{ lo }'

nft add chain inet filter input '{ type filter hook input priority 0; }'
nft add rule inet filter input iif @if-index-set counter
nft add rule inet filter input iifname @if-name-set counter

알아채다이름이 있으면2022년 5월 31일에 컬렉션에 와일드 카드 지원이 추가되었습니다.nftables 1.0.3. 명명된 세트를 사용해야 하며 flags intervals마지막 와일드카드 는 *(+iptables).

답변2

nft요소 데이터 유형은 다음을 사용하여 쉽게 찾을 수 있습니다.

$ nft describe iifname    
meta expression, datatype ifname (network interface name) (basetype string), 16 characters
% nft describe iif    
meta expression, datatype iface_index (network interface index) (basetype integer), 32 bits

그걸 보신 분들 ifnameiface_index가능한 타입이니까당신은 선언할 수 있습니다:

 set myset {
    type ifname
    elements = {
       "clients0",  
       "dockernet"  
    }       
 }

위의 예에서 유형을 모르면 typeof iifname대신 쓸 수도 있습니다(v0.9.4 이상 필요).type ifnamenft

관련 정보