LoginSignup
5

More than 1 year has passed since last update.

CentOS7 + Postfix + Dovecot + MariaDB + PostfixAdmin + SSL/TLS + 迷惑メール振分防止 + Spam対策 でメールサーバー構築したった

Last updated at Posted at 2021-09-21

構造図
基本環境
dnsレコード設定
linuxユーザー作成
データベース設定
postfixadmin-ドメインとアドレス管理
postfix-送信サーバー
dovecot-受信サーバー
spamassassin-スパム対策
postfix送信テスト
dovecot受信テスト
メールログの確認
メールアドレス作成
メールクライアント設定
ssl/tls暗号化
postfixのssl/tls設定
dovecotのssl/tls設定
ファイアウォール確認
ssl/tlsメールクライアント設定
迷惑メール振分防止dnsレコード設定
エラーログ確認
参考記事

構造図

Mail Server diagram.jpeg

基本環境

CentOS-7.9.2009
Apache-2.4.6
php-8.0.10
MariaDB-10.6.4
example.comでLet'sEncryptによるSSL取得済み

dnsレコード設定

ドメイン管理会社のDNSレコード設定にて操作

Aレコード

ホスト名:example.com
TYPE:A
TTL:3600
VALUE:***.***.***.***<IPアドレス>

ホスト名:mail.example.com
TYPE:A
TTL:3600
VALUE:***.***.***.***<IPアドレス>

MXレコード

ホスト名:example.com
TYPE:MX
TTL:3600
VALUE:mail.example.com
優先:10

ホスト名の正引き確認

bind-utilsインストール

# yum -y install bind-utils

正引き確認

# host mail.example.com

mail.example.com has address <IPアドレス>

linuxユーザー作成

mailuserグループに属するmailuserユーザーを作成
uid=5000
gid=5000

# mkdir /home/mailuser
# groupadd -g 5000 mailuser
# useradd -g mailuser -u 5000 -d /home/mailuser -s /sbin/nologin mailuser

データベース設定

MySQLログイン

# mariadb -u root  -p
Enter password:
******
MariaDB [(none)]> 

データベース「PostFixDB」作成

CREATE DATABASE PostFixDB character set utf8 collate utf8_bin;

データベース一覧で確認

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| PostFixDB          |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
8 rows in set (0.001 sec)

Postfix用ユーザー「postfix」作成

MariaDB [(none)]> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '[MySQLユーザーパスワード]';

GRANT ALL ON PostFixDB.* TO "postfix"@"localhost";

データベース「PostFixDB」に入る

MariaDB [(none)]> USE PostFixDB;

Database changed
MariaDB [PostFixDB]>

ユーザー「postfix」の権限確認

MariaDB [PostFixDB]> SHOW GRANTS FOR postfix@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for postfix@localhost                                                                                                                                                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `postfix`@`localhost` IDENTIFIED BY PASSWORD '*205201BC4A2520ADFCF65CACEC977E2BCCD10174'                                                                                                                      |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `PostFixDB`.* TO `postfix`@`localhost` |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

postfixadmin-ドメインとアドレス管理

PostfixAdmin-2.92動作せず

最初、参考記事コピペでPostfixAdmin-2.92インストールしたが、セットアップページが表示されない
調べると、php8.0には3.3.4以上でないと適合しないことが判明
https://github.com/postfixadmin/postfixadmin/releases

PostfixAdmin-3.3.10動作せず

ならばと、最新バージョンPostfixAdmin-3.3.10インストールしたが、データベースのアップデート途中で書き換えエラー発生
ダウンロードページをよく見ると3.3.9と3.3.10には「bug fixes」の表記あるため回避し、PostfixAdmin-3.3.8 をインストール

PostfixAdmin-3.3.8インストール成功

SSL通信で使えるように「example.com」配下へインストール

