Edited at

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 が採用されているようなので、 postfix3 を試すのも良いかもしれない。

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 /etc/postfix/main.cf \
-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|^#||' && \
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


設定パラメーター


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 になるため、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 する必要がある。検証した限り postfix reload で反映される。20


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> がデフォルトメールボックスファイルになる。なお、/var/mail/var/spool/mail にシンボリックリンクが張られている。

Maildir/ を指定すると qmail-style delivery になり、デフォルトと異なりメールごとにファイルが生成される。


メールアドレスの作成

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

CentOS 7 から telnet コマンドは標準インストールされなくなったので、代替として curl コマンドを使用する。 33

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


メール送信テスト

echo "test mail" | sendmail -bv test@example.jp && tailf /var/log/maillog

cat /home/test/Maildir/new/*

メール送信には Postfix に含まれる sendmail コマンドが利用できる。 35

-bv オプションはメッセージを送信せずに受信者アドレスを検証した後でレポートを出力する。 36

ログのフォローは 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. "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 



  34. "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 



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



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