Linux에서 특정 포트에 대한 연결 수를 제한하는 방법은 무엇입니까?

Linux에서 특정 포트에 대한 연결 수를 제한하는 방법은 무엇입니까?

특정 포트의 연결 수를 제한하고 싶습니다. 예: 내 서버의 2300에서 2500 사이의 포트에서 2개의 연결만 허용하고 싶습니다. 하지만 iptables를 사용하여 이 작업을 수행하는 방법을 모르겠습니다. 추가 소프트웨어가 필요합니까? 어떤 제안이 있으십니까?

답변1

당신은 이것을 할 수 있습니다nftables, 커널 >= 4.18(여기서는 커널 5.3을 사용하여 테스트됨) 및 nftables >= 0.9.1 사용한계~의계산기능 (및동적여기에 사용된 로고). 그것은보다 낫다iptables제한만들 때 선택할 수 있기 때문에미터 놓다, 제한된 선택기와 마스크가 적용되며 가능한 선택기는 소수(포트 제외)만 존재합니다.iptables, 포트당 하나의 규칙이 필요할 수 있습니다.

다음은 개조된 내용입니다위키 예단, OP 문제를 해결하기 위해 나가는 IP 주소 대신 들어오는 TCP 포트를 추적한다는 점은 제외됩니다. 두 개의 연결이 설정된 후 2300과 2500 사이의 동일한 로컬 포트에 대한 모든 TCP 연결은 TCP RST에 의해 거부됩니다. 알겠어요CT 상태 신규패킷 경로에서 새 요소를 추가하려고 시도하지 않기 위한 최적화입니다.모든첫 번째 패킷뿐만 아니라 연결에서 들어오는 패킷도 마찬가지입니다.

NFFT로드할 규칙 파일 nft -f:

flush ruleset

table ip my_filter_table {
       set my_connlimit {
               type inet_service
               size 65535
               flags dynamic
       }

       chain my_input_chain {
               type filter hook input priority filter; policy accept;
               tcp dport 2300-2500 ct state new add @my_connlimit { tcp dport ct count over 2 } counter reject with tcp reset
       }
}

일치하는 연결은 다음 위치에 항목을 생성합니다.내 연결 제한: 현재 개수가 아닌 동적으로 생성된 선택기 항목(다음에서 제공)한계사용연결하다기입). 이 특별한 경우에는 컬렉션 크기를 2500-2300+1=201로 설정하는 것으로 충분할 수 있습니다. 추가된 요소는 연관된 개수가 더 이상 없을 때(즉, 해당 포트의 모든 연결이 닫히면) 자동으로 사라집니다(적어도 커널 5.3에서는). 포트 2301에서 하나 또는 두 개의 연결을 설정한 후의 예:

# nft list set ip my_filter_table my_connlimit
table ip my_filter_table {
        set my_connlimit {
                type inet_service
                size 65535
                flags dynamic
                elements = { 2301 ct count over 2  }
        }
}

UDP는 동일하게 작동하지만 실제 연결이 없기 때문에 conntrack은 일반적으로 마지막 활동 후 30초에서 120초(이전에는 180초) 사이에 항목 시간을 초과한다는 점을 제외하고는 동일합니다. 또한 사용할 수 있습니다종속단순히놓다예를 들어 미터로서 다음을 제한하십시오.각 서버의 IP와 포트그리고 뿐만 아니라포트당IP가 여러 개인 서버의 경우 다음과 같습니다.

flush ruleset

table ip my_filter_table {
       set my_connlimit {
               type ipv4_addr . inet_service
               size 65535
               flags dynamic
       }

       chain my_input_chain {
               type filter hook input priority filter; policy accept;
               tcp dport 2300-2500 ct state new add @my_connlimit { ip daddr . tcp dport ct count over 2 } counter reject with tcp reset
       }
}

참고: 계산 도구에서 로컬 연결을 피하려면 다음을 통과하십시오.루오장치를 우회해야 합니다. 예를 들어:

# nft insert rule ip my_filter_table my_input_chain iif lo accept

관련 정보