IPTableは「1秒あたりの呼び出し数」を高く制限し、別のプログラム(同じシステム)にリダイレクトします。

IPTableは「1秒あたりの呼び出し数」を高く制限し、別のプログラム(同じシステム)にリダイレクトします。

私は、VoIPサーバーのポート5060でiptablesレベルに達する1秒あたりの大量のSIP VoIP INVITE(UDP)(1秒あたりの呼び出し数)を「制御」する方法を探しています。
私がしなければならないのは、1秒あたりの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を行う機会を完了する必要があります。ナット/プリルーティング。

したがって、これはより速くなければならず、他の場合は2つの異なるテーブルを使用する必要があります。壊す/いくつかの特別なテストのための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 -> ...ループバック... -> 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

おすすめ記事