【Linux】 CentOS7環境で自宅メールサーバーの構築(Postfix と Dovecot と OP25B問題)

現在Rubyでプログラムを作っていて、プログラムとメールの連携をしたいので、この機会に自宅サーバーで以下の構成でメールサーバーを構築しました。

  • Postfix
  • Dovecot
  • SMTP AUTH(SMTP認証)
  • OP25B問題の対処
  • ブロードバンドルーターの設定
  • 無料DNS設定

その結果、GoogleのSMTPサーバー経由でインターネットにメールを送信することができるようになりました。

気が付いたらいつの間にかボリュームが大きくなってしまいました(笑)

もし自宅サーバーを構築していて、「メールサーバーも構築したい。自宅メールサーバーからOP25B問題を対処してインターネットにメールを送信したい。GoogleのSMTPを利用したい」と考えているなら、このページを見ればすべてが解決するはずです。

断片的な知識や情報ではなく通しで手順をまとめました。

また私が同じ環境を作る時に参考にしたいので細かく記録として残しておきます。




自宅サーバー環境

今回、こんな環境で構築しました。

■自宅サーバー

DellのノートPC(Vostro → Dellストアで4万円くらい)

※多分10年くらい前に買ったと思います。

普段、Linuxサーバー上で、RubyかPythonでプログラムを作っています。(業務ではなく趣味で)

今回はメール受信をトリガーとしてRubyプログラムを実行するために環境を構築します。

動作検証も兼ねている個人用のサーバーなので定期的に「yum update」で全体をアップデートしています。

■OS

CentOS 7.3

[root@centos7 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@centos7 ~]#

 

 

■ドメイン

MyDNS.JPで無料でドメイン登録しました。

※ここのサービスがなくなるとかなり痛いです。

http://www.mydns.jp/

ドメイン:xxxxx.dix.asia

MX:xxxxx.dix.asia

Aレコード:centos7

FQDN:centos7.xxxxx.dix.asia

 

■グローバルIP

1xx.99.xxx.14

↑確認くんで確認しました。

 

■ローカルIPアドレス

192.168.1.10

 

■自宅ブロードバンドルーター

ホームゲートウェイ/ひかり電話ルータ (PR-500MI)

自宅ブロードバンドルーターでNATの設定をしました。

試しに設定してみたこと

静的NAT設定

Webサーバーを外部に公開するIPアドレス

192.168.1.10

外部からのパケットをすべて特定ホストに中継する(簡易DMZ)IPアドレス

192.168.1.10

※この設定をするとサーバーがインターネットに晒されるので注意

■名前解決の確認

自宅サーバー上でhttpdを起動し、/var/www/htmlディレクトリに「test.txt」を配置。

外部のVPSサーバーより、インターネット経由で curlコマンドを実行し「curl http://xxxxx.dix.asia/test.txt」を実行して読めるか確認。

■経路

メール転送の経路は以下のようになっています。

自宅PC → 自宅メールサーバー → ブロードバンドルーター → GoogleのSMTPサーバー → インターネットへ

 

■普段使っているPC環境

自宅PCにThunderbird(無料)をインストールしました。

Thunderbirdの設定で「POP3サーバー」「SMTPサーバー」共に自宅サーバーを「メールサーバー」に設定しました。

POPメールサーバーの設定

上図の設定を見ていただければ分かりますが、メールサーバーは自宅にあるノートPCのIPアドレスを入れています。

セキュリティ設定は、

接続の保護:STARTTLS

認証方式:通常のパスワード認証

を選んでいます。

送信(SMTP)サーバーの設定

サーバ名:GmailのSTMPサーバー(smtp.googlemail.com)

ポート番号:587

セキュリティと認証

接続の保護:STARTTLS

認証方式:暗号化されたパスワード

「xxx@xxxxx.dix.asia」メールの送受信は自宅メールサーバー経由で実施しました。

そのままインターネットへは出ていけない、いわゆる「自宅サーバーのOP25B問題」のため、GoogleのSMTPサーバをメールリレーしてインターネットに送信するという構成を取りました。




「Postfix」とはメール送信用のプログラム

Postfixとは、メール送信用のプログラムです。

もっと詳しくいうと、MTA(メール転送エージェント)です。

http://www.postfix.org/

昔は「sendmail」がスタンダードでしたが、設定や管理が大変なので、今は設定や管理がシンプルになった「Postfix」がよく使われています。

※ちなみに「postfix」の意味は、”後置”とか”接尾辞”です。

CentOSをインストールすると、デフォルトでイントールされています。

つまり、CentOSの標準MTAとして採用されています。

「Dovecot」はメール受信用のプログラム

メール受信用のプログラムとして「Dovecot」を使います。

https://www.dovecot.org/