# cd /var/www/html/example.com
# wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.8.tar.gz
# ls /var/www/html/example.com
postfixadmin-3.3.8.tar.gz
# tar zxvf postfixadmin-3.3.8.tar.gz
# ls /var/www/html/example.com
postfixadmin-3.3.8.tar.gz postfixadmin-postfixadmin-3.3.8
# mv postfixadmin-postfixadmin-3.3.8 postfixadmin

config.local.phpでの設定

config.inc.phpをコピーしてconfig.local.phpを作成

# cp /var/www/html/postfixadmin/config.inc.php /var/www/html/postfixadmin/config.local.php

config.local.phpに設定書き込み

# vim /var/www/html/postfixadmin/config.local.php
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixa';
$CONF['database_password'] = '<パスワード>';
$CONF['database_name'] = 'PostFixDB';

templates_cディレクトリを作成

# mkdir /var/www/html/postfixadmin/templates_c
# ls /var/www/html/postfixadmin/
# chown -R apache:apache /var/www/html/postfixadmin/templates_c
# chmod 777 /var/www/html/postfixadmin/templates_c
# ls -l /var/www/html/postfixadmin/

バーチャルホスト設定

バーチャルホスト設定がまだの場合は、以下を設定

# vim /etc/httpd/conf.d/virtual.conf
<virtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html/example.com
    RewriteEngine on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>
<IfModule mod_ssl.c>
<virtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/html/example.com
    ServerAlias mail.example.com
    AllowEncodedSlashes On
    CustomLog      logs/example.com.access.log combined
    ErrorLog       logs/example.com.error.log
<Directory /var/www/html/example.com>
        SetEnv HTTP_X_FORWARDED_PROTO http
        SetEnv REAL_HOST_NAME example.com
        AllowOverride All
        Require all granted
    </Directory>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</virtualHost>
</IfModule>

ブラウザ操作

ブラウザでアクセス

https://example.com/postfixadmin/public/setup.php

SetupPasswordに任意のパスワードを入力し、Generate password hashボタンをクリック
表示されたパスワードをconfig.local.phpの$CONF[‘setup_password’] = ‘changeme’;内に入力

# vim /var/www/html/postfixadmin/config.local.php
$CONF[‘setup_password’] = ‘*****’;

ブラウザをリロード

https://example.com/postfixadmin/public/setup.php

システム管理者の登録

Setup passwordに先ほどと同じSetup passwordを入力
管理者に連絡先メールアドレス
パスワードに任意のログインパスワード
パスワード(確認)に上記と同じパスワード
管理者追加をクリック

PostfixAdminにログイン
https://nakatou.jp/postfixadmin/public/login.php

postfix-送信サーバー

Postfixインストール

# yum install gcc gcc-c++ pcre-devel zlib-devel make wget openssl-devel 
# yum install libxml2 libxml2-devel libxslt-devel libxslt libxslt-devel gd-devel
# yum install perl-ExtUtils-Embed GeoIP-devel gperftools-devel flex libcap-devel
# yum install postfix cyrus-sasl-md5  libdbi-dbd-mysql cyrus-sasl-plain

Postfix設定ファイルの編集

Postfixのファイル構造
/etc/postfix/main.cf
  ∟/etc/postfix/mysql_virtual_alias_maps.cf
  ∟/etc/postfix/mysql_virtual_domains_maps.cf
  ∟/etc/postfix/mysql_virtual_mailbox_maps.cf
/etc/postfix/master.cf

/etc/postfix/main.cfをバックアップの後、編集します

# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.cp
# vim /etc/postfix/main.cf
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
mydestination = 
mynetworks = 127.0.0.0/8
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown
# 最終行に追加します
# SMTP-Auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $mydomain
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net,
        reject_rbl_client cbl.abuseat.org,
        reject_rbl_client truncate.gbudb.net,
        check_client_access hash:/etc/postfix/reject_client,
        permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
# Virtual Domains
local_transport = local
virtual_transport = virtual
virtual_mailbox_base = /home/mailuser
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_uid_maps = static:500
virtual_gid_maps = static:5000
# Mailbox limit(クォーターの設定はなし)
virtual_mailbox_limit = 0

/etc/postfix/master.cfをバックアップの後、編集します

