나는 다음과 같이 멀티캐스트 패킷을 일치시키는 규칙을 설정했습니다.
add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4
filter_4
이는 IPv4 테이블이자 new_out4
출력 체인이며 multicast_out_4
순수 멀티캐스트 트래픽을 처리하는 체인입니다.
관련 없는 부분을 제외한 IPv4 테이블의 전체 그림은 다음과 같습니다.
#!/usr/sbin/nft -f
add table filter_4
add chain filter_4 output {
# filter = 0
type filter hook output priority filter; policy drop;
}
add chain filter_4 multicast_out_4 {
comment "Output multicast IPV4 traffic"
}
add chain filter_4 new_out_4 {
comment "New output IPv4 traffic"
}
#
# Stateful filtering
#
# Established IPv4 traffic
add rule filter_4 input ct state established goto established_in_4
add rule filter_4 output ct state established goto established_out_4
# Related IPv4 traffic
add rule filter_4 input ct state related goto related_in_4
add rule filter_4 output ct state related goto related_out_4
# New IPv4 traffic ( PACKET IS MATCHED HERE )
add rule filter_4 input ct state new goto new_in_4
add rule filter_4 output ct state new goto new_out_4
# Invalid IPv4 traffic
add rule filter_4 input ct state invalid log prefix "drop invalid_filter_in_4: " counter name invalid_filter_count_4 drop
add rule filter_4 output ct state invalid log prefix "drop invalid_filter_out_4: " counter name invalid_filter_count_4 drop
# Untracked IPv4 traffic
add rule filter_4 input ct state untracked log prefix "drop untracked_filter_in_4: " counter name untracked_filter_count_4 drop
add rule filter_4 output ct state untracked log prefix "drop untracked_filter_out_4: " counter name untracked_filter_count_4 drop
위 설정에서는 멀티캐스트를 포함한 새로운 출력 트래픽이 규칙을 통해 일치됩니다.add rule filter_4 output ct state new goto new_out_4
new_out_4
작동하지 않는 관련(작동하지 않는) 멀티캐스트 규칙만 포함하는 체인은 다음과 같습니다 .
# Multicast IPv4 traffic ( THIS RULE DOES NOT WORK, SEE LOG OUTPUT BELOW)
add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4
#
# Default chain action ( MULTICAST PACKET IS DROPPED HERE )
#
add rule filter_4 new_out_4 log prefix "drop new_out_4: " counter name new_out_filter_count_4 drop
삭제된 멀티캐스트 패킷에 대한 로그 내용은 다음과 같습니다.
new_out_4 삭제: IN=OUT=eth0 SRC=192.168.1.100 DST=224.0.0.251 LEN=163 TOS=0x00 PREC=0x00 TTL=255 ID=27018 DF PROTO=UDP SPT=5353 DPT=5353 LEN=143
224.0.0.251
삭제된 패킷은 멀티캐스트 주소인 대상 주소로 전송됩니다. 이 주소는 new_out_4
체인의 멀티캐스트 규칙과 일치해야 하고 multicast_out_4
체인에서 처리해야 하지만 그렇지 않습니다.
대신, 패킷은 일치하지 않으며 new_out_4
위 체인의 기본 삭제 규칙에 따라 삭제됩니다. 참고(기본 체인 작업)를 참조하세요.
분명히 이것은 멀티캐스트 규칙이 작동하지 않는다는 것을 의미합니다.
멀티캐스트 규칙이 작동하지 않는 이유는 무엇입니까?
예상되는:
meta pkttype multicast
대상 주소 일치224.0.0.251
편집하다:
시스템 정보:
커널: 6.5.0-0.deb12.4-amd64
에는 이전 커널 6.1과 동일한 문제가 있습니다.
nftables: v1.0.6(레스터 구치 #5)
답변1
다음과 같은 몇 가지 추가 항목을 사용하여 설정을 복제하고 누락된 부분을 완성합니다.
nft insert rule filter_4 new_out_4 counter meta pkttype host counter
meta pkttype
실제로 이 skbuff의 속성은 나가는 멀티캐스트 패킷의 예상 속성이 아닙니다 host
. multicast
알아채다이 키워드가 소개되면, 이는 출력이 아닌 입력에 관한 것입니다.
src: 메타표현식에 pkttype에 대한 지원 추가
skbuff의 pkttype 필드를 일치시키려면 다음 구문을 사용해야 합니다.
nft 추가 규칙 IP 필터 입력 요소 pkttype PACKET_TYPE
그 중 PACKET_TYPE은 유니캐스트, 브로드캐스트, 멀티캐스트가 될 수 있습니다.
실제로는 다음과 직접적으로 동일합니다.iptables~이다pkttype 일치 모듈:
pkttype
이 모듈은 일치합니다링크 레이어패킷 유형.
[!] --pkt-type {unicast|broadcast|multicast}
# iptables-translate -A OUTPUT -m pkttype --pkt-type multicast
nft 'add rule ip filter OUTPUT pkttype multicast counter'
이 모든 것을 종합하면 나가는 IP(라우팅: 레이어 3) 패킷이 생성될 때 아직 레이어 2(링크 레이어)에 도달하지 않았으므로 해당 skbuff는 다음과 같이 계획하더라도 반영되지 않습니다. 미래.
실제로 테스트해야 할 것은 이더넷과 관련된 패킷 속성이 아니라 라우팅 스택과 관련된 IP 주소 속성입니다. iptables
이를 위해 규정된addrtype
매칭 모듈:
addrtype
이 모듈은 다음을 기준으로 패킷을 일치시킵니다.주소 유형. [...]
번역에서는 실제로 무엇을 사용해야 하는지 암시합니다.fib
표현하다:
# iptables-translate -A OUTPUT -m addrtype --dst-type MULTICAST
nft 'add rule ip filter OUTPUT fib daddr type multicast counter'
FIB 발현
fib {saddr | daddr | mark | iif | oif} [. ...] {oif | oifname | type}
fib 표현식은 특정 주소가 사용할 출력 인터페이스의 인덱스와 같은 정보를 fib(전달 정보 베이스)에 쿼리합니다. 입력은 fib 조회 함수에 대한 입력으로 사용되는 요소의 튜플입니다.
멀티캐스트의 직접적인 예는 없습니다. 가장 최근의 예는 멀티캐스트가 3가지 예외에 해당하는 수신 인터페이스에서 사용하도록 의도되지 않은 주소에 대해 pacjet을 삭제하는 것과 관련된 보다 복잡한 예입니다.
# drop packets to address not configured on incoming interface filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop
따라서 출력(또는 라우팅 후) 후크에서 사용하는 곳마다 바꾸십시오.
meta pkttype multicast
그리고:
fib daddr type multicast
입력(또는 사전 경로) 후크에서는 skbuff 속성이 IP 속성과 일치할 수 있지만 일관성을 위해 정확히 동일한 속성으로 대체되어야 합니다.
fib daddr type multicast
다음 테스트 명령은 LAN의 다른 호스트(테스트 입력용) 및 호스트(테스트 출력용)와 함께 사용됩니다.
socat -d -d UDP4-DATAGRAM:224.0.0.251:5555,bind=:5555,ip-add-membership=224.0.0.251:eth0 -
fib daddr type multicast
입력과 출력이 올바르게 일치합니다 .
중요한:
위 방법으로 문제가 해결되었다고 생각하지만 Netfilter는 멀티캐스트를 올바르게 추적하지 않는다는 점에 유의하세요.연결하다, 다른 유니캐스트 소스 주소를 사용하는 응답을 초기 쿼리의 멀티캐스트 대상 주소에 연결할 수 없기 때문입니다. 응답이 다르기 때문에 응답을 연결하고 프로세스의 일부로 처리하는 대신 다른(새) 스트림으로 간주합니다. . 따라서 이러한 스트림은 ESTABLISHED 상태로 표시되지 않습니다.연결하다또는 conntrack -L
명령. 규칙 세트는 이를 수용해야 합니다. 어떤 종류의 규칙에만 의존할 수는 없지만 ct state established,related
이는 이 질문의 범위를 벗어납니다.