Dovecot(ダヴコットと読む)は標準ではインストールされていませんが、簡単に設定できて且つ管理も簡単なのでLinuxでメール受信サーバー(POPとかIMAPとか)でよく使われています。

※「Dovecot」の意味は、”ハト小屋”です。

メール送信用のプログラムとメール受信用のプログラムがある

普段あまり意識しないかもしれませんが、実は「メール送信用」のプログラムと「メール受信用」のプログラムがあります。

Linuxに関して言えば、「メール送信用」のプログラムと「メール受信用」のプログラムは別々で、標準と言っていいかもしれませんが、

メール送信用 Postfix

メール受信用 Dovecot

を使います。

今回も「Postfix」と「Dovecot」でメールサーバーを構築してみます。

Postfix&Dovevot&SASL(認証関連)のインストール

まずは必要なパッケージを全部インストールします。

$ sudo su - ←rootでの作業が多いため、最初からrootになっておく

$ yum install postfix dovecot mailx cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5  cyrus-sasl-lib.x86_64 cyrus-sasl.x86_64 cyrus-sasl-devel.x86_64 cyrus-sasl-plain cyrus-sasl-scram cyrus-sasl-gssapi telnet mailx ←最初に全部インストールしておく

 

postfix&Dovecot&SASL認証関連だけでなく、動作確認用にmailxやtelnetもインストールしておきます。

Postfix&Dovevot&SASL(認証関連)の設定

ここからいよいよ設定していきます。

1つ1つ設定しては動作確認、動作検証を繰り返していきます。

ちなみに確認するまでもないですが、現在この赤丸の自宅サーバーの設定をしています。

Postfixの設定

設定をする前に、まずはコンフィグファイルのバックアップを取ります。

(コンフィグのバックアップを取ることで、いろいろ設定をいじっていてエラーが出てどうにもならなくなった時に元に戻せます)

今回は特定のメールアドレスのみ受信する設定で他のメールアドレスは拒否する設定にします。

# cd /etc/postfix
# cp -ip main.cf main.cf_YYYYMMDD

 

バックアップを取ったらviコマンドで「/etc/postfix/main.cf」ファイルを編集する。

# vi main.cf ←viコマンドを実行する。
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
# other configuration parameters.
#
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = centos7.xxxxx.dix.asia ←メールサーバーのFQDNを指定。
# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
#mydomain = domain.tld
mydomain = xxxxxx.dix.asia ←今回、MyDNSで取得したドメイン名を指定する。
# SENDING MAIL
#
# The myorigin parameter specifies the domain that locally-posted
# mail appears to come from. The default is to append $myhostname,
# which is fine for small sites.  If you run a domain with multiple
# machines, you should (1) change this to $mydomain and (2) set up
# a domain-wide alias database that aliases each user to
# user@that.users.mailhost.
#
# For the sake of consistency between sender and recipient addresses,
# myorigin also specifies the default domain name that is appended
# to recipient addresses that have no @domain part.
#
#myorigin = $myhostname
#myorigin = $mydomain
myorigin = $mydomain 
↑メールアドレスの形式の指定。この場合、アカウントが apple01 だと、「apple01@xxxxxx.dix.asia」の形式になる。もし「$myhostname」だと「apple01@xxxxxx.dix.asia」になる。今回はテストなのでどっちでも良い。
# RECEIVING MAIL
# The inet_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on.  By default,
# the software claims all active interfaces on the machine. The
# parameter also controls delivery of mail to user@[ip.address].
#
# See also the proxy_interfaces parameter, for network addresses that
# are forwarded to us via a proxy or network address translator.
#
# Note: you need to stop/start Postfix when this parameter changes.
#
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = all ←利用するインターフェースを指定する。
# The mydestination parameter specifies the list of domains that this
# machine considers itself the final destination for.
#
# These domains are routed to the delivery agent specified with the
# local_transport parameter setting. By default, that is the UNIX
# compatible delivery agent that lookups all recipients in /etc/passwd
# and /etc/aliases or their equivalent.
#
# The default is $myhostname + localhost.$mydomain.  On a mail domain
# gateway, you should also include $mydomain.
#
# Do not specify the names of virtual domains - those domains are
# specified elsewhere (see VIRTUAL_README).
#
# Do not specify the names of domains that this machine is backup MX
# host for. Specify those names via the relay_domains settings for
# the SMTP server, or use permit_mx_backup if you are lazy (see
# STANDARD_CONFIGURATION_README).
#
# The local machine is always the final destination for mail addressed
# to user@[the.net.work.address] of an interface that the mail system
# receives mail on (see the inet_interfaces parameter).
#
# Specify a list of host or domain names, /file/name or type:table
# patterns, separated by commas and/or whitespace. A /file/name
# pattern is replaced by its contents; a type:table is matched when
# a name matches a lookup key (the right-hand side is ignored).
# Continue long lines by starting the next line with whitespace.
#
# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
#
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
↑どのドメイン宛のメールを受信するか指定する。今回は「xxxx@xxxxxx.dix.asia」宛のメールを受信するため「$mydomain」を追加する。
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#       mail.$mydomain, www.$mydomain, ftp.$mydomain
# DELIVERY TO MAILBOX
#
# The home_mailbox parameter specifies the optional pathname of a
# mailbox file relative to a user's home directory. The default
# mailbox file is /var/spool/mail/user or /var/mail/user.  Specify
# "Maildir/" for qmail-style delivery (the / is required).
#
#home_mailbox = Mailbox
#home_mailbox = Maildir/
home_mailbox = Maildir/
↑メールボックスの指定とメールボックスの場所の指定。今回のプログラムでは/Maildirでメール受信→Rubyプログラム実行の形式にするので「Maildir/」を指定する。