# cp -p /etc/postfix/master.cf /etc/postfix/master.cf.cp
# vim /etc/postfix/master.cf
↓コメントアウト外す
submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt

↓コメントアウト外す
  -o smtpd_sasl_auth_enable=yes

Postfix設定ファイルの作成

バーチャルドメイン各種ファイル作成
mysql_virtual_alias_maps.cf

# vim /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = ****
hosts = localhost
dbname = PostFixDB
table = alias
select_field = goto
where_field = address

mysql_virtual_domains_maps.cf

# vim /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = ****
hosts = localhost
dbname = PostFixDB
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1'

mysql_virtual_mailbox_maps.cf

# vim /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = ****
hosts = localhost
dbname = PostFixDB
table = mailbox
select_field = maildir
where_field = username

reject_clientファイル生成

# sudo touch /etc/postfix/reject_client
# sudo postmap /etc/postfix/reject_client

Postfix設定ファイルのチェック

# postconf -n

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = all
local_transport = local
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination =
mydomain = example.com
myhostname = example.com
mynetworks = 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP unknown
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org, reject_rbl_client truncate.gbudb.net, check_client_access hash:/etc/postfix/reject_client, permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
unknown_local_recipient_reject_code = 550
virtual_alias_domains = $virtual_alias_maps
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/mailuser
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 0
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_transport = virtual
virtual_uid_maps = static:5000

dovecot-受信サーバー

Dovecotインストール

# yum -y install dovecot dovecot-mysql

サーバー内で権限変更

# chown -R mailuser:dovecot /etc/dovecot
# chmod -R o-rwx /etc/dovecot

Dovecot設定ファイルの編集

ファイル構造
/etc/dovecot/dovecot.conf
  ∟ /etc/dovecot/local.conf
     ∟/etc/dovecot/dovecot-sql.conf.ext

dovecot.conf編集

cp -p /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.cp
# vim /etc/dovecot/dovecot.conf
protocols = imap pop3

↓コメントアウト入れる
#!include conf.d/*.conf

↓下記追加
!include_try local.conf

local.conf作成

/etc/dovecot/conf.d/以下のconf設定ファイルをまとめる
以下のファイルをひとまとめにし、システムアップデートに対応するため
10-mail.conf
10-master.conf
10-auth.conf
10-ssl.conf
20-pop3.conf
auth-sql.conf.ext

# vim /etc/dovecot/local.conf
 auth_debug_passwords = yes
 auth_verbose = no
 auth_debug = yes

 listen = *

 ###from 10-auth.conf
 disable_plaintext_auth = no
 auth_mechanisms = PLAIN LOGIN CRAM-MD5

 ###from 10-mail.conf
 mail_location = maildir:/home/mailuser/%d/%n
 mail_uid = mailuser
 mail_gid = mailuser
 mail_privileged_group = mailuser
 first_valid_uid = 5000
 first_valid_gid = 5000
 mail_plugins = quota

 ###from 10-ssl.conf
 ssl = no

 ###from 10-master.conf
 service imap-login {
   inet_listener imap {
     port = 143
   }
   inet_listener imaps {
     #port = 993
     #ssl = yes
   }
 }
 service pop3-login {
   inet_listener pop3 {
     port = 110
   }
   inet_listener pop3s {
     #port = 995
     #ssl = yes
   }
 }
 service auth {
   unix_listener /var/spool/postfix/private/auth {
     mode = 0666
     user = mailuser
     group = mailuser
   }
   unix_listener auth-userdb {
     mode = 0600
     user = mailuser
     group = mailuser
   }
   user = dovecot
 }

 service auth-worker {
   user = mailuser
 }

 ###from auth-sql.conf.ext
 protocol imap {
  imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
   mail_plugins = $mail_plugins imap_quota
 }
 protocol pop3 {
   pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
 }
 passdb {
   driver = sql
   args = /etc/dovecot/dovecot-sql.conf.ext
 }
 userdb {
   driver = sql
   args = /etc/dovecot/dovecot-sql.conf.ext
 }
 service auth {
   unix_listener /var/spool/postfix/private/auth {
     mode = 0666
   }
 }

