
必要なもの:
時間ごとのリクエストの量によってドロップ ルールを追加する結果は多数ありますが、一定期間内に特定のアドレスから受信したバイト数によってドロップする必要があります。
調査したこと:
私はiptablesを見ました。最初のケースでは、専用のマッチ。私も見ましたクォータマッチただし、データ数はグローバルに追跡されます。
IP ごとに受信データを追跡するために 2 つのルールを混在させる方法がわかりません。
他のもの :
IP ごとのバイト数を追跡すると大量のメモリが使用される可能性があることは承知しています。そのため、期間も短くしておきたいと考えています。
詳細な例がある限り、他の方法も受け入れることができます。
答え1
IPSET はタイムアウトとカウンターのオプションとともに使用できます。これは次のようになります。
#create ipset for accounting with default lifetime 300 secs
ipset create IP_QUOTA_SET hash:ip timeout 300 counters
#create separated rule chain
iptables --new-chain PER_IP_QUOTING
#send packets to chain
iptables -t filter -A INPUT \
-i <in-iface> --dst <ip> \
-p tcp --dport <dstport> \
-j PER_IP_QUOTING
#if ip doesn't exist in the set, add it
iptables -t filter -A PER_IP_QUOTING \
-m set ! --match-set IP_QUOTA_SET src \
-j SET --add-set IP_QUOTA_SET src --timeout 300
#if packet exists in the set, check bytes
#if byte counter > quota then close connection
#by sending of tcp-reset packet.
iptables -t filter -A PER_IP_QUOTING \
-m set --match-set IP_QUOTA_SET src \
--bytes-gt 1000 -j REJECT --reject-with tcp-rst
#pass other packets (for debug purpose)
iptables -t filter -A PER_IP_QUOTING \
-j RETURN
この場合、ipset コマンドでリストを確認し、編集することができます。カウンターとタイムアウトを含む現在のリストを表示します: ipset list IP_QUOTA_SET。
詳細についてはドキュメントをお読みください。