Postfixで外部メールサーバを中継する方法について

どうも、ディーネットの山田です。
大阪地震、西日本豪雨により被害に遭われた皆様心よりお見舞い申し上げます。
私は、どちらも電車が運休してしまい、出勤できませんでした。
また、大阪地震については、出勤途中の駅で運行打ち切りになったので、
出勤もできない・帰宅もできない困難者になって結構大変でした。
そういう時は、スマホが生命線なので予備バッテリは常に常備しておくに越したことはないですね。
さて、話が脱線してしまいましたが、本題に移りたいと思います。

概要

今回は、シェルスクリプトなどからのメールについてMTAのPostfixが
直接インターネットに送るのではなく、自社のメールサーバ経由で
送れるようにする方法を紹介します。
背景として、自社のドメインにSPFレコードが導入され、記載されている
IP以外からはスパム扱いとなってしまうので、自社のメールサーバに
自分のメールアカウントでSMTPAUTH認証を取ってから送ろうという
考え付いたためです。

SPFレコードとは

電子メールの送信元ドメインが詐称されていないかを検査するための仕組みです。
DNS情報に予め送信元サーバのIPアドレスを記載しておき、受信側のサーバが
実際に送ってきたメールサーバのIPアドレスとを比較し、受信拒否するなどの
処理を行います。

検証環境情報

OS

CentOS release 6.9 (Final)

Postfix

postfix-2.6.6-8.el6.x86_64

検証内容

テストメールコマンド

