Help us understand the problem. What is going on with this article?

CentOS 7 の Postfix で独自ドメインの設定

CentOS 7 の Postfix で独自ドメインのメールを送受信できるようにする最低限の設定についての解説。
不必要で過剰な設定は排除し、何が必要な設定項目なのかを理解、把握する。

Postfix とは


Postfix は SMTP サーバーであり、いわゆるメール送信サーバーに当たる。MTA (Mail Transfer Agent) であり、 MTA 間のメール受信も行う。
他の MTA に Debian で採用されている Exim などがある。古くは sendmailqmail があるが、いずれも近年の更新はない。

CentOS 7 のデフォルトで標準リポジトリの Postfix 2.10.1 がインストールされている。
GhettoForge リポジトリの postfix3 パッケージを利用すると 3.2.4 が、Ghettoforge Testing リポジトリを利用すると 3.3.1 がインストールできる。

RHEL 8 では Postfix 3.3 が採用された。

SecuritySpace.comMail (MX) Server Survey (February 1st, 2019) の調査によると、91万台の MX サーバーの内 Exim の57%に次いで Postfix は34%のシェアを占める。

リファレンス

DNS の設定

example.jp.          IN      MX 10          mail.example.jp.

DNS の MX レコードに mail.example.jp を登録する。

firewalld の設定

firewall-cmd --list-services && \
firewall-cmd --add-service=smtp --permanent && \
firewall-cmd --reload && \
firewall-cmd --list-services

SMTP では25番ポートを利用して通信を行うため解放する必要がある。
firewall-cmd コマンドの --add-service オプションでサービス名に smtp を指定すると25番ポートを開放できる。 1 2

Postfix の基本設定

以下のコマンドは CentOS 7 において、メール送信サーバー mail.example.jp およびメールアドレス test@example.jp が設定されるために必要な最低限の内容。

記事によっては余計なパラメーターを指定をしていることが多いが、デフォルト値を再指定していたり必要のない項目を設定している場合がある。

DOMAIN=example.jp && \
postconf | egrep "^(home_mailbox|inet_interfaces|my(destination|domain|hostname|origin)) " && \
sed -i.org \
    -e "/#myhostname = virtual.domain.tld/a myhostname = mail.${DOMAIN}" \
    -e '/#myorigin = $mydomain/ s/^#//' \
    -e '/^inet_interfaces/ s/^/#/' \
    -e '/^mydestination/ s/^/#/' \
    -e '/#mydestination .* $mydomain$/ s/^#//' \
    -e '|#home_mailbox = Maildir/$| s|^#||' \
    /etc/postfix/main.cf && \
cat << _EOF_ >> /etc/postfix/main.cf
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1
_EOF_
postfix check && \
postfix -vv && \
postfix reload && \
postconf | egrep "^(home_mailbox|inet_interfaces|my(destination|domain|hostname|origin)) "

postconf コマンドは設定パラメーターの現在値を出力できる。 3
postfix check コマンドは不正なディレクトリ/ファイルの所有権やパーミションを警告し、見つからないディレクトリを作成する。ほぼ必ず文法チェックと紹介されているが誤り。 4
postfix reload コマンドは設定ファイルを再び読み込む。動作中のプロセスは早期の適切な時に停止が許される。 5

配信中のメールの暗号化 – Google 透明性レポート
送受信時のメールの暗号化 - Gmail ヘルプ
Gmail のメールが認証されているかどうかの確認 - パソコン - Gmail ヘルプ

設定パラメーター

myhostname

myhostname = mail.example.jp

myhostname はこのメールシステムのホスト名。6
SMTP サーバーの FQDN を指定する。 7
デフォルトでは gethostname() から得た FQDN を使うため、Web サーバーと兼用する場合など OS のホスト名(hostname コマンドで確認できる)と一致しない際は設定が必要。 8
いわゆる「メール送信サーバー」のアドレスになる。

mydomain

mydomain はこのメールシステムのドメイン名。デフォルトでは未指定で、 $myhostname から最初の要素(最初のピリオドまで)を引いたものを使う。 9 10

例えば myhostname = mail.example.jp の場合、mydomain が未指定であれば $mydomain$myhostname から mail. を引いた example.jp になる。
従って、$myhostname にサブドメインを適切に指定している場合は mydomain の設定は不要

myorigin

myorigin = $mydomain

myorigin はローカルで投函されたメールがどのドメインから来るように見えるかを指定する。 11 12
サーバー上から直接メールをローカル配信した場合に自動的に補われるドメイン名を指定する。 13
送信者と受信者アドレスの一貫性を保つために、修飾されていない受信者アドレスに付けられるドメイン名も指定する。 14
デフォルト値は $myhostname になっている。
いわゆるメールアドレスの @ の後ろの文字列になる。
前述の例では、デフォルト値が $myhostname なのでメールアドレスは @mail.example.jp になるが、 $mydomain を指定することで @example.jp にすることができる。