dovecot-sql.conf.ext作成

# vim /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
default_pass_scheme = MD5-CRYPT
connect = host=localhost dbname=PostFixDB user=postfix password=****
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/mailuser/', maildir) as home, 5000 as uid, 5000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT userid AS username, domain FROM users

オプション----ここから↓

上記local.confの作成しない場合、以下の編集・作成を行う
10-mail.conf編集

# cp -p /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.cp
# vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/mailuser/%d/%n
first_valid_uid = 5000
first_valid_gid = 5000

10-master.conf編集

# cp -p /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.cp
# vim /etc/dovecot/conf.d/10-master.conf
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
    mode = 0660
  }
  inet_listener imap {
    port = 143 ←有効化
  }
  inet_listener imaps {
    #port = 993
    #ssl = yes
  }
  inet_listener pop3 {
    port = 110 ←有効化
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
  }

10-auth.conf編集

# cp -p /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.cp
# vim /etc/dovecot/conf.d/10-auth.conf
#auth_mechanisms = plain
↓
auth_mechanisms = plain login

disable_plaintext_auth = no

↓コメントアウト外す
!include auth-system.conf.ext
!include auth-sql.conf.ext

10-ssl.conf編集

# cp -p /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.cp
# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = no

20-pop3.conf編集

# cp -p /etc/dovecot/conf.d/20-pop3.conf /etc/dovecot/conf.d/20-pop3.conf.cp
# vim /etc/dovecot/conf.d/20-pop3.conf
protocol pop3 {
       pop3_uidl_format = %08Xu%08Xv
       mail_max_userip_connections = 1000
}

auth-sql.conf.ext作成

# vim /etc/dovecot/conf.d/auth-sql.conf.ext
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

dovecot-sql.conf.ext作成

# vim /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
default_pass_scheme = MD5-CRYPT
connect = host=localhost dbname=PostFixDB user=postfix password=****
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/mailuser/', maildir) as home, 5000 as uid, 5000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT userid AS username, domain FROM users

オプション----ここまで↑

Dovecot設定ファイルのチェック

# doveconf -n

# 2.2.36 (1f10bfa63): /etc/dovecot/dovecot.conf
# OS: Linux 3.10.0-1160.41.1.el7.x86_64 x86_64 CentOS Linux release 7.9.2009 (Core) ext4
# Hostname: v157-7-134-162.myvps.jp
auth_mechanisms = plain login
disable_plaintext_auth = no
first_valid_gid = 5000
first_valid_uid = 5000
mail_location = maildir:/home/mailuser/%d/%n
mbox_write_locks = fcntl
namespace inbox {
  inbox = yes
  location = 
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix = 
}
passdb {
  driver = pam
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocols = imap pop3
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0660
    user = postfix
  }
}
service imap-login {
  inet_listener imap {
    port = 143
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 0
  }
}
ssl = no
userdb {
  driver = passwd
}
userdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
userdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocol pop3 {
  mail_max_userip_connections = 1000
  pop3_uidl_format = %08Xu%08Xv
}

spamassassin-スパム対策

spamassassinインストール

# yum -y install spamassassin

spamassassinシステムユーザを作成

# groupadd spamd
# useradd -g spamd -s /bin/false -d /var/log/spamassassin spamd
# chown spamd:spamd /var/log/spamassassin

spamassassin設定

# vim /etc/postfix/master.cf
smtp      inet  n       -       n       -       -       smtpd

↓以下に変更

smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamassassin

↓以下を追加
spamassassin unix - n n - - pipe flags=R user=spamd argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Postfix有効化

Postfix自動起動設定

# systemctl enable postfix

Postfix自動起動設定の確認

# systemctl is-enabled postfix

enableが返ってきたらOK

Postfix再起動

# systemctl restart postfix

Dovecot有効化

Dovecot自動起動設定

