IPTable은 "초당 호출 수"를 높게 제한하고 다른 프로그램(동일 시스템)으로 리디렉션합니다.

IPTable은 "초당 호출 수"를 높게 제한하고 다른 프로그램(동일 시스템)으로 리디렉션합니다.

내 VoIP 서버의 포트 5060에서 iptables 수준에 도달하는 초당 대량의 SIP VoIP INVITE(UDP)(초당 호출 수)를 "제어"하는 방법을 찾고 있습니다.
내가 해야 할 일은 초당 INVITE 수를 특정 속도(예: 20cps)로 제한하는 것입니다. 서버에 많은 수의 CPS를 수신하면 다른 프로그램이 있는 동일한 시스템의 다른 프로그램으로 리디렉션해야 합니다. SIP 메시지 "603 Decline"을 보내 응답할 포트(예: UDP/5090)를 실행합니다. 가능합니까?
지금까지 비슷한 질문에 대한 답변이 너무 많아서 조금 당황스럽습니다... --limit를 사용해야 합니까? ,한계? , 조회수? ...
게다가 소스 코드 IP 주소를 통해 이 작업을 수행할 수 있나요?
개념적으로는 다음과 같은 것을 생각하고 있습니다...가능하다면:
INPUT
iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT

RATE-LIMIT
iptables --append RATE-LIMIT --match limit --limit 20/sec --limit-burst 20 --jump ACCEPT
iptables --append RATE-LIMIT --jump DECLINE-INVITE

DECLINE-INVITE
iptables --append DECLINE-INVITE [how to redirect to port udp 5090]

감사해요! 리카르도

답변1

먼저 살펴 보겠습니다.일반 네트워크의 Netfilter 및 패킷 흐름개략도:

일반 네트워크의 Netfilter 및 패킷 흐름

OP가 하려는 작업:필터/INPUT 하고 싶은 일을 하기에는 너무 늦었습니다. 라우팅 결정이 내려지기 전에 DNAT를 할 수 있는 기회가 완료되어야 합니다./프리라우팅.

따라서 이 작업은 더 빨라야 하며 다른 경우에는 두 개의 다른 테이블을 사용해야 할 수도 있습니다.으깨다/일부 특수 테스트를 위한 PREROUTING 및/PREROUTING은 포트 리디렉션에 사용되며, 포트의 의도를 전달하기 위해 패킷에 태그가 있습니다.으깨다도착테이블. 실제로 이 상황은 매우 복잡하며 다음과 같은 사항이 포함될 수 있습니다.날것의표를 작성하고 간단한 설정을 사용하지 마세요(예:IPTables는 ESTABLISHED를 포함한 모든 UDP 패킷을 리디렉션합니다.)


여기,/PREROUTING이면 충분합니다. 이는 패킷만 새 스트림(상태)을 시작하기 때문입니다.새로운) OP의 상황을 확인해 보니 정확히 이런 일이 일어났습니다.표: 상태의 패킷만새로운(회로도에 표시된 대로) 다른 모든 패킷은 완료된 NAT 결정을 따릅니다. 따라서 이 블록은 --match conntrack --ctstate NEW어떤 경우에도 중복됩니다 .테이블 규칙: 항상 참입니다. 이것한계match에는 제한이 없으며 모든 테이블/체인에서 사용할 수 있습니다.

결국 :

  • 다른 것에 영향을 주지 않도록 UDP 포트 5060에 대한 필터를 추가하세요.
  • 아니요연결하다여기에 일치해야합니다
  • 참고로 -j ACCEPT,표에는 단순히 "이 경우 NAT가 수행되지 않습니다"라고 표시되어 있습니다.
  • DECLINE-INVITE는 실제로 필요하지 않지만 OP에서 사용한 방식을 유지하겠습니다.
  • 포트와 함께 사용되는 DNAT 대상에는 프로토콜이 필요하므로 -p udp5060/UDP 패킷만 이 규칙과 일치하더라도 다시 추가해야 합니다.
  • 로컬 시스템에서는 결과를 쉽게 테스트할 수 없습니다. 로컬 시스템은 OUTPUT -> ... Loopback ... -> PREROUTING -> INPUT 경로를 사용합니다. PREROUTING 단계에서 첫 번째 수신 패킷은 루프백 전에 OUTPUT에서 방금 생성된 흐름과 일치하므로 더 이상 NEW 상태로 표시되지 않으며 표시되지 않습니다./PREROUTING 체인이며 거기에서는 DNAT가 수행되지 않습니다. DNAT는 OUTPUT에서 이러한 규칙을 복사(및 완전히 조정)하여 즉시 수행할 수 있습니다./산출. 어쨌든 현지 상황에 따라 다른 고려 사항이 있을 것이라고 확신합니다. 대신 원격 위치(또는 연결된 컨테이너 또는 네트워크 네임스페이스)에서 테스트하세요.
iptables -t nat -N RATE-LIMIT
iptables -t nat -N DECLINE-INVITE

iptables -t nat -A PREROUTING -p udp --dport 5060 -j RATE-LIMIT
iptables -t nat -A RATE-LIMIT -m limit --limit 20/sec --limit-burst 20 -j ACCEPT
iptables -t nat -A RATE-LIMIT -j DECLINE-INVITE
iptables -t nat -A DECLINE-INVITE -p udp -j DNAT --to-destination :5090

관련 정보