inet_interfaces

inet_interfaces = all

inet_interfaces はメールを受け取るネットワークインターフェイスアドレス。 15
リモートからの SMTP 接続要求に応答するネットワークインターフェースのアドレスを指定する。 16
Postfix のデフォルト値は all だが CentOS のデフォルト設定値は localhost になっているため、すべてのネットワークインターフェースでメールを受信するには CentOS のデフォルト設定をコメントアウトして、デフォルト値の all を有効にする必要がある。 17 18 19

このパラメータを変更したら Postfix を stop して start する必要がある。 20
検証した限りでは postfix reload で反映される。

mydestination

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

mydestination$local_transport メール配送トランスポートを介して配信されるドメインの一覧。 21
このマシンが他のマシンに転送せずにローカルに配送するドメインを指定する。 22
この SMTP サーバーが受信するドメイン名。 23
$local_recipient_maps にリストアップされていない受信者宛のメールを拒否する。 24 25
デフォルト値は $myhostname, localhost.$mydomain, localhost になっており、メール配送ループを避けるために $mydomain を含める必要がある。 26 27 28

home_mailbox

home_mailbox = Maildir/

home_mailbox はメールボックスファイルの local(8) ユーザーのホームディレクトリからの相対パス名。 29
デフォルト値は空で、mailbox 形式で /var/spool/mail/<username> がデフォルトメールボックスファイルになる。
なお、少なくとも CentOS 7 では /var/mail/var/spool/mail にシンボリックリンクが張られている。

Maildir/ を指定すると qmail-style delivery になり、デフォルトと異なりメールごとにファイルが生成される。
qmail-style delivery の方が新しい方式であり、管理上こちらに変更するのが望ましい。

smtp_tls_CAfile

smtp_tls_CAfile = /etc/pki/tls/cert.pem

smtp_tls_security_level

smtp_tls_security_level = may

smtp_tls_loglevel

smtp_tls_loglevel = 1

メールアドレスの作成

useradd test --shell /sbin/nologin --password $(openssl passwd -1 P@ssw0rd) --comment 'mail user'

useradd コマンドでユーザーを作成すればメールが受信可能になる。すなわちメールアドレスが作成される。

前述の例では test@example.jp が受信可能となる。

--shell または -s オプションで /sbin/nologin シェルを指定するとユーザーはシェルにログインできなくなる。 30

--password または -p オプションで、暗号化されたパスワードを指定すると対話式でパスワードを指定する必要がなくなる。プロセスや履歴で参照できるので注意。 31 32

/etc/skel/Maildir/{new,cur,tmp} ディレクトリの作成を指示する記事が散見されるが、メール受信時にユーザーディレクトリ配下に自動的に作成されるので一切不要。

SMTP サーバー接続確認

curl --verbose telnet://mail.example.jp:25
QUIT

telnet コマンドは標準インストールされていないので、代替として curl コマンドを使用する。 33 34 35

--verbose または -v オプションを指定すると、行頭に * が付いた補足情報が出力される。 36

メール送信テスト