# The mail_spool_directory parameter specifies the directory where
# UNIX-style mailboxes are kept. The default setting depends on the
# system type.
#
#mail_spool_directory = /var/mail
#mail_spool_directory = /var/spool/mail

# The mailbox_command parameter specifies the optional external
# command to use instead of mailbox delivery. The command is run as
# the recipient with proper HOME, SHELL and LOGNAME environment settings.
# Exception:  delivery for root is done as $default_user.
#
# Other environment variables of interest: USER (recipient username),
# EXTENSION (address extension), DOMAIN (domain part of address),
# and LOCAL (the address localpart).
#
# Unlike other Postfix configuration parameters, the mailbox_command
# parameter is not subjected to $parameter substitutions. This is to
# make it easier to specify shell syntax (see example below).
#
# Avoid shell meta characters because they will force Postfix to run
# an expensive shell process. Procmail alone is expensive enough.
#
# IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN
# ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER.
#
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"

# The mailbox_transport specifies the optional transport in master.cf
# to use after processing aliases and .forward files. This parameter
# has precedence over the mailbox_command, fallback_transport and
# luser_relay parameters.
#
# Specify a string of the form transport:nexthop, where transport is
# the name of a mail delivery transport defined in master.cf.  The
# :nexthop part is optional. For more details see the sample transport
# configuration file.
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must update the "local_recipient_maps" setting in
# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
# Cyrus IMAP over LMTP. Specify ``lmtpunix      cmd="lmtpd"
# listen="/var/imap/socket/lmtp" prefork=0'' in cyrus.conf.
#mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp

# If using the cyrus-imapd IMAP server deliver local mail to the IMAP
# server using LMTP (Local Mail Transport Protocol), this is prefered
# over the older cyrus deliver program by setting the
# mailbox_transport as below:
#
# mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
#
# The efficiency of LMTP delivery for cyrus-imapd can be enhanced via
# these settings.
#
# local_destination_recipient_limit = 300
# local_destination_concurrency_limit = 5
#
# Of course you should adjust these settings as appropriate for the
# capacity of the hardware you are using. The recipient limit setting
# can be used to take advantage of the single instance message store
# capability of Cyrus. The concurrency limit can be used to control
# how many simultaneous LMTP sessions will be permitted to the Cyrus
# message store.
#
# Cyrus IMAP via command line. Uncomment the "cyrus...pipe" and
# subsequent line in master.cf.
#mailbox_transport = cyrus

# The fallback_transport specifies the optional transport in master.cf
# to use for recipients that are not found in the UNIX passwd database.
# This parameter has precedence over the luser_relay parameter.
#
# Specify a string of the form transport:nexthop, where transport is
# the name of a mail delivery transport defined in master.cf.  The
# :nexthop part is optional. For more details see the sample transport
# configuration file.
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must update the "local_recipient_maps" setting in
# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
#fallback_transport = lmtp:unix:/var/lib/imap/socket/lmtp
#fallback_transport =

# The luser_relay parameter specifies an optional destination address
# for unknown recipients.  By default, mail for unknown@$mydestination,
# unknown@[$inet_interfaces] or unknown@[$proxy_interfaces] is returned
# as undeliverable.
#
# The following expansions are done on luser_relay: $user (recipient
# username), $shell (recipient shell), $home (recipient home directory),
# $recipient (full recipient address), $extension (recipient address
# extension), $domain (recipient domain), $local (entire recipient
# localpart), $recipient_delimiter. Specify ${name?value} or
# ${name:value} to expand value only when $name does (does not) exist.
#
# luser_relay works only for the default Postfix local delivery agent.
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must specify "local_recipient_maps =" (i.e. empty) in
# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
#luser_relay = $user@other.host
#luser_relay = $local@other.host
#luser_relay = admin+$local

# JUNK MAIL CONTROLS
#
# The controls listed here are only a very small subset. The file
# SMTPD_ACCESS_README provides an overview.