# echo "testmail" | mail -s "testmail" "{※メールアカウント}"
  • {※メールアカウント}宛にメールを送信できます

    作業内容

    必要なパッケージをインストールします

    SMTP AUTHの各種認証方式に対応できるようにする
    # yum install cyrus-sasl.x86_64 cyrus-sasl-devel.x86_64 cyrus-sasl-lib.x86_64 cyrus-sasl-md5.x86_64 cyrus-sasl-plain.x86_64
    
  • CRAM-MD5認証に対応できるようにします

    必要な設定ファイルを作成します

    メールアカウント情報が記載されたファイルを作成する
    # vi /etc/postfix/relay_password
    ------------------------------------------------------------
    [{※自社メールサーバのホスト名やIP}]:587 {※メールアカウント}:{※メールパスワード}
    ------------------------------------------------------------
    
  • SMTP AUTHに使用するメールアカウント情報を記載します
    Postfixが読めるようにバイナリ化する
    # postmap /etc/postfix/relay_password
    
  • Postfixは平文だと読めないので、バイナリ化します
    エンベロープFROMを書き換えるためのファイルを作成する
    # vi /etc/postfix/sender_maps
    ------------------------------------------------------------
    /^.*$/ {※メールアカウント}
    ------------------------------------------------------------
    
  • 送信元メールアドレスを書き換えないと、メールサーバ側で送信元メールアドレスの存在チェックで拒否される可能性があるので、送信元メールアドレスは書き換えた方が無難です。
  • こちらは、正規表現形式になるので、バイナリ化は不要です。
    Postfixの設定に組み込む
    # vi /etc/postfix/main.cf
    ------------------------------------------------------------
    ## RELAY HOST
    relayhost = [{※自社メールサーバのホスト名やIP}]:587
    ## SMTP AUTH
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/relay_password
    smtp_sasl_security_options = noanonymous
    smtp_sasl_tls_security_options = noanonymous
    smtp_sasl_mechanism_filter = login, cram-md5, plain
    ## SSL
    smtp_use_tls = yes
    smtp_tls_security_level = may
    smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
    ## HEADER CHANGE
    local_header_rewrite_clients = permit_mynetworks
    sender_canonical_classes = envelope_sender
    sender_canonical_maps = regexp:/etc/postfix/sender_maps
    ------------------------------------------------------------
    
  • 必要最低限なものを揃えていますので、上記の内容を末端に追加して頂ければOKです。

    設定反映のためにPostfixを再起動する

    # service postfix restart
    

    動作結果

  • テストメールコマンドを実行した際の結果を参考程度に記載しておきます。

    SMTPAUTHを使うか直接送るかでログの出力内容が異なります

    ▼自社のメールを経由する場合
    Jul 17 13:00:43 localhost postfix/pickup[16356]: 5743F100805: uid=0 from=<root>
    Jul 17 13:00:43 localhost postfix/cleanup[16363]: 5743F100805: message-id=<20180717040043.5743F100805@localhost.localdomain>
    Jul 17 13:00:43 localhost postfix/qmgr[16357]: 5743F100805: from=<{※メールアカウント}>, size=445, nrcpt=1 (queue active)
    Jul 17 13:00:44 localhost postfix/smtp[16365]: 5743F100805: to=<{※メールアカウント}>, relay=XXX.XXX.XX.XX[{※自社メールサーバのホスト名やIP}]:587, delay=0.91, delays=0.02/0.03/0.53/0.33, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as C4B232B204F2)
    Jul 17 13:00:44 localhost postfix/qmgr[16357]: 5743F100805: removed
    
    ▼直接インターネットに送る場合
    Jul 17 13:04:02 localhost postfix/pickup[16482]: 8B96C100805: uid=0 from=<root>
    Jul 17 13:04:02 localhost postfix/cleanup[16489]: 8B96C100805: message-id=<20180717040402.8B96C100805@localhost.localdomain>
    Jul 17 13:04:02 localhost postfix/qmgr[16483]: 8B96C100805: from=<root@localhost.localdomain>, size=453, nrcpt=1 (queue active)
    Jul 17 13:04:03 localhost postfix/smtp[16491]: 8B96C100805: to=<{※メールアカウント}>, relay=YYY.YYY.YY.YY[YYY.YYY.YY.YY]:25, delay=1.1, delays=0.03/0/0.68/0.41, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 41V68z21yMz35B)
    Jul 17 13:04:03 localhost postfix/qmgr[16483]: 8B96C100805: removed
    

    SMTPAUTHを使うか直接送るかでヘッダーの内容が異なります

    ▼自社のメールを経由する場合
    Return-Path: <{※メールアカウント}>
    X-Original-To: {※メールアカウント}
    Delivered-To: {※メールアカウント}
    Received: from localhost.localdomain (unknown [ZZZ.ZZZ.ZZ.ZZ])
    by XXX.XXX.XX.XX (Postfix) with ESMTPSA id C4B232B204F2
    for <{※メールアカウント}>; Tue, 17 Jul 2018 13:00:43 +0900 (JST)
    Received: by localhost.localdomain (Postfix, from userid 0)
    id 5743F100805; Tue, 17 Jul 2018 13:00:43 +0900 (JST)
    Date: Tue, 17 Jul 2018 13:00:43 +0900
    To: {※メールアカウント}
    Subject: testmail
    User-Agent: Heirloom mailx 12.4 7/29/08
    MIME-Version: 1.0
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7bit
    Message-Id: <20180717040043.5743F100805@localhost.localdomain>
    From: {※メールアカウント} (root)
    testmail
    
    ▼直接インターネットに送る場合
    Return-Path: <root@localhost.localdomain>
    X-Original-To: {※メールアカウント}
    Delivered-To: {※メールアカウント}
    X-No-Auth: unauthenticated sender
    Received: from YYY.YYY.YY.YY (YYY.YYY.YY.YY [YYY.YYY.YY.YY])
    by XXX.XXX.XX.XX (Postfix) with ESMTP id A4E802B204F2
    for <{※メールアカウント}>; Tue, 17 Jul 2018 13:04:04 +0900 (JST)
    Received: from localhost.localdomain (unknown [ZZZ.ZZZ.ZZ.ZZ])
    by YYY.YYY.YY.YY (MTA) with ESMTP id 41V68z21yMz35B
    for <{※メールアカウント}>; Tue, 17 Jul 2018 13:04:03 +0900 (JST)
    Received: by localhost.localdomain (Postfix, from userid 0)
    id 8B96C100805; Tue, 17 Jul 2018 13:04:02 +0900 (JST)
    Date: Tue, 17 Jul 2018 13:04:02 +0900
    To: {※メールアカウント}
    Subject: testmail
    User-Agent: Heirloom mailx 12.4 7/29/08
    MIME-Version: 1.0
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7bit
    Message-Id: <20180717040402.8B96C100805@localhost.localdomain>
    From: root@localhost.localdomain (root)
    testmail
    

    以上、SPFレコード制限回避のために自分のアカウントを使って自社のメールサーバなどから
    メールを送信する方法の紹介でした。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA