[Japanese|English]

smtpguard とは…

smtp で流れてくるメールを制御できるように実装されたツールです。 ISP のニーズに合わせて考えられたソリューションです。ISP では 内部 (お客様) のユーザから大量にメールが送信されてきます。サーバが 大きく活動していることは幸いですが、SPAM を送ったり、ウイルスが 送られたりするユーザもいます。DSL や光ファイバの快速回線でお客様 とつながっている場合はメールサーバの大変な負荷となり、運用者の 面から大問題となります。そこに smtpguard が誕生…


問題となるパターン

ユーニク IP アドレス メールの量

  • 内部のユーザから SPAM 発生
  • ウイルスで汚染されたパソコンから発生
  • 外部の SPAMMER が発生

  • 「小」、「中」、「大」の言葉を上記で使っていますが、環境によって 意味が違います。有用に設定できるようにため、

  • 正常にシステムのトップロードは何通/秒/ユーザ?
  • SPAM が発生するとロードは何通/秒となる?
  • メールシステムは秒に何通まで性能を確保出来るか?

    を調査する必要があります。下記は smtpguard の目的を図で表します。


    SPAM の特徴として、受け付け (INCOMING) の負荷となるだけではなく、 OUTGOING サーバの大変な負荷になります。SPAM で送信しようとしている メールのなか、多くのメールがバウンスされます。バウンスが又 queue に溜るだけではなく、元の送信者へエラーメッセージを返そうとしても 外部のサーバへ接続しようとする時タイムアウトしてしまいます。それで 最後にダブルバウンスが発生しますが、タイムアウトや溜ったキューで OUTGOING が危険な状態になります。この全体な SPAM 負荷を防ぐために INCOMING で smtpguard を利用します。

    smtpguard はポイント方式のソフトとなっています。接続が張られる度に設定 ファイルに従ってポイントを加算していきます。SMTP セッション中に 得られる情報をもとに、あらかじめ定められたルールによってポイント の計算を行い、smtpd が受信拒否などの適切なアクションを行う ことを可能としています。得られる情報とは

  • リモート IP アドレス
  • MAIL FROM コマンドで与えられた文字列
  • RCPT TO コマンドで与えられた文字列

    上記等の情報を参照し、下記のアクションを起こせるようにしています

  • ok

    ホワイトリストとして扱う

    wait

    処理遅延

    reject

    受信拒否

    mail

    警告メールを送信する

    log

    ログにメッセージを出力する

    delete

    データベースのレコードを削除

    設定ファイルの記述例
    MAILFROM="postmaster@example.com"
    SENDMAIL="/usr/sbin/sendmail"
    EXPIRE=900
    
    # IPアドレスが 172.16.3.* であれば、1ポイント加算される。
    A: IP==172.16.3.        : add(1)
    
    # MAIL FROM が example.com で終っていなければ、1ポイント加算される。
    A: F!~=example.com      : add(1)
    
    # RCPT TO 1回につき、1ポイント加算される。
    A:                      : add(1)
    
    # RCPT TO が example.com で終っていなければ、1ポイント加算される。
    A: T!~=example.com      : add(1)
    
    # RCPT TO 数が100を越えていれば、一時的に100ポイント加算する。
    R: TC>100               : addlocal(100)
    
    # ポイントが100を越えていれば、
    #       o smtpd に "wait 5" を返す
    #       o ログ出力
    R: P>100                : wait(5),
            log( "inserting a small sleep in a SMTP session from " , IP )
    
    # ポイントが1000を越えていれば、
    #       o "admin@example.com" への警告メール送信
    #       o データ保持期間を900秒延長
    #       o ログ出力
    #       o smtpd からクライアントに "MESSAGE" を返す
    R: P>1000               : mail("admin@example.com"),
            extendexpire(900),
            reject("411 mail server temporally rejected message"),
            log("rejecting a SMTP session from ", IP)
    

    smtpguard はフレキシブルで、システムのニーズに合わせてお守りできます。