nftables에서 명명된 ICMP 유형 세트 선언 및 사용

nftables에서 명명된 ICMP 유형 세트 선언 및 사용

unamed set다음은 현재 ICMP 유형을 사용하는 방법에 대한 실제 예입니다.

#!/usr/sbin/nft -f

add table filter_4

add chain filter_4 icmp_out_4 {
    comment "Output ICMPv4 traffic"
}

define response_icmp_4 = {
    0, # Echo Reply
    3, # Destination Unreachable
    10, # Router Solicitation
    11, # Time Exceeded
    12, # Parameter Problem
    14 # Timestamp Reply
}

# Block ICMP response from localhost
add rule filter_4 icmp_out_4 icmp type $response_icmp_4 drop

내가 하고 싶은 것은 그것을 명명된 세트 unamed set로 변환하는 것입니다. 실패한 시도는 다음과 같습니다.response_icmp_4

# Declare named set
add set filter_4 response_icmp_4 { type inet_service }

# Add ICMP type elements
add element filter_4 response_icmp_4 {
    0, # Echo Reply
    3, # Destination Unreachable
    10, # Router Solicitation
    11, # Time Exceeded
    12, # Parameter Problem
    14 # Timestamp Reply
}

컬렉션 생성이 작동하지만 규칙 처리 중에 거부됩니다.

# Block ICMP response from localhost
add rule filter_4 icmp_out_4 icmp type @response_icmp_4 drop

다음과 같은 오류 출력이 있습니다.

오류: 데이터 유형이 일치하지 않습니다. ICMP 유형이 필요하며 표현식은 인터넷 네트워크 서비스 유형입니다.

오류는 자명하지만 질문은 type무엇을 지정해야 합니까? type inet_service작동하지 않기 때문입니다 .

~에 따르면문서유효한 type표현식은 다음과 같습니다.ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark

자동으로 파생된 데이터 유형을 지정하는 것도 가능 typeof하지만 이는 제대로 작동하지 않습니다. 예를 들면 다음과 같습니다.

add set filter_4 response_icmp_4 { typeof vlan id }

다음과 유사한 오류는 무엇입니까?

오류: 데이터 유형 불일치, 예상되는 ICMP 유형, 표현식 유형이 정수입니다.

ICMP type이것은 정수이기 때문에 이상한 오류입니다 .

이에 대해 설명하는 문서를 찾을 수 없으므로 링크해 주시면 도움이 될 것입니다.

답변1

명명된 집합 선언은 비교되는 유형과 일치해야 합니다. ICMP 유형이 inet 서비스가 아닙니다.

# nft describe inet_service
datatype inet_service (internet network service) (basetype integer), 16 bits

이는 항구를 의미합니다. 예를 들어 다음과 호환됩니다.

# nft describe udp dport
payload expression, datatype inet_service (internet network service) (basetype integer), 16 bits

따라서 규칙을 추가할 때nftables불평하다:

Error: datatype mismatch, expected ICMP type, expression has type internet network service

ICMP 유형을 찾는 방법은 규칙(페이로드 표현/유형)에서 다음과 같습니다 icmp type.

# nft describe icmp type
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits

pre-defined symbolic constants (in decimal):
    echo-reply                                         0
    destination-unreachable                            3
[...]

(데이터 유형/유형)의 결과는 다음과 같습니다 icmp_type.

# nft describe icmp_type
datatype icmp_type (ICMP type) (basetype integer), 8 bits

pre-defined symbolic constants (in decimal):
    echo-reply                                         0
    destination-unreachable                            3
[...]

이것:

add set filter_4 response_icmp_4 { type inet_service }

다음으로 교체해야 합니다:

add set filter_4 response_icmp_4 { type icmp_type; }

type또는 다음 을 사용하는 대신 typeof(일반적으로 규칙 세트에 사용되는 것과 일치하므로 알아내기가 더 쉽고, 위와 같이 직접 사용하여 nft describe동등한 항목을 찾을 수도 있습니다 type):

add set filter_4 response_icmp_4 { typeof icmp type; }

관련 정보