# The header_checks parameter specifies an optional table with patterns
# that each logical message header is matched against, including
# headers that span multiple physical lines.
#
# By default, these patterns also apply to MIME headers and to the
# headers of attached messages. With older Postfix versions, MIME and
# attached message headers were treated as body text.
#
# For details, see "man header_checks".
#
#header_checks = regexp:/etc/postfix/header_checks

# FAST ETRN SERVICE
#
# Postfix maintains per-destination logfiles with information about
# deferred mail, so that mail can be flushed quickly with the SMTP
# "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld".
# See the ETRN_README document for a detailed description.
#
# The fast_flush_domains parameter controls what destinations are
# eligible for this service. By default, they are all domains that
# this server is willing to relay mail to.
#
#fast_flush_domains = $relay_domains

# SHOW SOFTWARE VERSION OR NOT
#
# The smtpd_banner parameter specifies the text that follows the 220
# code in the SMTP server's greeting banner. Some people like to see
# the mail version advertised. By default, Postfix shows no version.
#
# You MUST specify $myhostname at the start of the text. That is an
# RFC requirement. Postfix itself does not care.
#
#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

# PARALLEL DELIVERY TO THE SAME DESTINATION
#
# How many parallel deliveries to the same user or domain? With local
# delivery, it does not make sense to do massively parallel delivery
# to the same user, because mailbox updates must happen sequentially,
# and expensive pipelines in .forward files can cause disasters when
# too many are run at the same time. With SMTP deliveries, 10
# simultaneous connections to the same domain could be sufficient to
# raise eyebrows.
#
# Each message delivery transport has its XXX_destination_concurrency_limit
# parameter.  The default is $default_destination_concurrency_limit for
# most delivery transports. For the local delivery agent the default is 2.

#local_destination_concurrency_limit = 2
#default_destination_concurrency_limit = 20

# DEBUGGING CONTROL
#
# The debug_peer_level parameter specifies the increment in verbose
# logging level when an SMTP client or server host name or address
# matches a pattern in the debug_peer_list parameter.
#
debug_peer_level = 2

# The debug_peer_list parameter specifies an optional list of domain
# or network patterns, /file/name patterns or type:name tables. When
# an SMTP client or server host name or address matches a pattern,
# increase the verbose logging level by the amount specified in the
# debug_peer_level parameter.
#
#debug_peer_list = 127.0.0.1
#debug_peer_list = some.domain

# The debugger_command specifies the external command that is executed
# when a Postfix daemon program is run with the -D option.
#
# Use "command .. & sleep 5" so that the debugger can attach before
# the process marches on. If you use an X-based debugger, be sure to
# set up your XAUTHORITY environment variable before starting Postfix.
#
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5

# If you can't use X, use this to capture the call stack when a
# daemon crashes. The result is in a file in the configuration
# directory, and is named after the process name and the process ID.
#
# debugger_command =
#       PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;
#       echo where) | gdb $daemon_directory/$process_name $process_id 2>&1
#       >$config_directory/$process_name.$process_id.log & sleep 5
#
# Another possibility is to run gdb under a detached screen session.
# To attach to the screen sesssion, su root and run "screen -r
# <id_string>" where <id_string> uniquely matches one of the detached
# sessions (from "screen -list").
#
# debugger_command =
#       PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH; screen
#       -dmS $process_name gdb $daemon_directory/$process_name
#       $process_id & sleep 1

# INSTALL-TIME CONFIGURATION INFORMATION
#
# The following parameters are used when installing a new Postfix version.
#
# sendmail_path: The full pathname of the Postfix sendmail command.
# This is the Sendmail-compatible mail posting interface.
#
sendmail_path = /usr/sbin/sendmail.postfix

# newaliases_path: The full pathname of the Postfix newaliases command.
# This is the Sendmail-compatible command to build alias databases.
#
newaliases_path = /usr/bin/newaliases.postfix

# mailq_path: The full pathname of the Postfix mailq command.  This
# is the Sendmail-compatible mail queue listing command.
#
mailq_path = /usr/bin/mailq.postfix

# setgid_group: The group for mail submission and queue management
# commands.  This must be a group name with a numerical group ID that
# is not shared with other accounts, not even with the Postfix account.
#
setgid_group = postdrop

# html_directory: The location of the Postfix HTML documentation.
#
html_directory = no

# manpage_directory: The location of the Postfix on-line manual pages.
#
manpage_directory = /usr/share/man

# sample_directory: The location of the Postfix sample configuration files.
# This parameter is obsolete as of Postfix 2.1.
#
sample_directory = /usr/share/doc/postfix-2.10.1/samples

# readme_directory: The location of the Postfix README files.
#
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

