FirewalldでPostfixへのDDOS攻撃を遮断する

Postfixで使用しているsmtpポートに対しDDOS攻撃がありました。1分少々の間に140回の接続と切断が繰り返されていました。Postfixでも接続回数のMax制限設定はしていますが、このような攻撃には間に合わないようです。

そこで、iptablesの設定でDDOS攻撃を遮断しようと思います。

1.DDOS攻撃検知

postfix-pflogsummツールでPostfixのログは毎日メールで届きます。ある日以下のようなログが見つかりました。

ログを確認すると1分間に140回以上の接続と切断を繰り返しており典型的なDDOS攻撃です。こちらの記事の設定で同時接続数は10に制限し、1分間に3回の接続に制限していたのですが検出時間の1分少々で多数の接続と切断があるとタイムラグによりうまく機能しないようです。

2.DDOS攻撃の対処

調べたところ、iptablesでhashlimitを指定するとDDOS攻撃をブロックできるようです。limitでも同様にブロックできるのですが対象が全ユーザーになってしまいます。攻撃者だけをブロックしたいのでhashlimitが目的の設定になります。

CentOS7環境ではFirewalldが標準で動作しています。そこで以下のようにFirewalldからDirectコマンドでiptablesを呼び出して設定します。1行目が再起動後も有効となる永続的な設定。2行目が即時反映される設定です。

上記コマンドの意図することは簡単に説明すると、アダプタ「eno16777728」を通した接続の宛先ポートsmtp(25),smtps(465),imaps(993)に対し同時接続数を10に制限する。カウントする単位は接続元IPアドレス。通信終了後2分経ったら同時接続数をカウントダウン。以降1分間に1ずつ接続許可数を最大10まで回復する。コマンドの詳細は下記を参照してください。

NO コマンド 意味・説明
1 –direct iptablesの設定を呼び出します
2 –add-rule ipv4 IPV4ルールを追加します
3 filter INPUT 1 優先順位1のフィルターを定義します
4 -p tcp フィルター対象とするプロトコルをtcpにします
5 -m multiport –dport 25,465,993 フィルター対象の接続先ポート番号を複数指定します
6 -m state –state NEW 新規パケットに対してのフィルター設定
7 -i eno16777728 フィルター対象とするアダプタを「eno16777728」に限定
8 -m hashlimit haslimitの指定
9 –hashlimit-name mail_limit haslimitフィルター名をmail_limitに設定
10 –hashlimit 1/m Limit発動後、1分間に1ずつ許可数を回復する mが分
11 –hashlimit-burst 10 Limit発動する許可数と初期許可数。10までフィルターを許可します。これを超えると通信終了後–hashlimit-htable-expireで指定された時間経過(120秒)後に許可数をカウントダウンします。
12 hashlimit-mode srcip フィルターカウントの対象範囲「srcip」でIPアドレス毎にカウント「srcip,dstport」とするとIPとポート毎にカウントします
13 –hashlimit-htable-expire 120000 フィルターが有効な期間をミリ秒で指定。通信終了後120秒でフィルター数をカウントダウンする。
14 -j ACCEPT フィルターを通過した–dportへの接続を許可します
3.hashlimitに合わせたFireWalldの設定

上記「hashlimit」の設定でPORT:25,465,993への接続は動的に許可されるようになりましたので、「hashlimit」が機能するように既存のFirewalld設定を削除します。(Publicゾーンの設定を残していると接続制限がかからない為)

現在のPublicゾーン設定を確認します。

smtpと465,993がPublicゾーンに追加されていますのでこれらを削除します。

削除後のPublicゾーン設定を確認します。

smtpと465,993が削除されています。次にhashlimitの設定(Directコマンドの設定)を確認します。

ipv4 filter INPUT 1 でhashlimitの設定が追加されています。

4.参考にさせて頂いたサイト

大量のアクセスを試みる迷惑な接続元を制限する

CentOS7 のBIND9で不正アクセスが多い場合の設定

iptables のコマンド書式

ありがとうございます。

スポンサーリンク
レクタングル大広告




レクタングル大広告




シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レクタングル大広告