88
79

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2019-02-13

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

Postfix とは

Postfix は SMTP サーバーであり、いわゆるメール送信サーバーに当たる。また MTA (Mail Transfer Agent) であり、 MTA 間のメール受信も行う。

他の MTA に Debian で採用されている Exim などがある。古くは sendmailqmail があるが、いずれも近年の更新はない。

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

RHEL 8 で Postfix 3.3 が採用され、最新の RHEL 8 の BaseOS リポジトリおよび RHEL 9 の AppStream リポジトリでは Postfix 3.5 のパッケージが提供されている。

2023年12月時点の使用ソフトウェアを識別可能な48万台弱の MX サーバーの内、 Exim の56%に次いで Postfix は37%のシェアを占める。3位は Sendmail の3.5%で、Exim と Postfix だけでシェアの94%弱を占める。 1

リファレンス

DNS の設定

mail.example.jp.        IN      A               192.0.2.1
example.jp.             IN      MX      10      mail.example.jp

DNS の A レコードにメールサーバーの IP アドレスを、 MX レコードに FQDN を登録する。

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番ポートを開放できる。 2 3

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

設定パラメーター

myhostname

myhostname = mail.example.jp

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

mydomain

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

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

myorigin

myorigin = $mydomain

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

inet_interfaces

inet_interfaces = all

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

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

mydestination

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

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

home_mailbox

home_mailbox = Maildir/

home_mailbox はメールボックスファイルの local(8) ユーザーのホームディレクトリからの相対パス名。 30
デフォルト値は空で、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 シェルを指定するとユーザーはシェルにログインできなくなる。 31

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

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

SMTP サーバー接続確認

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

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

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

メール送信テスト

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

メール送信には Postfix に含まれる sendmail コマンドが利用できる。 38
-bv オプションはメッセージを送信せずに受信者アドレスを検証した後でレポートを出力する。 39
ログのフォローは 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. Mail (MX) Server Survey - www.securityspace.com

  2. 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 - firewalld.org

  3. 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 - firewalld.org

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

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

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

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

  8. SMTP サーバーの FQDN を指定します。基本的な SMTP サーバーの設定 - www.turbolinux.co.jp

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

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

  11. デフォルトの設定は、myhostname で指定したホスト名から最初のピリオドまでを引いたものになります。基本的な SMTP サーバーの設定 - www.turbolinux.co.jp

  12. ドメイン名で、ローカルで投函されたメールはそこから来たように見え、またローカルで投かんされたメールはそこに配送されます。Postfix設定パラメータ - www.postfix-jp.info

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

  14. サーバー上から直接メールをローカル配信した場合に、自動的に補われるドメイン名を指定します。基本的な SMTP サーバーの設定 - www.turbolinux.co.jp

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

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

  17. リモートからの SMTP 接続要求に応答するネットワークインターフェースのアドレスを指定します。基本的な SMTP サーバーの設定 - www.turbolinux.co.jp

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

  19. ローカルホストからの要求にのみ応答するように初期設定されていますので、デフォルトでは、この SMTPサーバー宛てのメールを受信することはできません。基本的な SMTP サーバーの設定 - www.turbolinux.co.jp

  20. 他のホストからのメールを受信するには、この SMTP サーバーがメールを受信するネットワークインターフェースを指定する必要があります。通常は、全てのインターフェースを対象とするため ALL を指定します。基本的な SMTP サーバーの設定 - www.turbolinux.co.jp

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

  22. $local_transport メール配送 transport を使って配送されるドメインのリスト。Postfix設定パラメータ - www.postfix-jp.info

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

  24. この SMTP サーバーが受信するドメイン名をリストします。基本的な SMTP サーバーの設定 - www.turbolinux.co.jp

  25. SMTPサーバは受信者アドレスを $local_recipient_maps で確認し、存在しない受信者を拒否します。Postfix設定パラメータ - www.postfix-jp.info

  26. デフォルトでは、Postfix SMTPサーバは local_recipient_maps パラメータにリストアップされていない受信者宛のメールを拒否します。Postfix設定パラメータ - www.postfix-jp.info

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

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

  29. 注意: メール配送ループを避けるため、$myhostnamelocalhost.$mydomain を含む、このマシンの 全てのホスト名をリストアップしなければいけません。Postfix 基本設定 - www.postfix-jp.info

  30. オプションのメールボックスファイルの local(8) ユーザのホームディレクトリからの相対パス名。Postfix設定パラメータ - www.postfix-jp.info

  31. -s, --shell SHELL The name of the user's login shell.useradd(8) - Linux man page - linux.die.net

  32. -p, --password PASSWORD The encrypted password, as returned by crypt(3).useradd(8) - Linux man page - linux.die.net

  33. 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 - linux.die.net

  34. 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 - access.redhat.com

  35. Telnet を使用すると、パスワードはプレーンテキストで送信されます。そのためデフォルトでは root ユーザーが Telnet を使用して接続することは許可されません。Telnet サービスを有効にする - Red Hat Customer Portal - access.redhat.com

  36. 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 - curl.se

  37. 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 - curl.se

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

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

88
79
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
88
79

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?