relayhost = [smtp.gmail.com]:587 ←SMTP AUTH(SMTP認証)用の設定。Google の SMTP サーバーへリレーする。ポート番号は587番でOK。(TLS / STARTTLSを使って認証をするので「587番ポート」になる。もしSSLで認証する場合は「465番ポート」になる。※結構迷った。)
smtp_use_tls = yes ←TLS認証を利用する。
smtpd_tls_loglevel = 1 ←tlsのログレベルを指定する。(デフォルトは0)
smtp_sasl_auth_enable = yes ←Postfix SMTPクライアントの SASL 認証を有効にする。デフォルトは、認証を利用しない。
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd ←smtp_sasl_password_mapsが記載されたファイル(/etc/postfix/sasl_passwd)を指定する。デフォルトは指定なし。リレー先サーバのアドレス(smtp.gmail.com)とポート番号(587)と認証で使用するユーザ名(Googleの認証を利用するので、xxxx@gmail.comになる)とパスワード(xxxx@gmail.comでGoogleにログインする時のパスワード)を記述したファイルを指定する。
smtp_sasl_tls_security_options = noanonymous ←匿名ユーザー(アノニマスユーザー)のログイン禁止 
smtp_sasl_security_options = noanonymous ←匿名ユーザー(アノニマスユーザー)のログイン禁止
smtp_sasl_mechanism_filter = plain
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt

 

 




 SASL(Simple Authentication and Security Layer)とは

ここでSASLについて少し説明します。

SASLは簡単に言うと「認証」する機能です。

SASLを有効にすると、SMTP AUTH(SMTP 認証)で利用できるようになります。

SASLには、4つの認証方式があります。

  • AUTH LOGIN(平文でID・パスワード送信)
  • AUTH PLAIN(平文でID・パスワード送信)
  • AUTH CRAM-MD5(メッセージダイジェスト認証)
  • AUTH DIGEST-MD5(CRAM-MD5よりセキュリティ向上)

 

Postfixの動作確認(プロセス起動)

ここまで設定したら、一旦Postfixの動作確認をして問題ないか確認します。

Postfixサービスを再起動してステータスを確認します。

# systemctl restart postfix ←CentOS7なので、systemctlコマンドを実行。
# ←エラーが出力せずにプロンプトが返ってくればOK。CentOS6以前のように[OK][NG]が返ってくるスタイルの方が親切でよかったです。。
# systemctl status postfix ←念のためステータスを確認します。
● postfix.service - Postfix Mail Transport Agent ←これが緑色の●になっていればOK
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2017-03-26 14:32:58 JST; 6s ago
  Process: 28615 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 28630 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 28627 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS) ←statusがSUCCESSになっていればOK
  Process: 28625 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 28702 (master)
   CGroup: /system.slice/postfix.service
           tq28702 /usr/libexec/postfix/master -w
           tq28703 pickup -l -t unix -u
           mq28704 qmgr -l -t unix -u

ここでもし再起動に失敗したら、「/etc/postfix/main.cf」ファイルの構文が間違っている可能性があります。

スペルミスや、全角空白文字が混ざっているとか確認しましょう。

もう1度「/etc/postfix/main.cf」のバックアップファイルに戻して、再度上記のようにpostfixを再起動してステータスが起動していることを確認し、再度設定しなおしましょう。

この方法が一番手間がかかりません。

/etc/postfix/sasl_passwdファイルの設定

ここで「/etc/postfix/sasl_passwd」の設定をします。

「/etc/postfix/sasl_passwd」は、「/etc/postfix/main.cf」ファイルの以下の部分に出てきました。

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

/etc/postfix/sasl_passwdファイルの形式は以下のようになります。

# cat /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 xxxxx@gmail.com:password

↑gmailで、SMTP認証を利用する場合は、587番ポートを指定する。xxxxx@gmail.comには、実際に利用しているリアルなgmailアドレスを入れる。:(コロン)を置いてxxxxx@gmail.comでログインする時に使うパスワードを記載する。

設定をしたら以下のコマンドでデータベース化します。

# postmap hash:/etc/postfix/sasl_passwd

#←エラーが出ずにプロンプトが返ってきたら正常終了。

# ls -l sasl_passwd*
-rw------- 1 root root    55  3月 28 00:45 sasl_passwd
-rw------- 1 root root 12288  3月 28 22:43 sasl_passwd.db ←データベースファイルができている。

#

/etc/postfix/master.cfファイルの設定

次に「mastar.cf」ファイルの設定をします。

まず初めに失敗してもいいようにバックアップを取ります。

# cp -ip /etc/postfix/master.cf /etc/postfix/master.cf_20170328

/etc/postfix/master.cfファイルを開いて設定します。

