🌊

【Azure】CentOS7.9にてSMTPサーバーを構築してみた。(Postfix)

2021/05/16に公開

はじめに

Azure上にて仮想マシン(CentOS7.9)を構築し、Postfixを使用してSMTPサーバーを構築してみました。
SMTPサーバーにメールが届くことを確認するまで実施します。

構成図

仮想マシンのスペック

項目 設定
VM名 smtptest09
マシンタイプ Standard B1ms
OS CentOS7.9 - Gen1
vCPU 1
メモリ(GB) 2
ディスク 30GiB

前提

  • あくまでも検証用途で作成
  • お名前ドットコムにてドメイン作成済み
  • 仮想マシンは既に作成済み(立てたところからスタート)
  • ネットワークセキュリティグループにて25番ポート(SMTP)開放済み(受信セキュリティ規則)

  • パブリックIPアドレスを「静的」に設定済み/DNS名ラベルをホスト名(postfix)に設定済み

作業の流れ

①お名前ドットコムにてレコード登録
②postfix導入確認
③postfix設定
④メール送信・受信確認

作業手順

①お名前ドットコムにてレコード登録

購入したドメインのレコード設定より、以下レコードを登録する。

ホスト名 TYPE TTL VALUE 優先 状態
smtptest09.testoffice.work
(ホスト名.ドメイン名)
A 3600 20.46.122.73
(パブリックIPアドレス)
有効
testoffice.work MX 3600 smtptest09.testoffice.work
(ホスト名.ドメイン名)
10 有効

使用するレコードの説明

レコード 説明 備考
Aレコード ドメイン名をIPアドレスに置き換えるレコード smtptest09.testoffice.work → 20.46.122.73
MXレコード メールサーバのホスト名を記載するレコード Aレコードと同様のタイミングで登録

②postfix導入確認

rootユーザーへスイッチ

コマンド
sudo -i

ホスト名設定

  • 事前ホスト名確認
コマンド
hostnamectl status
実行例
[cloudadmin@smtptest09 ~]$ hostnamectl status
   Static hostname: smtptest09
         Icon name: computer-vm
           Chassis: vm
        Machine ID: b210cf36d2b54793bd0d8d5c3f8cc892
           Boot ID: 75c75e6a246741c0957327a586de1246
    Virtualization: microsoft
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.15.2.el7.x86_64
      Architecture: x86-64
[cloudadmin@smtptest09 ~]$
  • FQDN設定
コマンド
hostnamectl set-hostname FQDN名
コマンド例
hostnamectl set-hostname smtptest09.testoffice.work
  • 設定後確認

Static hostnameが変更されていることを確認。

コマンド
hostnamectl status
実行例
[root@smtptest09 ~]# hostnamectl status
   Static hostname: smtptest09.testoffice.work ← ここ
         Icon name: computer-vm
           Chassis: vm
        Machine ID: b210cf36d2b54793bd0d8d5c3f8cc892
           Boot ID: 75c75e6a246741c0957327a586de1246
    Virtualization: microsoft
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.15.2.el7.x86_64
      Architecture: x86-64
[root@smtptest09 ~]#

hosts設定

  • バックアップフォルダ作成
コマンド
cd /etc
mkdir bk
  • 事前ファイルバックアップ
コマンド
cp -p hosts bk/hosts_`date "+%Y%m%d_%H%M%S"`
  • ファイルバックアップ確認
コマンド
ls -l bk
実行例
[root@smtptest09 etc]# ls -l bk
total 4
-rw-r--r--. 1 root root 158 Jun  7  2013 hosts_20210516_133926
[root@smtptest09 etc]#
  • hostsファイル編集
コマンド
vim hosts  
編集内容
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
20.46.122.73 smtptest09.testoffice.work smtptest09 ← 追加
  • hostsファイル確認
コマンド
cat hosts
編集内容
[root@smtptest09 etc]# cat hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
20.46.122.73 smtptest09.testoffice.work smtptest09
[root@smtptest09 etc]#

postfixパッケージ確認

コマンド
yum list installed | grep postfix
実行例
[root@smtptest09 ~]# yum list installed | grep postfix
postfix.x86_64                         2:2.10.1-9.el7                 @os
[root@smtptest09 ~]#

③postfix設定

設定ファイルバックアップ

  • ディレクトリ移動
コマンド
cd /etc/postfix/
  • バックアップ用ディレクトリ作成
コマンド
mkdir bk
  • ファイルコピー
コマンド
cp -p main.cf bk/main.cf_`date "+%Y%m%d_%H%M%S"`
  • バックアップ確認
コマンド
ls -l bk
実行例
[root@smtptest09 postfix]# ls -l bk
total 28
-rw-r--r--. 1 root root 27988 Nov 12  2020 main.cf_20210516_072602
[root@smtptest09 postfix]#

設定ファイル編集

  • 設定ファイル編集
コマンド
vim /etc/postfix/main.cf

viより見やすいvimを使用しています。

編集内容
#myhostname = host.domain.tld
myhostname = smtptest09.testoffice.work ← 追加

#mydomain = domain.tld
mydomain = testoffice.work ← 追加

#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
# inet_interfaces = localhost ← コメントアウト
inet_interfaces = all ← 追加

#mydestination = $myhostname, localhost.$mydomain, localhost ← コメントアウト
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#       mail.$mydomain, www.$mydomain, ftp.$mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain ← 追加

#home_mailbox = Mailbox
#home_mailbox = Maildir/
home_mailbox = Maildir/ ← 追加

設定例)

設定例
myhostname = smtptest09.testoffice.work
mydomain = testoffice.work
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/ 



【Postfixパラメーターについて】

