提供: すだちWiki
移動先: 案内検索

メールサーバー構築(Postfix+Dovecot)(CentOS8)

メインページ > CentOS_8_で自宅サーバー構築  > メールサーバー構築(Postfix+Dovecot)(CentOS8)

メールサーバーを構築する場合、送信メールサーバー(SMTPサーバー)と受信メールサーバー(POP/IMAPサーバー)の構築が必要となる。 ここでは、送信メールサーバーにはPostfix、受信メールサーバーにはDovecotを採用する。

Postfixインストール

Postfix をインストールして SMTPサーバーを構築します。 SMTP は 25/TCP を使用します。

Postfix は CentOS を「Minimal Install」した場合でもデフォルトでインストールされますが、もしインストールされていない場合はインストールしてください。

[root@host2 ~]# dnf -y install postfix

cyrus-sasl-plain と cyrus-sasl-md5 が、もしインストールされていない場合はインストールしてください。

[root@host2 ~]# dnf -y install cyrus-sasl-plain
[root@host2 ~]# dnf -y install cyrus-sasl-md5

Postfix設定

Postfix設定

[root@host2 ~]# vi /etc/postfix/main.cf ← Postfix設定ファイル編集
# 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 = mail.sudachi.jp ← 追加(自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 = sudachi.jp ← 追加(自ドメイン名を指定)
# 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 ← 追加(ローカルからのメール送信時の送信元メールアドレス@以降にドメイン名を付加)

# 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 = localhost
inet_interfaces = all ← 変更(外部からのメール受信を許可)

#
# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
#
#mydestination = $myhostname, localhost.$mydomain, localhost
mydestination = $myhostname, localhost.$mydomain, localhost, $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形式にする)

# 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)
smtpd_banner = $myhostname ESMTP unknown ← 追加(メールサーバーソフト名の隠蔽化)

## 以下を最終行へ追加
# SMTP-Auth設定
smtpd_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter = plain
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

# 受信メールサイズ制限(10MB=10*1024*1024に制限)
message_size_limit = 10485760

SMTP-Auth設定

SMTP-Auth用ユーザ名、パスワードにシステムのユーザ名、パスワードを使用する場合)

[root@host3 ~]# yum -y install cyrus-sasl ← cyrus-saslインストール

[root@host3 ~]# systemctl start saslauthd ← saslauthd起動

[root@host3 ~]# systemctl enable saslauthd ← saslauthd自動起動設定

Postfixの文法チェック

Postfixの起動

[root@host3 ~]# systemctl restart postfix
[root@host3 ~]# systemctl enable postfix

Postfixのメールログ確認

[root@host2 ~]# less /var/log/maillog

Dovecotインストール

Dovecot をインストールして POP/IMAP サーバーを構築します。 POP は 110/TCP, IMAP は 143/TCP を使用します。

[root@host2 ~]# dnf -y install dovecot

Dovecot設定

Dovecot設定

10-mail.conf編集

[root@host2 ~]# vi /etc/dovecot/conf.d/10-mail.conf

# 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 = maildir:~/Maildir ← 追加(メールボックス形式をMaildir形式とする)

10-auth.conf編集

[root@host2 ~]# vi /etc/dovecot/conf.d/10-auth.conf

# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
# connection is considered secure and plaintext authentication is allowed.
#disable_plaintext_auth = yes
disable_plaintext_auth = no ← 追加(プレインテキスト認証を許可)

10-ssl.conf編集

[root@host2 ~]# vi /etc/dovecot/conf.d/10-ssl.conf

# SSL/TLS support: yes, no, required. 
# disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps
# plain imap and pop3 are still allowed for local connections
ssl = no ← SSL接続無効

Dovecot起動

[root@fost2 ~]# systemctl start dovecot ← Dovecot起動

[root@host2 ~]# systemctl enable dovecot ← Dovecot自動起動設定

root宛メールの転送設定

Linuxサーバーでは、OSやミドルウェアが何らかの情報をroot宛のメールで通知することがあります。
細かくいうと、OS上で動作する基本的なソフトウェアやミドルウェアのデフォルト設定で、root宛になっているんですね。
(root宛ではなく各プロセスの実行ユーザー宛になっているものもあります。)

サーバーを運用するうえで重要な情報ですので、このメールはサーバー管理者のメールアドレスに転送するべきです。

サーバー上でPostfixやsendmail等のメール配送サービスが動作していなければ、このメールはどこにも送信されません。
Postfixやsendmailがデフォルト設定のまま起動していれば、サーバー上のrootユーザーのメールボックスにメールが溜まります。

上記のように、

mydomain = example.jp
myorigin = $mydomain
append_at_myorigin = yes

と設定すると、宛先の「root」にmyoriginを付与して「root@example.jp」に送信しようとするのですが、example.jpドメインのメールボックスで「root@example.jp」のメールアドレスが用意されていないと、送信エラーとなります。

そこで、サーバー上のPostfixのtransportというメール配送マッピング設定とメールエイリアス設定で、root宛メールの転送設定を行います。
「いったん強制的にローカルに配送してから、メールエイリアス設定に従って転送させる」という方針です。

Postfixの設定で、transport_mapsパラメータを追記します。

[root@host2 ~]# vi /etc/postfix/main.cf

...
transport_maps = hash:/etc/postfix/transport

transport_maps = hash:/etc/postfix/transport
transport_mapsパラメータで、マッピングテーブルのファイルを指定します。 次に、transportテーブルを作成します。
1行目はroot@example.jp 宛のメールはローカルに配送する
2行目は、それ以外のメールはすべて外部に送信する
という意味です。

[root@host2 ~]# vi /etc/postfix/transport

root@sudachi.jp local:
* :

ハッシュ形式のマッピングテーブルファイルを生成します。

[root@host2 ~]# /usr/sbin/postmap /etc/postfix/transport

[root@host2 ~]# ls -l /etc/postfix/transport*
-rw-r--r--. 1 root root 12693  4月  7 00:44 /etc/postfix/transport
-rw-r--r--. 1 root root 12288  4月  7 00:45 /etc/postfix/transport.db

最後に、メールエイリアステーブル/etc/aliasesに、root宛メールの転送先アドレスを記述します。
複数のアドレスに転送する場合は、カンマ区切りで指定します。

[root@host2 ~]# vi /etc/aliases

...
root:       <転送先アドレス1>,<転送先アドレス2>

newaliasesコマンドでエイリアスハッシュファイルを更新します。

[root@host2 ~]# newaliases
/etc/aliases: 77 aliases, longest 31 bytes, 806 bytes total
[root@host2 ~]# ls -l /etc/aliases*
-rw-r--r--. 1 root root  1559  4月  6 20:29 /etc/aliases
-rw-r--r--. 1 root root 12288  4月  7 00:47 /etc/aliases.db

動作確認のため、mailコマンドでroot宛にテストメールを送信してみます。

[root@host2 ~]# echo "This is Test Mail fromsudachi.jp server." |\
  mail -s "test mail from sudachi.jp server." root