# systemctl enable dovecot

Dovecot自動起動設定の確認

# systemctl is-enabled dovecot

enableが返ってきたらOK

Dovecot再起動

# systemctl restart dovecot

saslauthd有効化

saslauthd自動起動設定

# systemctl enable saslauthd

saslauthd自動起動設定の確認

# systemctl is-enabled saslauthd

enableが返ってきたらOK

saslauthd再起動

# systemctl restart saslauthd

spamassassin有効化

spamassassin自動起動設定

# systemctl enable spamassassin

spamassassin自動起動設定の確認

# systemctl is-enabled spamassassin

enableが返ってきたらOK

spamassassin再起動

# systemctl restart spamassassin

postfix送信テスト

ポート番号:

smtp 587
smtps 465

# telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 <サーバー名> ESMTP unknown
EHLO localhost
250-<サーバー名>
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL From: <送信元メールアドレス>
250 2.1.0 Ok
RCPT To: <送信先メールアドレス>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From: <送信元メールアドレス>
To: <送信先メールアドレス>
Subject: Test Mail
This is a test.
.
250 2.0.0 Ok: queued as 8166B81020
quit
221 2.0.0 Bye
Connection closed by foreign host

送信先メールアドレスで着信したか、確認する

dovecot受信テスト

ポート番号:

pop3 110
pops3 995
imap 143
imaps 993

# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK ready.
USER <ユーザー名>
+OK
PASS <パスワード>
+OK
LIST
+OK
1 1366
.
RETR <メール番号>
+OK
Return-Path: <メールアドレス>
Received: from <送信元メールアドレス> (HELO aki) (192.168.1.1)
  by 192.168.1.2 with SMTP; 9 Jul 2009 11:40:48 +0900
Subject:<件名>
From:<送信元メールアドレス>
To:<受信メールアドレス>
X-UIDL: 1234567890
<本文>
.
DELE <メール番号>
+OK
QUIT
+OK
Connection closed by foreign host.

メールログの確認

# cat /var/log/maillog
# cat /var/log/dovecot.log

メールアドレス作成

Postfixadminで登録

https://example.com/postfixadmin/public/login.php

ドメイン登録
example.com

メールアドレス登録
info@example.com

サーバー内にディレクトリが作成されていることを確認

ドメイン用ディレクトリ

# ls /home/mailuser/
example.com

メールアドレス用ディレクトリ

# ls /home/mailuser/example.com/
info

メールクライアント設定

ローカル内のメールクライアントでメールアドレス設定
POP3とIMAP両方でテスト

POP3受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:STARTTLS
ポート番号:110
認証:PLAIN

IMAP受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:STARTTLS
ポート番号:143
認証:PLAIN

SMTP
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:STARTTLS
ポート番号:587

送受信テスト

メールクライアント上でメール送受信テストを行う
POP3およびIMAPで設定し送受信テスト

ssl/tls暗号化

example.comには、すでにLet'sEncryptでSSL証明書を発行済

Let'sEncrypt自動更新後の再起動設定

PostfixとDovecotでこの証明書を利用するには、証明書更新後に再起動が必要のため設定

# crontab -e
00 3 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"

設定の確認

# crontab -l

00 3 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"

postfixのssl/tls設定

main.cf編集

# cp -p  /etc/postfix/main.cf /etc/postfix/main.cf.cp2
# vim /etc/postfix/main.cf
### SSL/TLS Settings
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1

master.cf編集

# cp -p /etc/postfix/master.cf /etc/postfix/master.cf.cp2
# vim /etc/postfix/master.cf
↓コメントアウト外す
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

postfix設定の確認

# postconf -n

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = all
local_transport = local
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination =
mydomain = nakatou.jp
myhostname = mail.nakatou.jp
mynetworks = 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP unknown
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org, reject_rbl_client truncate.gbudb.net, check_client_access hash:/etc/postfix/reject_client, permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
unknown_local_recipient_reject_code = 550
virtual_alias_domains = $virtual_alias_maps
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/mailuser
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 0
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_transport = virtual
virtual_uid_maps = static:5000