パラメーター 詳細 設定例
myhostname サーバのホスト名を定義する。 myhostname = smtptest09.testoffice.work
mydomain メールドメイン名を定義する。 mydomain = testoffice.work
inet_interfaces メールを受信するIPアドレスを定義にする。
allの場合、全てのIPアドレスからメールを受信する。
inet_interfaces = all
mydestination メールの終着点を定義する。
宛名がこの値のどれかと一致すると、そのメールは該当するローカルフォルダに格納する。
mydestination = $myhostname,localhost.$mydomain,localhost, $mydomain
home_mailbox メールの格納先を定義する。自動的に送り先UNIXユーザのホームディレクトリパスが付け足される。 home_mailbox = Maildir/

設定ファイル確認

  • バックアップファイルと比較して差異に間違いがないか確認する。
コマンド
diff /etc/postfix/main.cf /etc/postfix/bk/main.cf_20210516_134754
実行例
[root@smtptest09 postfix]# diff /etc/postfix/main.cf /etc/postfix/bk/main.cf_20210516_134754
77d76
< myhostname = smtptest09.testoffice.work
85d83
< mydomain = testoffice.work
118,119c116
< #inet_interfaces = localhost
< inet_interfaces = all
---
> inet_interfaces = localhost
167c164
< #mydestination = $myhostname, localhost.$mydomain, localhost
---
> mydestination = $myhostname, localhost.$mydomain, localhost
171d167
< mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
424d419
< home_mailbox = Maildir/
[root@smtptest09 postfix]#
  • Postfixのmain.cfで読み込まれるパラメータを確認
コマンド
postconf -n

エラーが検知しないことを確認。

実行例
[root@smtptest09 postfix]# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
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
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = testoffice.work
myhostname = smtptest09.testoffice.work
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
unknown_local_recipient_reject_code = 550
[root@smtptest09 postfix]#

postfix起動/自動起動設定

  • postfix起動
コマンド
systemctl restart postfix
systemctl status postfix
実行例
[root@smtptest09 postfix]# systemctl restart postfix
[root@smtptest09 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 Sun 2021-05-16 13:52:23 UTC; 6s ago
  Process: 8564 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 8577 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 8575 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 8573 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 8649 (master)
   CGroup: /system.slice/postfix.service
           tq8649 /usr/libexec/postfix/master -w
           tq8650 pickup -l -t unix -u
           mq8651 qmgr -l -t unix -u

May 16 13:52:23 smtptest09.testoffice.work systemd[1]: Stopped Postfix Mail T...
May 16 13:52:23 smtptest09.testoffice.work systemd[1]: Starting Postfix Mail ...
May 16 13:52:23 smtptest09.testoffice.work postfix/master[8649]: daemon start...
May 16 13:52:23 smtptest09.testoffice.work systemd[1]: Started Postfix Mail T...
Hint: Some lines were ellipsized, use -l to show in full.
[root@smtptest09 postfix]#
  • postfix自動起動設定
コマンド
systemctl enable postfix
systemctl is-enabled postfix
実行例
[root@smtptest09 postfix]# systemctl enable postfix
[root@smtptest09 postfix]# systemctl is-enabled postfix
enabled
[root@smtptest09 postfix]#

メールユーザーを作成

メールユーザーmuserを作成する。

コマンド
sudo useradd muser
sudo passwd muser
cat /etc/passwd | grep muser
実行例
[root@smtptest09 postfix]# sudo useradd muser
[root@smtptest09 postfix]# sudo passwd muser
Changing password for user muser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@smtptest09 postfix]# cat /etc/passwd | grep muser
muser:x:1001:1001::/home/muser:/bin/bash
[root@smtptest09 postfix]#

④メール送信・受信確認

メール送信

任意のメーラーでmuser@testoffice.work宛にメールを送付
※今回はGmailにて送付

メール受信

  • メール受信確認
コマンド
cat /home/muser/Maildir/new/メールファイル名
コマンド例
cat /home/muser/Maildir/new/1621173481.V802I5172M495798.smtptest09.testoffice.work 
表示例
From: =?UTF-8?B?5L2Q6Jek6ZuF5Lq6?= <*******************@gmail.com>
Date: Sun, 16 May 2021 22:56:56 +0900
Message-ID: <CAFKx2UAn550ob5ngRFRPOi6uHF4829O=TA_Y+G+QwNhbStGmaQ@mail.gmail.com>
Subject: test
To: muser@testoffice.work
Content-Type: multipart/alternative; boundary="000000000000bf916505c272dcab"

--000000000000bf916505c272dcab
Content-Type: text/plain; charset="UTF-8"

test
mail
mail

--000000000000bf916505c272dcab
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">test<div>mail</div><div>mail</div></div>

--000000000000bf916505c272dcab--
  • メールログ確認
コマンド
tail /var/log/maillog
実行例(一部抜粋)
May 16 13:58:01 smtptest09 postfix/qmgr[8651]: 26FA4100026B: removed
May 16 13:58:01 smtptest09 postfix/smtpd[8725]: disconnect from mail-vs1-f41.google.com[209.85.217.41]
May 16 14:01:21 smtptest09 postfix/anvil[8727]: statistics: max connection rate 1/60s for (smtp:209.85.217.41) at May 16 13:58:00
May 16 14:01:21 smtptest09 postfix/anvil[8727]: statistics: max connection count 1 for (smtp:209.85.217.41) at May 16 13:58:00
May 16 14:01:21 smtptest09 postfix/anvil[8727]: statistics: max cache size 1 at May 16 13:58:00

さいごに

今回はAzure上のCentOSにPostfixを構築してみました。
何か一つでも参考になれば幸いです。

参考

【第1回】【EC2】PostfixでシンプルなSMTPサーバを構築してみる

Discussion