# vi /etc/postfix/master.cf

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: “man 5 master”).
#
# Do not forget to execute “postfix reload” after editing this file.
#
# =======================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# =======================
smtp      inet  n       –       n       –       –       smtpd
#smtp      inet  n       –       n       –       1       postscreen
#smtpd     pass  –       –       n       –       –       smtpd
#dnsblog   unix  –       –       n       –       0       dnsblog
#tlsproxy  unix  –       –       n       –       0       tlsproxy
submission inet n       –       n       –       –       smtpd ←サブミッション用設定。コメントを外す。
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes ←SMTP認証を使う。コメントを外す。半角空白2つ隙間を開ける。(開けないとエラーになる。)
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject ←コメントを外す。
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       –       n       –       –       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       –       n       –       –       qmqpd
pickup    unix  n       –       n       60      1       pickup
cleanup   unix  n       –       n       –       0       cleanup
qmgr      unix  n       –       n       300     1       qmgr
#qmgr     unix  n       –       n       300     1       oqmgr
tlsmgr    unix  –       –       n       1000?   1       tlsmgr
rewrite   unix  –       –       n       –       –       trivial-rewrite
bounce    unix  –       –       n       –       0       bounce
defer     unix  –       –       n       –       0       bounce
trace     unix  –       –       n       –       0       bounce
verify    unix  –       –       n       –       1       verify
flush     unix  n       –       n       1000?   0       flush
proxymap  unix  –       –       n       –       –       proxymap
proxywrite unix –       –       n       –       1       proxymap
smtp      unix  –       –       n       –       –       smtp
relay     unix  –       –       n       –       –       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       –       n       –       –       showq
error     unix  –       –       n       –       –       error
retry     unix  –       –       n       –       –       error
discard   unix  –       –       n       –       –       discard
local     unix  –       n       n       –       –       local
virtual   unix  –       n       n       –       –       virtual
lmtp      unix  –       –       n       –       –       lmtp
anvil     unix  –       –       n       –       1       anvil
scache    unix  –       –       n       –       1       scache
#
# =======================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# =======================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
#maildrop  unix  –       n       n       –       –       pipe
#  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
#
# =======================
#
# Recent Cyrus versions can use the existing “lmtp” master.cf entry.
#
# Specify in cyrus.conf:
#   lmtp    cmd=”lmtpd -a” listen=”localhost:lmtp” proto=tcp4
#
# Specify in main.cf one or more of the following:
#  mailbox_transport = lmtp:inet:localhost
#  virtual_transport = lmtp:inet:localhost
#
# =======================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
#
#cyrus     unix  –       n       n       –       –       pipe
#  user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}
#
# =======================
#
# Old example of delivery via Cyrus.
#
#old-cyrus unix  –       n       n       –       –       pipe
#  flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user}
#
# =======================
#
# See the Postfix UUCP_README file for configuration details.
#
#uucp      unix  –       n       n       –       –       pipe
#  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender – $nexthop!rmail ($recipient)
#
# =======================
#
# Other external delivery methods.
#
#ifmail    unix  –       n       n       –       –       pipe
#  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
#
#bsmtp     unix  –       n       n       –       –       pipe
#  flags=Fq. user=bsmtp argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
#
#scalemail-backend unix –       n       n       –       2       pipe
#  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store
#  ${nexthop} ${user} ${extension}
#
#mailman   unix  –       n       n       –       –       pipe
#  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
#  ${nexthop} ${user}

 

プロセスの再起動(設定の反映)

ここまで設定したら、一旦設定を反映するためにプロセスを再起動します。

# systemctl restart postfix ←postfixの再起動

# systemctl status postfix ←postfixの再起動後のステータス確認

# systemctl restart saslauthd ←saslauthdの再起動

# systemctl status saslauthd ←saslauthdの再起動後のステータス確認




Postfixの動作確認(メール受信確認)

ここで一旦メールを受信できるか確認しましょう。

メールサーバーから以下のコマンドを実行してメールをインターネットへ送信できるか確認します。

# echo "テスト本文" | mail -s "テストタイトル" xxxx@gmail.com ←たまたまgmailへメールを送りましたが、プロバイダメールでもなんでもいいです。(一旦インターネットに出れば)

/var/log/maillogログを確認すると以下のログが出ていました。

Mar 28 22:26:28 centos7 postfix/pickup[3211]: 0D83A2101789: uid=0 from=<root>
Mar 28 22:26:28 centos7 postfix/cleanup[4453]: 0D83A2101789: message-id=<20170328132628.0D83A2101789@centos7.xxxxx.dix.asia>
Mar 28 22:26:28 centos7 postfix/qmgr[2026]: 0D83A2101789: from=<root@xxxxx.dix.asia>, size=493, nrcpt=1 (queue active) ←root@xxxxx.dix.asiaからメール送信
Mar 28 22:26:28 centos7 postfix/smtp[4455]: warning: database /etc/postfix/sasl_passwd.db is older than source file /etc/postfix/sasl_passwd
Mar 28 22:26:30 centos7 postfix/smtp[4455]: 0D83A2101789: to=<xxxxx@gmail.com>, relay=smtp.gmail.com[64.233.189.109]:587, delay=2.3, delays=0.37/0.03/1.1/0.85, dsn=2.0.0, status=sent (250 2.0.0 OK 1490707589 e5sm7695309pga.13 - gsmtp) ←Gmailの「xxxxx@gmail.com」宛にメールを送信。メールリレーはgmailのメールサーバー「smtp.gmail.com[64.233.189.109]」が行う。「status=sent」なので正常にメールが送信できている。
Mar 28 22:26:30 centos7 postfix/qmgr[2026]: 0D83A2101789: removed

 