postfixエラーチェック

# postfix check

postfix再起動

# systemctl restart postfix

postfixステータス確認

# systemctl status postfix

● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2021-09-20 16:44:34 JST; 10s ago
  Process: 13336 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 13355 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 13349 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 13346 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 13426 (master)
   CGroup: /system.slice/postfix.service
           ├─13426 /usr/libexec/postfix/master -w
           ├─13427 pickup -l -t unix -u
           ├─13428 qmgr -l -t unix -u
           ├─13429 smtpd -n smtp -t inet -u -o stress= -s 2
           ├─13430 proxymap -t unix -u
           ├─13431 anvil -l -t unix -u
           └─13432 smtpd -n smtp -t inet -u -o stress= -s 2

ポート番号465でのリッスン確認

# netstat -nat

tcp        0      0 0.0.0.0:465             0.0.0.0:*               LISTEN

LISTENになっていればオーケー

dovecotのssl/tls設定

local.conf編集

cp -p /etc/dovecot/local.conf /etc/dovecot/local.conf.cp
# vim /etc/dovecot/local.conf
###from auth-sql.conf.ext
service imap-login {
  inet_listener imap {
↓下記変更
    port = 0
  }
  inet_listener imaps {
↓コメントアウト外す
    port = 993
↓コメントアウト外す
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
↓下記変更
    port = 0
  }
  inet_listener pop3s {
↓コメントアウト外す
    port = 995
↓コメントアウト外す
    ssl = yes
  }
}

###from 10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/example.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.jp/privkey.pem

オプション----ここから↓

上記local.confを使用しない場合、以下の編集・作成を行う
10-ssl.conf編集

# cp -p /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.cp2
# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = required

ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem

10-master.conf編集

# cp -p /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.cp2
# vim /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
↓下記変更
  port = 0
  }
inet_listener imaps {
↓コメントアウト外す
  port = 993
↓コメントアウト外す
  ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
↓下記変更
  port = 0
  }
inet_listener pop3s {
↓コメントアウト外す
  port = 995
↓コメントアウト外す
  ssl = yes
  }
}

オプション----ここまで↑

dovecot設定確認

# doveconf -n

# 2.2.36 (1f10bfa63): /etc/dovecot/dovecot.conf
# OS: Linux 3.10.0-1160.42.2.el7.x86_64 x86_64 CentOS Linux release 7.9.2009 (Core) ext4
# Hostname: v157-7-134-162.myvps.jp
auth_mechanisms = plain login
disable_plaintext_auth = no
first_valid_gid = 5000
first_valid_uid = 5000
mail_location = maildir:/home/mailuser/%d/%n
mbox_write_locks = fcntl
namespace inbox {
  inbox = yes
  location = 
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix = 
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocols = imap pop3
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0660
    user = postfix
  }
}
service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
ssl = required
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key =  # hidden, use -P to show it
userdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocol pop3 {
  mail_max_userip_connections = 1000
  pop3_uidl_format = %08Xu%08Xv
}

dovecot再起動

# systemctl restart dovecot

dovecotステータス確認

# systemctl status dovecot

● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2021-09-20 17:49:15 JST; 14s ago
     Docs: man:dovecot(1)
           http://wiki2.dovecot.org/
  Process: 13667 ExecStop=/usr/bin/doveadm stop (code=exited, status=0/SUCCESS)
  Process: 13683 ExecStart=/usr/sbin/dovecot (code=exited, status=0/SUCCESS)
  Process: 13679 ExecStartPre=/usr/sbin/portrelease dovecot (code=exited, status=0/SUCCESS)
  Process: 13672 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
 Main PID: 13685 (dovecot)
   CGroup: /system.slice/dovecot.service
           ├─13685 /usr/sbin/dovecot
           ├─13686 dovecot/anvil
           ├─13687 dovecot/log
           ├─13689 dovecot/config
           ├─13690 dovecot/auth
           └─13691 dovecot/auth -w

