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; }