サーバのローカルから、クラウド/ISPのSMTPリレーサーバを中継してインターネット上の宛先メールサーバにメールを送信するためのPostfixの設定を説明します。本記事では設定例としてSMTPリレーサーバにGoogle Gmailを使用します。

本設定を適用するケースは、ISP回線でインターネットに接続している拠点のサーバから、インターネット上に公開されているメールサーバ宛にメールを送信する環境を想定します。ISPでは、一般的にOP25PによるTCP/25ポート宛通信の制限が行われているため、宛先メールアドレスを管理するメールサーバへ直接SMTP接続を行うことができません。

参考1: OP25B(Outbound Port 25 Blocking)とは

そこで、クラウドサービスやISPサービスにアカウントを作成すると払い出されるメールアカウントを使用して、ローカルから同サービスのSMTPリレーサーバを中継し、外部へメール送信をできるようにします。イメージとしては、普段PCからメールを送信するときに使用するメールクライアントソフトがPostfixに置き換わった形です。

参考2(Gmail): プリンタ、スキャナ、アプリからのメール送信
参考3(OCN): OCNメールの仕様

前提条件

  • 基本設定が完了している状態から設定を行います。
  • 作業は、root権限を持つユーザで実施します。
  • RHEL 7 / RHEL 8 / CentOS 7 /CentOS 8で手順は共通です。
  • 設定対象のサーバは、インターネットに公開されているドメインの名前解決ができる必要があります。
  • 事前にGoogleアカウントを作成しておきます。
  • Googleアカウント設定で、SMTP認証用のアプリパスワードを発行しておきます。(アプリ パスワードでログイン)
  • OSおよびPostfixは、以下のバージョンで検証しています。
# cat /etc/redhat-release 
CentOS Linux release 8.0.1905 (Core) 
# uname -r
4.18.0-80.el8.x86_64
# postconf mail_version
mail_version = 3.3.1

機能要件

本設定で実現する機能は以下の通りです。

  • メール受信
    • 外部からのメールの受信は全て拒否する
    • ローカルからのメール受信、sendmailコマンドによるメール投函を受け付ける
  • メールボックス
    • ローカルメールボックスにメールを保持しない
  • メール配送
    • ローカルユーザ宛のメールは、別途用意しているシステム管理用メールアドレスに転送する
    • 送信元メールアドレスをGmailアカウントのメールアドレスに書き換える
    • 送信メールは直接外部配送せず、一律GmailのSMTPリレーサーバへリレー配送する
    • SMTPリレーサーバとの接続時、SMTP認証を行う
    • SMTPリレーサーバとの通信は、STARTTLSで暗号化を行う

事前作業

設定ファイルのバックアップ

以下のコマンドを実行し、変更前の設定ファイルをバックアップします。

# cp /etc/postfix/main.cf{,.`date +%Y%m%d`}

設定手順

SASL関連パッケージのインストール

SMTP認証を使用するため、SASL関連のパッケージをインストールします。

# CentOS 7の場合
# yum install -y cyrus-sasl-plain

# CentOS 8の場合
# dnf install -y cyrus-sasl-plain

外部配送を許可する送信元ネットワークの設定

メール配送を許可する送信元ネットワークをループバックアドレスに限定し、オープンリレーを防止します。

# postconf -e 'mynetworks = 127.0.0.0/8'

送信元メールアドレスの書き換え設定

書き換え対象のメールアドレスと、書き換え後のメールアドレスの情報を記した検索テーブルファイルを作成します。viなどのテキストエディタで、以下のファイルを作成します。

# vi /etc/postfix/sender_maps

入力内容は以下の通りです。正規表現を使用して、全ての送信元メールアドレスを指定したメールアドレスに書き換えます。<送信元メールアドレス>は、Gmailアカウントのメールアドレスを指定してください。

/^.*$/ <送信元メールアドレス>

作成した検索テーブルファイルの場所を、Postfixのパラメータに指定します。

# postconf -e 'sender_canonical_maps = regexp:/etc/postfix/sender_maps'

ローカルユーザ宛メールのエイリアス設定

ローカル配送対象のメールを、別途用意しているシステム管理用メールアドレスに変換します。
viなどのテキストエディタで、エイリアスの設定ファイルを開きます。

# vi /etc/aliases