ポート番号POP3S用の995と、IMAPS用の993でのリッスン確認

# netstat -nat

tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN  

ファイアウォール確認

# firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ftp http https imap pop3 smtp smtp-submission ssh
  ports: 63963/tcp 61000-61005/tcp 443/tcp 993/tcp 80/tcp 25/tcp 465/tcp 587/tcp 995/tcp 110/tcp 143/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

services:
内に
imaps smtps pop3s
が含まれているか確認

含まれていない場合は追加
追加項目が1個の場合は{}外す

# firewall-cmd --add-service={smtps,imaps,pop3s} --permanent

success

設定の読み込み

# firewall-cmd --reload

success

設定の確認

# firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ftp http https imap imaps pop3 pop3s smtp smtp-submission smtps ssh
  ports: 63963/tcp 61000-61005/tcp 443/tcp 993/tcp 80/tcp 25/tcp 465/tcp 587/tcp 995/tcp 110/tcp 143/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

imaps smtps pop3s
が含まれていることを確認

ssl/tlsメールクライアント設定

ローカル内のメールクライアントでメールアドレス設定
POP3とIMAP両方でテスト

POP3受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:SSL/TLS
ポート番号:995
認証:PLAIN

IMAP受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:SSL/TLS
ポート番号:993
認証:PLAIN

SMTP
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:SSL/TLS
ポート番号:465

認証できない場合

エラーログ確認

cat /var/log/maillog

送受信テスト

メールクライアント上でメール送受信テストを行う
POP3SおよびIMAPSで設定し送受信テスト

迷惑メール振分防止dnsレコード設定

SPFレコード設定

TXTレコード

ホスト名:example.com
TYPE:TXT
TTL:3600
VALUE:v=spf1 a:mail.example.com ~all

設定状況の確認

以下のウェブサイトにアクセス
https://www.kitterman.com/spf/validate.html
Is this SPF record valid - syntactically correct?以下に
Domain:example.com
SPF Record:v=spf1
を入力し、Check SPF recordをクリック

SPF record passed validation test with pySPF (Python SPF library)!
と表示されれば登録が成功している
Results – PermError SPF Permanent Error: Too many DNS lookups
と表示されれば不具合あり

DKIM設定

▶︎インストール
EPELレポジトリが未インストールならインストール

# yum -y install epel-release

インストール前にopendkimパッケージの確認

# yum search opendkim

opendkim.x86_64 : A DomainKeys Identified Mail (DKIM) milter to sign and/or verify mail
が含まれているかを確認

opendkimパッケージの詳細を確認

# yum info opendkim

説明にメールに電子署名を行うためのパッケージであることが記載されているのを確認

opendkimパッケージインストール

# yum -y install opendkim

インストール状況の確認

# yum list installed | grep opendkim

libopendkim.x86_64 2.11.0-0.1.el7 @epel
opendkim.x86_64 2.11.0-0.1.el7 @epel

▶︎秘密鍵作成
フォルダ作成

# mkdir /etc/opendkim/keys/example.com

電子署名用のキーペア作成
opendkim-genkey -D <ファイル保存パス>/ -d <ドメイン名> -s <セレクタ名>
セレクタ名には作成日を6桁数字で入れるのがわかりやすい

# opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s 181026

作成状況の確認

# ls -al /etc/opendkim/keys/example.com/

合計 16
drwxr-xr-x 2 root root 4096 10月 26 10:09 .
drwxr-x--- 3 opendkim opendkim 4096 10月 26 10:08 ..
-rw------- 1 root root 891 10月 26 10:09 181026.private
-rw------- 1 root root 333 10月 26 10:09 181026.txt

キーペア(秘密鍵/公開鍵)ファイルの所有者変更

# chown -R opendkim:opendkim /etc/opendkim/keys/example.com/

変更状況の確認

# ls -al /etc/opendkim/keys/example.com/