Dovecotの設定

一通りメール送信の動作確認・動作検証ができたので、次にメール受信プログラムの「Dovecot」をインストールします。

※Dovecotは「ハト小屋」の意味。

「Dovecot」をインストールすると POP3 や IMAP を使えるようになり、Thunderbirdからもメールサーバーからメールを受信できて好きな時にメールを閲覧できるようになります。

# cd /etc/dovecot/conf.d
# cp -ip 10-mail.conf 10-mail.conf_YYYYMMDD ←例のごとく設定前にバックアップを取っておく。
# vi 10-mail.conf
##
## Mailbox locations and namespaces
##
# Location for users' mailboxes. The default is empty, which means that Dovecot
# tries to find the mailboxes automatically. This won't work if the user
# doesn't yet have any mail, so you should explicitly tell Dovecot the full
# location.
#
# If you're using mbox, giving a path to the INBOX file (eg. /var/mail/%u)
# isn't enough. You'll also need to tell Dovecot where the other mailboxes are
# kept. This is called the "root mail directory", and it must be the first
# path given in the mail_location setting.
#
# There are a few special variables you can use, eg.:
#
#   %u - username
#   %n - user part in user@domain, same as %u if there's no domain
#   %d - domain part in user@domain, empty if there's no domain
#   %h - home directory
#
# See doc/wiki/Variables.txt for full list. Some examples:
#
#   mail_location = maildir:~/Maildir
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
# <doc/wiki/MailLocation.txt>
#
#mail_location =
mail_location = maildr:~/Maildir ←Maildirを指定する。

設定したら「Dovecot」を起動します。

ついでに自動起動もonにします。

# systemctl restart dovecot ←dovecotを再起動します。

# systemctl status dovecot ←dovecotが正常に起動しているか確認します。

# systemctl list-unit-files | grep dovecot ←dovecotの自動起動設定を確認します。

# systemctl enable dovecot ←dovecotの自動起動設定を on にします。

# systemctl list-unit-files | grep dovecot ←dovecotの自動起動設定を確認します。
dovecot.service                               enabled ←「enabled」になっていればOK。
dovecot.socket

 

自宅PCから、Thunderbirdで「root@xxxxx.dix.asia」メールを送信してみます。

私の場合は、設定がちゃんとしているのか不安なので(笑)こまめに動作確認をします。

root@xxxxx.dix.asiaへメールを送信してみました。

その後、メールサーバーにログインし、/home/xxxxへ移動し、新規で「Maildir/」が作成できていることを確認しました。

「Maildir/」は、初めてメールを受信した時に作成されます。

更に「/home/xxxx/Maildir/cur」へ移動し、メールを受信していることを確認しました。

$ pwd
/home/xxxxx/Maildir/cur

$ ls -l
-rw------- 1 xxxx xxxx 1121  3月 28 23:38 1490711903.Vfd02I8000995M620592.centos7.xxxxx.dix.asia:2,S ←メールを送信したタイミングで受信している。

$ cat 1490711903.Vfd02I8000995M620592.centos7.xxxxx.dix.asia:2,S

Return-Path: <xxxxx@xxxxx.dix.asia>
X-Original-To: xxxx@xxxxxx.dix.asia
Delivered-To: xxxx@xxxxxx.dix.asia
Received: from [192.168.1.4] (unknown [192.168.1.4])
        by centos7.xxxxx.dix.asia (Postfix) with ESMTPA id 7FD89210178F
        for <xxxx@xxxxxx.dix.asia>; Tue, 28 Mar 2017 23:38:23 +0900 (JST)
Subject: =?UTF-8?B?UmU6IOODhuOCueODiOOCv+OCpOODiOODqw==?=
To: "xxxx@xxxxxx.dix.asia" <xxxx@xxxxxx.dix.asia>
References: <20170328132116.1C5A32101789@centos7.xxxxx.dix.asia>
 <81706fb2-e08f-db9b-100c-48327f10f750@xxxxx.dix.asia>
From: "xxxx@xxxxxx.dix.asia" <xxxx@xxxxxx.dix.asia>
Message-ID: <f2f344e2-9894-5212-3e81-963ce12ed6f3@xxxxx.dix.asia>
Date: Tue, 28 Mar 2017 23:38:27 +0900
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101
 Thunderbird/45.8.0
