nft를 사용하여 Saddr 목록을 동적으로 작성하고 각 패킷/바이트 수를 계산하는 쉬운 방법이 있는지 알아보려고 합니다. 나는 흐름에 어떤 제한도 가하고 싶지 않습니다. 단지 흐름을 측정하기만 하면 됩니다.
나는 다이너셋을 구축하고 발견된 Saddrs를 여기에 추가하는 방법을 알고 있습니다. 하지만 각 Saddr에 대한 카운터를 추가할 수 있는 구문을 찾을 수 없습니다.
컬렉션에 Saddrs를 추가하는 규칙에 카운터를 추가하는 방법을 알고 있습니다. (내가 원하는 건 아니지만)
나는 Saddr이라는 개인에 대한 명시적인 카운터를 만들고 사용하는 방법을 알고 있습니다.
나는 이미 가지고 있는 지식을 사용하여 다이너셋을 만들 수 있다는 것을 알고 있습니다. 이를 확인한 다음 각 Saddr에 대해 별도의 규칙을 만들지만 이를 수행하는 더 좋은 방법이 있어야 할 것 같습니다.
나열된 경우 개수를 사용할 수 있음을 나타내는 연결 제한 코드의 예를 많이 보았지만 그 중 어느 것도 직접적으로 적용할 수 있는 것 같지 않습니다(그리고 그 중 어느 것도 내 컴퓨터에서 nft 구문 검사를 통과하지 못하는 것 같습니다).
저는 Raspberry Pi 4(Raspbian Buster), 커널 버전 5.4.51 및 nftables v0.9.0(Fearless Fosdick)에서 실행하고 있습니다.
저는 nft 완전 초보입니다.
답변1
컬렉션과 함께 카운터 사용과 관련된 몇 가지 개선 사항이 추가되었습니다.nftables버전뒤쪽에0.9.0.
0.9.1src: 상태 저장 표현식을 컬렉션과 맵에 통합합니다.:
다음 예에서는 방법을 보여줍니다.패킷 경로에서 세트 채우기 대상 IP 주소를 사용하여,각 항목에는 카운터가 있습니다..
[...]카운터는상태 저장 객체.
0.9.4src: 요소 카운터 복원 지원:
이 패치를 통해 다음을 수행할 수 있습니다.동적 세트에서 카운터 복원:
0.9.4src: 컬렉션 정의의 카운터 지원:
이 패치를 사용하면 컬렉션의 각 요소에 대한 카운터를 켤 수 있습니다.
원하는 용도로 사용하려면 0.9.1이 필요합니다. 이러한 카운터를 저장하고 이전 값으로 복원하려면(예: 재부팅 중) 0.9.4를 사용해야 합니다. 0.9.4에서는 컬렉션을 미리 채울 때 각 요소에 카운터가 있어야 하는 단순화된 구문도 허용됩니다.
그래서아주 기본적인예시 수모두소스 주소를 전달하고 이 링크의 예를 따르고 type
대신 이전 구문을 유지하면 typeof
다음을 사용할 수 있습니다(적어도nftables0.9.1):
table ip accounting
delete table ip accounting
table ip accounting {
set inputcounters {
type ipv4_addr # with 0.9.4 could be replaced with: typeof ip saddr
# counter # optional, requires 0.9.4
flags dynamic # appeared in 0.9.1
# timeout 7d # consider using a timeout, possibly shorter, to avoid overflowing the set
size 65535 # or a bigger size
}
chain input {
type filter hook input priority 0; policy accept;
add @inputcounters { ip saddr counter } # 0.9.1 mandatory. Add new element *with counter* if not already present
ip saddr @inputcounters # match element so increment its counter
}
}
최적화가 있을 수 있습니다. 아마도 ct state new
캐시될 것이며 컬렉션에 중복 주소를 추가하는 것보다 더 빠릅니다(결과적으로 작동하지 않음). 등.
데비안의 버스터 백포트는 현재 다음을 제공합니다.nftables0.9.6.
직접 사용해 볼 수도 있습니다.프랑켄데비안) 또는 데비안 형식의 소스에서 다시 컴파일하는 것이 더 좋습니다. 데비안에서 직접 사용하는 것이 더 쉬울 수 있습니다.구축함 백포트왜냐하면 그들은 이미 적합하기 때문이다버스터표적. 예를 들어 Debian의 예제를 따르고 적용하여간단한 백포트 생성.
여러 단계가 포함될 수 있습니다(예: 첫 번째 "백포트"libnftnl이전에는 소스 코드가 필요했습니다.nftables) 이는 물론 많은 개발 패키지 설치를 트리거하지만(컨테이너나 다른 시스템에서 설치하는 것이 더 좋음) 이는 이 답변의 범위를 벗어납니다.