エイリアスのデフォルト設定では、全てのローカルユーザ宛のメールの宛先はrootに変換されます。
今回は、root宛のメールをさらにシステム管理用メールアドレスに変換します。
ファイルの末尾に、以下を追記します。<管理用メールアドレス>は実際のメールアドレスに置き換えてください。

root:           <管理用メールアドレス>

以下のコマンドを実行し、編集したエイリアス設定を反映します。

# newaliases

リレー先サーバの設定

送信メールのリレー先サーバを指定します。STARTTLSによる暗号化を行うので、ポート番号は587を指定します。
設定例では、GmailのSMTPリレーサーバ(smtp.gmail.com)を指定しています。

# postconf -e "relayhost = [smtp.gmail.com]:587"

SMTP認証の設定

GmailのSMTPリレーサーバ向けの認証情報を記した検索テーブルファイルを作成します。viなどのテキストエディタで、以下のファイルを作成します。

# vi /etc/postfix/sasl_passwd

入力内容は以下の通りです。<ユーザ名><パスワード>には、各クラウド/ISP事業者から払い出されたSMTPアカウント情報を入力します。Google Gmailの場合は、以下を入力します。

  • <ユーザ名>: Gmailメールアドレス
  • <パスワード>: アプリパスワード
[smtp.gmail.com]:587 <ユーザ名>:<パスワード> 

上記ファイルのハッシュマップDBを作成します。

# postmap hash:/etc/postfix/sasl_passwd

作成したファイルは一般ユーザがアクセスできないように、ファイルの所有権とアクセス権を変更します。

# chown root:root /etc/postfix/sasl_passwd{,.db}
# chmod 600 /etc/postfix/sasl_passwd{,.db}

PostfixのパラメータにSMTP認証関連の設定を行います。
smtp_sasl_auth_enableの行は、smtp配送エージェントでSASLによるSMTP認証を有効化する設定です。
smtp_sasl_security_optionsの行は、SMTP認証における匿名認証を許可しない設定です。
smtp_sasl_password_mapsの行は、SMTP認証情報の検索テーブルファイルの場所を指定する設定です。

# postconf -e 'smtp_sasl_auth_enable = yes' \
'smtp_sasl_security_options = noanonymous' \
'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'

STARTTLSの設定

リレー配送通信暗号化のためのSTARTTLSパラメータを設定します。
smtp_use_tlsの行は、smtp配送エージェントでTLSによる暗号化を有効化します。
smtp_tls_loglevelの行は、TLSに関するログ出力を有効化するための設定です。
smtp_tls_security_levelの行は、暗号化を強制する設定です。
smtp_tls_note_starttls_offerの行は、STARTTLSと初回接続する際にリモートサーバ名をログに記録する設定です。
smtp_tls_CAfileの行は、クライアント証明書を発行した認証局証明書ファイルの場所の設定です。

# postconf -e 'smtp_use_tls = yes' \
'smtp_tls_loglevel = 1' \
'smtp_tls_security_level = encrypt' \
'smtp_tls_note_starttls_offer = yes' \
'smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt'

設定内容の確認

main.cf

以下のコマンドを実行し、事前にバックアップを取得しておいた初期設定ファイルと、現行の設定ファイルの差分を比較します。
各行>に続けて設定した内容が差分として表示されていることを確認します。
※RHEL 8 / CentOS 8では、TLS関連のパラメータが初期設定に含まれているため、一部差分が表示されません。

# diff /etc/postfix/main.cf{.`date +%Y%m%d`,}
736c736
< smtp_tls_security_level = may
---
> smtp_tls_security_level = encrypt
738a739,747
> mynetworks = 127.0.0.0/8
> sender_canonical_maps = regexp:/etc/postfix/sender_maps
> relayhost = [smtp.gmail.com]:587
> smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
> smtp_sasl_security_options = noanonymous
> smtp_sasl_auth_enable = yes
> smtp_tls_note_starttls_offer = yes
> smtp_use_tls = yes
> smtp_tls_loglevel = 1

以下のコマンドを実行し、設定ファイルの文法に問題がないか確認します。
文法が正しければ、コマンド実行結果は何も表示されません。

# postfix check

設定の反映

以下のコマンドを実行し、postfixサービスを再起動して設定を反映します。

# systemctl restart postfix

以下のコマンドを実行し、postfixサービスが起動状態であることを確認します。
Active:の列にactive (running)が表示されていれば、サービスは起動中です。

# systemctl status --no-pager postfix.service
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2019-11-13 18:08:12 JST; 5s ago
(略)

以上で設定は完了です。