MIME-Version: 1.0
In-Reply-To: <81706fb2-e08f-db9b-100c-48327f10f750@xxxxx.dix.asia>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit

On 2017/03/28 23:37, xxxx@xxxxxx.dix.asia wrote:
>
>
> On 2017/03/28 22:21, xxxx@xxxxxx.dix.asia wrote:
>> テストメール本文
>>
>

 

ログの確認をします。

Mar 28 23:38:23 centos7 postfix/smtpd[5068]: connect from unknown[192.168.1.4]
Mar 28 23:38:23 centos7 postfix/smtpd[5068]: 7FD89210178F: client=unknown[192.168.1.4], sasl_method=PLAIN, sasl_username=xxxx
Mar 28 23:38:23 centos7 postfix/cleanup[5071]: 7FD89210178F: message-id=<f2f344e2-9894-5212-3e81-963ce12ed6f3@xxxxx.dix.asia>
Mar 28 23:38:23 centos7 postfix/qmgr[2026]: 7FD89210178F: from=<xxxxx@xxxxx.dix.asia>, size=1032, nrcpt=1 (queue active)
Mar 28 23:38:23 centos7 postfix/smtpd[5068]: disconnect from unknown[192.168.1.4]
Mar 28 23:38:23 centos7 postfix/local[5072]: 7FD89210178F: to=<xxxxx@xxxxx.dix.asia>, relay=local, delay=0.18, delays=0.13/0/0/0.05, dsn=2.0.0, status=sent (delivered to maildir) ←「status=sent」になっていることを確認
Mar 28 23:38:23 centos7 postfix/qmgr[2026]: 7FD89210178F: removed

 

メールが届いていることは確認できました。

ただ、こうしてみてみるとまだまだ分からない単語がたくさんあるなと思いました(笑)

更に動作検証で、メールサーバーからコマンドラインで自分あて(メールサーバーあてに)メールが送れるかどうか動作確認しました。

# echo "テストメール本文" | mail -s "テストタイトル" xxxxx@xxxxx.dix.asia
↑自分から自分あてにメールを送信

 

 ログを確認します。

Mar 28 23:49:28 centos7 dovecot: pop3-login: Login: user=<xxxx>, method=PLAIN, rip=192.168.1.4, lip=192.168.1.10, mpid=5187, TLS, session=<3WQZkctLJQDAqAEE>
Mar 28 23:49:28 centos7 dovecot: pop3(xxxxx): Disconnected: Logged out top=0/0, retr=0/0, del=0/7, size=6662
Mar 28 23:55:46 centos7 postfix/pickup[4580]: BDA6F210178F: uid=1001 from=<xxxxxx>
Mar 28 23:55:46 centos7 postfix/cleanup[5249]: BDA6F210178F: message-id=<20170328145546.BDA6F210178F@centos7.xxxxx.dix.asia>
Mar 28 23:55:46 centos7 postfix/qmgr[2026]: BDA6F210178F: from=<xxxxx@xxxxx.dix.asia>, size=503, nrcpt=1 (queue active)
Mar 28 23:55:46 centos7 postfix/local[5251]: BDA6F210178F: to=<xxxxx@xxxxx.dix.asia>, relay=local, delay=0.44, delays=0.38/0.02/0/0.04, dsn=2.0.0, status=sent (delivered to maildir) ←自分から自分あてに「status=sent」でメールが送られていることを確認。
Mar 28 23:55:46 centos7 postfix/qmgr[2026]: BDA6F210178F: removed

以上となります。

なんていうか、当初はこんな大がかりなプロジェクトになるとは思いませんでした(笑)

ただ、ここまで何とかやり通したので疲れもありません(笑)

最後に ~ メールサーバーを構築してみた感想

この自宅サーバー構成と、「自宅サーバーのOP25B問題」を対処するためにGoogleのSMTPサーバーをメールリレーする仕組みを作るのにだいぶ手間取ってしまいました。

当初は数時間もあれば完成するだろうと思ったのですが、私の技術ではサクッと構築して動作検証まではいきませんでした(笑)

「メールリレー」とか「認証」とか「自宅サーバーのOP25B問題」についてもっと勉強が必要と痛感しました。

何度も諦めかけましたが、最後まであきらめずに構築できてよかったです。

インフラエンジニアとして自信がついたのと、今後も勉強していこうと思いました。

更に ~ 現時点での不明点

まだまだ分からないことがたくさんあります。

  • SMTP認証の仕組み
  • SASLとTLS認証の使い分け
  • サーバー証明書の使いどころ

など、認証周りが弱いことを痛感しました。



 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

“【Linux】 CentOS7環境で自宅メールサーバーの構築(Postfix と Dovecot と OP25B問題)” への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。