nftables "@my_ssh_meter 추가 { ip Saddr 제한 속도 10/초} 허용" 규칙을 이해하는 방법은 무엇입니까?

nftables "@my_ssh_meter 추가 { ip Saddr 제한 속도 10/초} 허용" 규칙을 이해하는 방법은 무엇입니까?

nftables기록된 동적으로 채워진 컬렉션을 지원합니다.nftables 위키. Wiki 페이지의 첫 번째 예는 다음과 같습니다.

table ip my_filter_table {
        set my_ssh_meter {
                type ipv4_addr
                size 65535
                flags dynamic
        }

        chain my_input_chain {
                type filter hook input priority filter; policy accept;
                tcp dport 22 ct state new add @my_ssh_meter { ip saddr limit rate 10/second } accept
        }
}

nftables위의 구성을 설명하면 다음과 같습니다.

이 예에서는 소스 IP 주소당 초당 10개의 연결로 트래픽 속도를 제한하기 위해 my_ssh_meter라는 다이너셋을 사용하는 새로운 TCP SSH(포트 22) 연결을 일치시키는 규칙을 만듭니다.

이 규칙을 어떻게 해석하거나 이해합니까? 즉, Linux 연결 추적 하위 시스템에서 TCP 대상 포트 22( )에 대한 새 연결( )을 발견하면 데이터가 있는 소스 IP 주소( ip saddr) 가 limit rate 10/second명명된 집합에 추가된다는 것입니다. 그런데 이 세트는 한 번도 사용된 적이 없는 것 같은데요? 컬렉션을 채울 때 작업이 수행되었나요?my_ssh_meterct state newtcp dport 22my_ssh_meteraccept

답변1

무슨 일이야:

  • 새로운 SSH 연결이 도착하면 해당 소스와 연결된 측정기가 세트에 추가되고(아직 존재하지 않는 경우 세트이므로 각 요소는 한 번만 표시됨) 부울 결과 true/false를 제공하도록 평가됩니다.

  • true로 평가되면 규칙은 계속될 수 있고, 그렇지 않으면 규칙이 중지됩니다.

    참고: 연결된 악기가 없는 경우 요소 추가는 항상 true로 평가됩니다. 컬렉션에 추가하는 것은 최종적이지 않습니다.

여기:

  • true로 평가되면(예: 플러딩되지 않음) 규칙은 accept현재 입력 후크(예: chain my_input_chain) 평가를 종료합니다.

  • false로 평가되면 규칙은 accept최종 문 이전에 종료됩니다.

    • 다음 규칙으로 계속 진행되거나 규칙이 없는 경우
    • 기본 체인 전략을 사용합니다.accept

따라서 무슨 일이 일어나더라도 새로운 연결 패킷은 항상 허용됩니다. 이 규칙 세트는 규칙 세트를 채우는 것 외에는 눈에 띄는 효과가 없습니다.

위키의 규칙 세트 예제는 불완전합니다. 동일한 조건에서 다음과 같이 (또는)이 와야 합니다 drop(일부 규칙 분해는 물론 가능합니다).reject

% nft add rule ip my_filter_table my_input_chain tcp dport 22 ct state new drop

따라서 지표가 오버플로되면 accept이전 규칙의 마지막 부분이 평가되지 않고 다음 규칙에서 들어오는 연결이 삭제됩니다. 시도가 이루어질 때마다 표시기의 토큰 버킷에 계산됩니다. 따라서 계속해서 너무 빠르게 진행하려고 하면 새 연결이 전혀 없을 수 있습니다(기본 토큰 버킷 버스트는 5이고 첫 번째 연결은 즉시 플러딩되더라도 항상 성공합니다).

여기서 알아야 할 중요한 점은 다른 많은 진술과 마찬가지로놓다성명(특수 구문은@놓다) 둘 다 변경 사항이 있는 작업을 수행하고(컬렉션에 요소 추가) 부울 결과(true 또는 false)를 가지며, 이는 추가로 평가되는 규칙의 나머지 부분에 따라 달라집니다. 두 역할은 동시에 사용됩니다.

테스트하려면 or 10/second로 바꾸십시오 . 이제 동작이 더욱 명확해집니다(5번째 연결 이후: 기본적으로).10/minute10/hourlimit토큰 버킷은 5개의 패킷 버스트를 허용합니다. )

관련 정보