echo "test mail" | sendmail -bv test@example.jp && tailf /var/log/maillog
cat /home/test/Maildir/new/*

メール送信には Postfix に含まれる sendmail コマンドが利用できる。 37
-bv オプションはメッセージを送信せずに受信者アドレスを検証した後でレポートを出力する。 38
ログのフォローは Ctrl + c で中断できる。

http://d.hatena.ne.jp/heihoo/20101208/p1
https://s.webry.info/sp/vogel.at.webry.info/201307/article_8.html
https://hacknote.jp/archives/26115/
http://next.matrix.jp/20130710.html
https://oxynotes.com/?p=4646
https://www.qoosky.io/techs/b2e869356c


  1. "Add a service for zone. If zone is omitted, default zone will be used. This option can be specified multiple times." - Documentation - Manual Pages - firewall-cmd | firewalld 

  2. "The service is one of the firewalld provided services. To get a list of the supported services, use firewall-cmd --get-services." - Documentation - Manual Pages - firewall-cmd | firewalld 

  3. "postconf(1) コマンドは設定パラメータの現在の値を表示したり、設定パラメータの値を変更したり、Postfix メールシステムに関するその他の設定情報を表示します。" - Postfix manual - postconf(1) 

  4. "check 不正なディレクトリ/ファイルの所有権やパーミションを警告し、見つからないディレクトリを作成します。" - Postfix manual - postfix(1) 

  5. "reload 設定ファイルを再び読み込みます。動作中のプロセスは早期の適切な時に停止が許されます。" - Postfix manual - postfix(1) 

  6. "このメールシステムのインターネットホスト名。" - myhostname - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  7. "SMTP サーバーの FQDN を指定します。" - myhostname - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド 

  8. "デフォルトでは gethostname() から得た完全修飾ドメイン名を使います。" - myhostname - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  9. "このメールシステムのインターネットドメイン名。デフォルトでは $myhostname から最初の要素を引いたものを使います。" - mydomain- Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  10. "デフォルトの設定は、myhostname で指定したホスト名から最初のピリオドまでを引いたものになります。" - mydomain - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド 

  11. "ドメイン名で、ローカルで投函されたメールはそこから来たように見え、またローカルで投かんされたメールはそこに配送されます。" - myorigin - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  12. "myorigin パラメータにはローカルで投函されたメールがどのドメインから来るように見えるかを指定します。" - 外行きのメールに使うドメイン名 - Postfix 基本設定 

  13. "サーバー上から直接メールをローカル配信した場合に、自動的に補われるドメイン名を指定します。" - myorigin - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド 

  14. "送信者と受信者アドレスの一貫性を保つため、 myorigin は修飾されていない受信者アドレスに付けられるドメイン名も指定します。" - 外行きのメールに使うドメイン名 - Postfix 基本設定 

  15. "このメールシステムがメールを受け取るネットワークインターフェースアドレス。" - inet_interfaces - Postfix設定パラメータ 

  16. "リモートからの SMTP 接続要求に応答するネットワークインターフェースのアドレスを指定します。" - inet_interfaces - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド 

  17. "すべてのネットワークインターフェースでメールを受信するには "all" を指定します (デフォルト)。" - inet_interfaces - Postfix設定パラメータ 

  18. "ローカルホストからの要求にのみ応答するように初期設定されていますので、デフォルトでは、この SMTPサーバー宛てのメールを受信することはできません。" - inet_interfaces - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド 

  19. "他のホストからのメールを受信するには、この SMTP サーバーがメールを受信するネットワークインターフェースを指定する必要があります。通常は、全てのインターフェースを対象とするため ALL を指定します。" - inet_interfaces - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド 

  20. "注意1: このパラメータを変更したらPostfixを stop してから start する必要があります。" - inet_interfaces - Postfix設定パラメータ 

  21. "$local_transport メール配送 transport を使って配送されるドメインのリスト。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  22. "mydestination パラメータには、 このマシンが他のマシンに転送せずにローカルに配送するドメインを指定します。 デフォルトではマシン自身に対するメールを受け取ります。" - 受け取るべきメールのドメイン - Postfix 基本設定 

  23. "この SMTP サーバーが受信するドメイン名をリストします。" - mydestination - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド 

  24. "SMTPサーバは受信者アドレスを $local_recipient_maps で確認し、存在しない受信者を拒否します。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  25. "デフォルトでは、Postfix SMTPサーバは local_recipient_maps パラメータにリストアップされていない受信者宛のメールを拒否します。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  26. "デフォルトの mydestination 値はローカルマシンの名前だけを指定しています。メールドメインゲートウェイ上では、$mydomain も含むべきでしょう。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  27. "マシンがドメイン全体に対するメールサーバの場合、 $mydomain もリストアップしなければいけません。" - 受け取るべきメールのドメイン - Postfix 基本設定 

  28. "注意: メール配送ループを避けるため、 $myhostname や localhost.$mydomain を含む、このマシンの 全てのホスト名をリストアップしなければいけません。" - 受け取るべきメールのドメイン - Postfix 基本設定 

  29. "オプションのメールボックスファイルの local(8) ユーザのホームディレクトリからの相対パス名。" - home_mailbox - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ 

  30. "-s, --shell SHELL The name of the user's login shell." - useradd(8) - Linux man page 

  31. "-p, --password PASSWORD The encrypted password, as returned by crypt(3)." - useradd(8) - Linux man page 

  32. "Note: This option is not recommended because the password (or encrypted password) will be visible by users listing the processes." - useradd(8) - Linux man page 

  33. "Telnet is a popular protocol for logging in to remote systems over the Internet. The telnet service is disabled by default." - 4.186. telnet Red Hat Enterprise Linux 5 | Red Hat Customer Portal 

  34. "デフォルトでは root ユーザーが Telnet を使用して接続することは許可されません。" - Telnet サービスを有効にする - Red Hat Customer Portal 

  35. "curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP)." - curl - How To Use 

  36. "Makes curl verbose during the operation. Useful for debugging and seeing what's going on "under the hood". A line starting with '>' means "header data" sent by curl, '<' means "header data" received by curl that is hidden in normal cases, and a line starting with '*' means additional info provided by curl." - curl - How To Use 

  37. "Postfix sendmail(1) コマンドは Postfix に Sendmail 互換インターフェースを提供します。" - Postfix manual - sendmail(1) 

  38. "-bv メッセージを集めたり配送しません。代わりに受信者アドレスを検証した後でレポートをEメールで送ります。これはアドレス書き換えやルーティング設定のテストに便利です。" - Postfix manual - sendmail(1) 

bezeklik
サーバー管理、CMS構築のお仕事募集中。 CentOS / Apache / Nginx / PHP / MySQL / Docker / CMS (eZ Platform, eZ Publish, WordPress, Drupal) / Redmine
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした