Postfixで使用しているsmtpポートに対しDDOS攻撃がありました。1分少々の間に140回の接続と切断が繰り返されていました。Postfixでも接続回数のMax制限設定はしていますが、このような攻撃には間に合わないようです。
そこで、iptablesの設定でDDOS攻撃を遮断しようと思います。
1.DDOS攻撃検知
postfix-pflogsummツールでPostfixのログは毎日メールで届きます。ある日以下のようなログが見つかりました。
1 2 3 4 5 6 7 8 9 10 11 |
1 Connection rate limit exceeded: 106 from solar.ortel.net[202.62.XXX.40] for service smtp 1 Connection rate limit exceeded: 8 from unknown[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 112 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 20 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 67 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 30 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 19 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 87 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 101 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 81 from solar.ortel.net[202.62.xxx.40] for service smtp 1 Connection rate limit exceeded: 85 from solar.ortel.net[202.62.xxx.40] for service smtp |
ログを確認すると1分間に140回以上の接続と切断を繰り返しており典型的なDDOS攻撃です。こちらの記事の設定で同時接続数は10に制限し、1分間に3回の接続に制限していたのですが検出時間の1分少々で多数の接続と切断があるとタイムラグによりうまく機能しないようです。
2.DDOS攻撃の対処
調べたところ、iptablesでhashlimitを指定するとDDOS攻撃をブロックできるようです。limitでも同様にブロックできるのですが対象が全ユーザーになってしまいます。攻撃者だけをブロックしたいのでhashlimitが目的の設定になります。
CentOS7環境ではFirewalldが標準で動作しています。そこで以下のようにFirewalldからDirectコマンドでiptablesを呼び出して設定します。1行目が再起動後も有効となる永続的な設定。2行目が即時反映される設定です。
1 2 |
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p tcp -m multiport --dport 25,465,993 -m state --state NEW -i eno16777728 -m hashlimit --hashlimit-name mail_limit --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT # firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp -m multiport --dport 25,465,993 -m state --state NEW -i eno16777728 -m hashlimit --hashlimit-name mail_limit --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT |
上記コマンドの意図することは簡単に説明すると、アダプタ「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ゾーン設定を確認します。
1 2 3 4 5 6 7 8 9 |
# firewall-cmd --list-all --zone=public interfaces: eno16777728 sources: services: dhcpv6-client smtp ports: 465/tcp 993/tcp masquerade: no forward-ports: icmp-blocks: rich rules: |
smtpと465,993がPublicゾーンに追加されていますのでこれらを削除します。
1 2 3 4 5 6 |
# firewall-cmd --remove-service=smtp --zone=public # firewall-cmd --remove-service=smtp --zone=public --permanent # firewall-cmd --remove-port=465/tcp --zone=public # firewall-cmd --remove-port=465/tcp --zone=public --permanent # firewall-cmd --remove-port=993/tcp --zone=public # firewall-cmd --remove-port=993/tcp --zone=public --permanent |
削除後のPublicゾーン設定を確認します。
1 2 3 4 5 6 7 8 9 |
# firewall-cmd --list-all --zone=public interfaces: eno16777728 sources: services: dhcpv6-client ports: masquerade: no forward-ports: icmp-blocks: rich rules: |
smtpと465,993が削除されています。次にhashlimitの設定(Directコマンドの設定)を確認します。
1 2 |
# firewall-cmd --direct --get-all-rules ipv4 filter INPUT 1 -p tcp -m multiport --dport 25,465,993 -m state --state NEW -i eno16777728 -m hashlimit --hashlimit-name mail_limit --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT |
ipv4 filter INPUT 1 でhashlimitの設定が追加されています。
4.参考にさせて頂いたサイト
ありがとうございます。