nftables는 IPv4 및 IPv6를 동적으로 블랙리스트에 추가합니다.

nftables는 IPv4 및 IPv6를 동적으로 블랙리스트에 추가합니다.

설정에서nftables에 대한 동적 블랙리스트, AB에 따르면좋은 대답, ipv4 및 ipv6에 대한 블랙리스트를 복사하는 동안 오류가 발생했습니다. 나는 다음 명령줄(debian nftables)을 수행했습니다(편집: 원래 질문은 이전 버전 0.9.0에 대한 것이었습니다. 앞뒤 의견 프로세스 중에 최신 버전 0.9.3으로 업그레이드되었으므로 아래에서 허용되는 대답은 다음과 같습니다. 0.9.3 API 버전의 경우 유효합니다):

nft flush ruleset && nft -f /etc/nftables.conf

구성 파일에는 다음이 포함됩니다.

tcp flags syn tcp dport 8000 meter flood size 128000 { ip  saddr timeout 20s limit rate over 1/second } add @blackhole_4 { ip  saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter flood size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter greed size 128000 { ip  saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop                                                         
tcp flags syn tcp dport 8000 meter greed size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

다음과 같은 오류 응답을 받았습니다.

/etc/nftables.conf:130:17-166: Error: Could not process rule: Device or resource busy
                tcp flags syn tcp dport 8000 meter flood size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/etc/nftables.conf:132:17-145: Error: Could not process rule: Device or resource busy
                tcp flags syn tcp dport 8000 meter greed size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

또한 이것이 무엇을 측정하는지 잘 모르겠습니다 size. 권위 있는 곳에서 본 것이기 때문에 128000으로 설정되어 있습니다.

편집 : 알았어. 나는 계속해서 놀기로 결정했고 각 ipv6 규칙에 대해 별도의 측정기를 생성하면 오류 메시지가 사라지는 것을 발견했지만 이유를 이해할 수 없으므로 내 질문에 대답하지 않고 대신 다른 사람에게 맡길 것입니다. 더 많은 지식 측정기를 공유할 수 없는 이유에 대한 설명입니다. 다음은 오류를 생성하지 않습니다.

tcp flags syn tcp dport 8000 meter flood_4 size 128000 { ip  saddr timeout 20s limit rate over 1/second } add @blackhole_4 { ip  saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter flood_6 size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter greed_4 size 128000 { ip  saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop                                                         
tcp flags syn tcp dport 8000 meter greed_6 size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

편집: 이 글을 쓰는 시점에서 nftables의 매뉴얼 페이지에서는 용어를 사용 meter하지만nftables 위키, 이 용어는 특정 프로토콜 유형(예: ipv4_addr)을 포함하는 정의가 필요한 set을 선호하여 더 이상 사용되지 않습니다. 따라서 nftables가 현재 이 용어를 meter새로운 용어에 매핑하는 경우 현재 매핑이 불가능한 이유를 설명합니다. set와 사이에 공유되는 단일 프로토콜 간의 용어입니다 . 그러나 에 주어진 예는meteripv4_addripv6_addrnftables 위키자체도 최신이 아닙니다. dynamic현재(nftables v0.9.0) 유효한 플래그 유형이 아니기 때문에 오류가 발생합니다. man페이지 로 돌아가서 set플래그 또는 입력을 볼 수 있습니다. 어떤 유형이 이 목적에 적합한지 잘 모르겠습니다.constantintervaltimeout

nftables편집: 측정의 "계산" 형식이 :( ct연결 추적) 의 별도 섹션 으로 이동된 것으로 보입니다 . 이제 다음과 같은 정의가 생성되어야 할 것 같습니다:

    set greed_4 {                                                                                                                                                                                 
        type ipv4_addr                                                                                                                                                                            
        flags constant                                                                                                                                                                            
        size 128000                                                                                                                                                                               
        }                                                                                                                                                                                         

    set greed_6 {                                                                                                                                                                                 
        type ipv6_addr                                                                                                                                                                            
        flags constant                                                                                                                                                                            
        size 128000                                                                                                                                                                               
        }                                                                                                                                                                                         

그러면 다음 규칙이 유사하지만 여전히 오류가 발생할 수 있습니다.

ct state new add @greed_4 { tcp flags syn tcp dport 8000 ip saddr ct count over 3 } add @blackhole_4 { ip saddr timeout 1m } drop
ct state new add @greed_6 { tcp flags syn tcp dport 8000 ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

답변1

이 시도

table inet filter {
  set blackhole_4 {
    type ipv4_addr
    flags timeout
  }
  set blackhole_6 {
    type ipv6_addr
    flags timeout
  }
  set greed_4 {
    type ipv4_addr
    flags dynamic
    size 128000
  }
  set greed_6 {
    type ipv6_addr
    flags dynamic
    size 128000
  }
  chain input {
    type filter hook input priority 0;
    ct state new tcp flags syn tcp dport 8000 add @greed_4 { ip saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop
    ct state new tcp flags syn tcp dport 8000 add @greed_6 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6  saddr timeout 1m } drop
  }
}

편집: @User1404316의 설명: @Zip이 아마도 (올바르게) 설명을 요청했기 때문입니다. 내가 아는 한: ct하나만 소개해주세요연결 추적규칙, 이 경우 new tcp연결의 경우 포트 8000으로 이동하는 경우( dport목적지 포트), 미리 정의된 컬렉션 컬렉션에 소스 IPv4를 추가합니다 greed_4. 이런 일이 발생하면 규칙은 첫 번째 대괄호 조건으로 계속됩니다. 즉, 소스 주소에 3개 이상의 활성 연결이 있는 경우 소스 IPv4가 두 번째 사전 정의된 세트에 추가되지만 blackhole_4이를 1분 동안만 유지합니다. 규칙에서 멀리 떨어져 있다가 연결이 끊어졌습니다.

원래 게시된 답변에는 두 줄의 긴 줄이 잘렸지만, 그것이 무엇이어야 한다고 생각하는지 파악하여 위에 삽입했습니다. 좋은 소식은 테스트 결과 이 ​​답변이 효과가 있다는 것입니다!

남은 궁금증은 컬렉션 세트의 크기를 언제 정할지, 얼마나 크게 설정할지 궁금해서 일단은 그대로 두었습니다.

관련 정보