合計 16
drwxr-xr-x 2 opendkim opendkim 4096 10月 26 10:09 .
drwxr-x--- 3 opendkim opendkim 4096 10月 26 10:08 ..
-rw------- 1 opendkim opendkim 891 10月 26 10:09 181026.private
-rw------- 1 opendkim opendkim 333 10月 26 10:09 181026.txt

公開鍵の確認

# cat /etc/opendkim/keys/example.com/181026.txt

181026._domainkey IN TXT ( "v=DKIM1; k=rsa;
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFOu6xDK9rSuttAbMNY9Cs2cmOWxUV48kMvalmFo0trkL6zoncBvYyCZ7z4o9F79cWPQCLSNLuviCRbS9k5LsZEr9M8nM+k+zqYQKh8ttTWMt5odvpcz6C4miQMJ/Cc2gfcpRQDFWWSqm2O6BhALV7p1tzUmbchLxtBRtjcMXXTQIDAQAB" ) ; ----- DKIM key 181026 for example.com

公開鍵の見方
v=DKIM1: keyレコードのバージョン番号(指定する場合はDKIM1)
k=rsa: 電子署名の作成に利用できる鍵の形式、DKIMではRSAのみサポート
p=....: 公開鍵データ

▶︎公開鍵用レコードの登録
サーバーのDNSレコード設定ページより登録

ホスト名:<セレクタ名>._domainkey.<ドメイン名>
TYPE:TXT
TTL:3600
VALUE:v=DKIM1; k=rsa; p=<公開鍵データ>

▶︎ADSPレコード登録

ホスト名:_adsp._domainkey.<ドメイン名>
TYPE:TXT
TTL:3600
VALUE:dkim=unknown

▶︎DKIM設定の確認

公開鍵設定の確認

# dig <セレクタ名>._domainkey.<ドメイン名> txt

<<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> <セレクタ名>._domainkey.<ドメイン名> txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39057
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;<セレクタ名>._domainkey.<ドメイン名>. IN TXT
;; ANSWER SECTION:
<セレクタ名>._domainkey.<ドメイン名>. 500 IN TXT "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFOu6xDK9rSuttAbMNY9Cs2cmOWxUV48kMvalmFo0trkL6zoncBvYyCZ7z4o9F79cWPQCLSNLuviCRbS9k5LsZEr9M8nM+k+zqYQKh8ttTWMt5odvpcz6C4miQMJ/Cc2gfcpRQDFWWSqm2O6BhALV7p1tzUmbchLxtBRtjcMXXTQIDAQAB"
;; Query time: 2 msec
;; SERVER: 157.7.180.133#53(157.7.180.133)
;; WHEN: 金 10月 26 10:34:29 JST 2018
;; MSG SIZE rcvd: 315

ADSPレコード設定の確認

# dig _adsp._domainkey.<ドメイン名> txt

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> _adsp._domainkey.<ドメイン名> txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16470
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_adsp._domainkey.<ドメイン名>. IN TXT
;; ANSWER SECTION:
_adsp._domainkey.<ドメイン名>. 500 IN TXT "dkim=unknown"
;; Query time: 3 msec
;; SERVER: 157.7.180.133#53(157.7.180.133)
;; WHEN: 金 10月 26 10:34:58 JST 2018
;; MSG SIZE rcvd: 82

エラーログ確認

cat /var/log/dovecot.log

cat /var/log/maillog

参考記事

基本の流れ
https://ex1.m-yabe.com/archives/4606
telnet送信テスト
http://ash.jp/net/telnet_smtp.htm
telnet受信テスト
https://centossrv.com/memo/log/19.shtml
PostfixAdmin
https://ac-5.net/linux/postfixadmin
SPFレコード
https://www.kagoya.jp/howto/it-glossary/mail/spf/
DKIM
https://www.rem-system.com/dkim-postfix04/#6_opendkim
SSL/TLS設定
https://www.rem-system.com/mail-postfix03/
spamassassin
https://www.zealseeds.com/Infrastructure/server/mail/index.html
Domain Quota(未設定)
https://e-garakuta.net/techinfo/doku.php/linux/postfix-virtual

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
5