CentOS 7 の Postfix で独自ドメインのメールを送受信できるようにする必要最低限の設定についての解説。
巷の解説に多い過剰で不必要な設定を排除し、本当に必要な設定項目は何なのかを理解、把握する。
Postfix とは
Postfix は SMTP サーバーであり、いわゆるメール送信サーバーに当たる。また MTA (Mail Transfer Agent) であり、 MTA 間のメール受信も行う。
他の MTA に Debian で採用されている Exim などがある。古くは sendmail や qmail があるが、いずれも近年の更新はない。
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
リファレンス
- Postfix Basic Configuration - 公式の基本設定のリファレンス。
- Postfix 基本設定 - 上記の日本語訳。ただし翻訳元のバージョンは 2.3 で、CentOS 7 の Postfix は 2.10 なのでバージョン違いに注意。
- Postfix Configuration Parameters - 公式の設定パラメーターのリファレンス。
- Postfix 設定パラメータ - 前述の基本設定と同様。
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
-
Mail (MX) Server Survey - www.securityspace.com ↩
-
Add a service for
Documentation - Manual Pages - firewall-cmd | firewalld - firewalld.org ↩zone
. If zone is omitted, default zone will be used. This option can be specified multiple times. -
The service is one of the firewalld provided services. To get a list of the supported services, use
Documentation - Manual Pages - firewall-cmd | firewalld - firewalld.org ↩firewall-cmd --get-services
. -
Postfix manual - postconf(1) - www.postfix-jp.info ↩postconf
(1) コマンドは設定パラメータの現在の値を表示したり、設定パラメータの値を変更したり、Postfix メールシステムに関するその他の設定情報を表示します。 -
Postfix manual - postfix(1) - www.postfix-jp.info ↩check
不正なディレクトリ/ファイルの所有権やパーミションを警告し、見つからないディレクトリを作成します。 -
Postfix manual - postfix(1) - www.postfix-jp.info ↩reload
設定ファイルを再び読み込みます。動作中のプロセスは早期の適切な時に停止が許されます。 -
このメールシステムのインターネットホスト名。
myhostname - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ - www.postfix-jp.info ↩ -
SMTP サーバーの FQDN を指定します。
基本的な SMTP サーバーの設定 - www.turbolinux.co.jp ↩ -
デフォルトでは
myhostname - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ - www.postfix-jp.info ↩gethostname()
から得た完全修飾ドメイン名を使います。 -
このメールシステムのインターネットドメイン名。デフォルトでは
Postfix設定パラメータ ↩$myhostname
から最初の要素を引いたものを使います。 -
デフォルトの設定は、
基本的な SMTP サーバーの設定 - www.turbolinux.co.jp ↩myhostname
で指定したホスト名から最初のピリオドまでを引いたものになります。 -
ドメイン名で、ローカルで投函されたメールはそこから来たように見え、またローカルで投かんされたメールはそこに配送されます。
Postfix設定パラメータ - www.postfix-jp.info ↩ -
外行きのメールに使うドメイン名 - Postfix 基本設定 - www.postfix-jp.info ↩myorigin
パラメータにはローカルで投函されたメールがどのドメインから来るように見えるかを指定します。 -
サーバー上から直接メールをローカル配信した場合に、自動的に補われるドメイン名を指定します。
基本的な SMTP サーバーの設定 - www.turbolinux.co.jp ↩ -
送信者と受信者アドレスの一貫性を保つため、
外行きのメールに使うドメイン名 - Postfix 基本設定 - www.postfix-jp.info ↩myorigin
は修飾されていない受信者アドレスに付けられるドメイン名も指定します。 -
このメールシステムがメールを受け取るネットワークインターフェースアドレス。
inet_interfaces - Postfix設定パラメータ - www.postfix-jp.info ↩ -
リモートからの SMTP 接続要求に応答するネットワークインターフェースのアドレスを指定します。
基本的な SMTP サーバーの設定 - www.turbolinux.co.jp ↩ -
すべてのネットワークインターフェースでメールを受信するには
inet_interfaces - Postfix設定パラメータ - www.postfix-jp.info ↩"all"
を指定します (デフォルト)。 -
ローカルホストからの要求にのみ応答するように初期設定されていますので、デフォルトでは、この SMTPサーバー宛てのメールを受信することはできません。
基本的な SMTP サーバーの設定 - www.turbolinux.co.jp ↩ -
他のホストからのメールを受信するには、この SMTP サーバーがメールを受信するネットワークインターフェースを指定する必要があります。通常は、全てのインターフェースを対象とするため
基本的な SMTP サーバーの設定 - www.turbolinux.co.jp ↩ALL
を指定します。 -
注意1: このパラメータを変更したらPostfixを stop してから start する必要があります。
inet_interfaces - Postfix設定パラメータ - www.postfix-jp.info ↩ -
$local_transport メール配送 transport を使って配送されるドメインのリスト。
Postfix設定パラメータ - www.postfix-jp.info ↩ -
Postfix 基本設定 - www.postfix-jp.info ↩mydestination
パラメータには、 このマシンが他のマシンに転送せずにローカルに配送するドメインを指定します。 デフォルトではマシン自身に対するメールを受け取ります。 -
この SMTP サーバーが受信するドメイン名をリストします。
基本的な SMTP サーバーの設定 - www.turbolinux.co.jp ↩ -
SMTPサーバは受信者アドレスを
Postfix設定パラメータ - www.postfix-jp.info ↩$local_recipient_maps
で確認し、存在しない受信者を拒否します。 -
デフォルトでは、Postfix SMTPサーバは
Postfix設定パラメータ - www.postfix-jp.info ↩local_recipient_maps
パラメータにリストアップされていない受信者宛のメールを拒否します。 -
デフォルトの
Postfix設定パラメータ - www.postfix-jp.info ↩mydestination
値はローカルマシンの名前だけを指定しています。メールドメインゲートウェイ上では、$mydomain
も含むべきでしょう。 -
マシンがドメイン全体に対するメールサーバの場合、
Postfix 基本設定 - www.postfix-jp.info ↩$mydomain
もリストアップしなければいけません。 -
注意: メール配送ループを避けるため、
Postfix 基本設定 - www.postfix-jp.info ↩$myhostname
やlocalhost.$mydomain
を含む、このマシンの 全てのホスト名をリストアップしなければいけません。 -
オプションのメールボックスファイルの local(8) ユーザのホームディレクトリからの相対パス名。
Postfix設定パラメータ - www.postfix-jp.info ↩ -
useradd(8) - Linux man page - linux.die.net ↩-s
,--shell
SHELL
The name of the user's login shell. -
useradd(8) - Linux man page - linux.die.net ↩-p
,--password
PASSWORD
The encrypted password, as returned by crypt(3). -
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 ↩ -
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 ↩ -
Telnet を使用すると、パスワードはプレーンテキストで送信されます。そのためデフォルトでは root ユーザーが Telnet を使用して接続することは許可されません。
Telnet サービスを有効にする - Red Hat Customer Portal - access.redhat.com ↩ -
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 ↩ -
Makes curl verbose during the operation. Useful for debugging and seeing what's going on "under the hood". A line starting with '
curl - How To Use - curl.se ↩>
' 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. -
Postfix sendmail(1) コマンドは Postfix に Sendmail 互換インターフェースを提供します。
Postfix manual - sendmail(1) - www.postfix-jp.info ↩ -
Postfix manual - sendmail(1) - www.postfix-jp.info ↩-bv
メッセージを集めたり配送しません。代わりに受信者アドレスを検証した後でレポートをEメールで送ります。これはアドレス書き換えやルーティング設定のテストに便利です。