내 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 및 패킷 흐름개략도:
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 udp
5060/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