KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

メールシステムを構築してみる(Linux)

登録日 :2024/05/07 04:18
カテゴリ :Linux

RockyLinuxでメールのシステムを構築してみる。
設定に関して参考となるサイトは以下の通り。
参考リンク)link

1 ざっくり、メール配信の仕組みについての私の理解。

MTA:メール転送。SMTPでメールサーバーにメールを転送する
MDA:転送されたメールから、自分のメールを自分のMUAにダウンロード(配信)する。
MUA:outlook等のように、メールを書いたり読んだりするユーザインタフェース

2 プロトコル

POP3( Post Office Protocol 3)

  • メール受信の際に用いられるプロトコル
  • メールサーバに保存されたメールをユーザ端末にダウンロードして閲覧する

IMAP( Internet Message Access Protocol)

  • メール受信の際に用いられるプロトコル。
  • メールはメールサーバ上に保存し、ユーザはサーバ上に置かれたままの状態でメールを閲覧する。

3 Postfixインストール(SMTPサーバ)

3.1 postfix

postfixはデフォルトでインストール済みである

[root@node1 ~]# yum list installed postfix
インストール済みパッケージ
postfix.x86_64                           2:3.5.8-4.el8                           @anaconda
[root@node1 ~]# yum list postfix
メタデータの期限切れの最終確認: 0:00:30 前の 2024年05月06日 18時01分34秒 に実施しました
インストール済みパッケージ
postfix.x86_64                           2:3.5.8-4.el8                           @anaconda
利用可能なパッケージ
postfix.x86_64                           2:3.5.8-7.el8                           baseos
[root@node1 ~]#

updateがあるかもしれないので、念のため最新版にする

[root@node1 ~]# yum update postfix

アップグレード済み:
  postfix-2:3.5.8-7.el8.x86_64          postfix-perl-scripts-2:3.5.8-7.el8.x86_64

完了しました!
[root@node1 ~]#

3.2 postfixの設定

本来はDNSサーバでメールサーバの名前解決をするのであるが、今回はテストのため/etc/hostsにて名前解決をする。
まず、/etc/hostsにメールサーバの情報を追記する

[user01@mailtest1 Maildir]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.105 mailtest1
192.168.56.109 rockylinux_test_zabbix

/etc/postfix/main.cf にて以下の設定をする
- ホスト名の変更
96行目
myhostname = mail.mailtest1

     94 #myhostname = host.domain.tld
     95 #myhostname = virtual.domain.tld
     96 myhostname = mail.mailtest1
  • ドメイン名を変更
    mydomain = mailtest1
    102 #
    103 #mydomain = domain.tld
    104 mydomain = mailtest1
  • 許可インタフェースを全てに変更
    all のコメントアウトを外す
    localhost のコメントアウトする
    134 inet_interfaces = all
    135 #inet_interfaces = $myhostname
    136 #inet_interfaces = $myhostname, localhost
    137 #inet_interfaces = localhost
  • 独自ドメイン($mydomain)宛てのメールを受信できるように変更
    185 #mydestination = $myhostname, localhost.$mydomain, localhost
    186 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
  • メールボックスをMaildirを有効にする
    439 #home_mailbox = Mailbox
    440 home_mailbox = Maildir/
  • 送信元メールアドレスのサブドメイン部分(ホスト名の部分)を削除するオプション設定
    最下行に masquerade_domains = mailtest1を追記
    742 # add
    743 masquerade_domains = mailtest1
  • メール送信にhostsファイルを参照する設定
    smtp_host_lookup = native
    744 smtp_host_lookup = native

3.3 誤りチェック

  • 全設定値確認
    postconf

  • デフォルトから変更されている設定を確認
    postconf -n

  • 記述チェック
    postfix checkでエラーがなければ記述に問題なし

[root@node1 postfix]# postfix check
[root@node1 postfix]#

3.4 postfixの再起動

systemctl restart postfix

3.5 firewalldの設定変更

firewall-cmd --list-services
firewall-cmd --add-service=smtp --permanent
firewall-cmd --reload

[root@mailtest1 postfix]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
[root@mailtest1 postfix]# firewall-cmd --add-service=smtp --permanent
success
[root@mailtest1 postfix]# firewall-cmd --reload
success
[root@mailtest1 postfix]# firewall-cmd --list-services
cockpit dhcpv6-client smtp ssh
[root@mailtest1 postfix]#

3.5 SMTPの動作確認

rootから、user01へメールを送ってみる
telnet node1 25
もしくは
telnet localhost 25

[root@mailtest1 postfix]# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.mailtest1 ESMTP Postfix
HELO mailtest1
250 mail.mailtest1
mail from:root@mailtest1
250 2.1.0 Ok
rcpt to:user01@mailtest1
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test!!!!!!
.
250 2.0.0 Ok: queued as 2A2EC12D693A
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@mailtest1 postfix]#
  • user01にメールが来ていることを確認する
[root@mailtest1 postfix]# su - user01
l[user01@mailtest1 ~]$ ls
Maildir
[user01@mailtest1 ~]$ cd Maildir/
[user01@mailtest1 Maildir]$ ls
cur  new  tmp
[user01@mailtest1 Maildir]$ ls new
1714996634.Vfd00I872d2aM157873.mailtest1
[user01@mailtest1 Maildir]$ cat new/1714996634.Vfd00I872d2aM157873.mailtest1
Return-Path: <root@mailtest1>
X-Original-To: user01@mailtest1
Delivered-To: user01@mailtest1
Received: from mailtest1 (localhost [IPv6:::1])
        by mail.mailtest1 (Postfix) with SMTP id 2A2EC12D693A
        for <user01@mailtest1>; Mon,  6 May 2024 20:56:42 +0900 (JST)
Message-Id: <20240506115701.2A2EC12D693A@mail.mailtest1>
Date: Mon,  6 May 2024 20:56:42 +0900 (JST)
From: root@mailtest1

test!!!!!!
[user01@mailtest1 Maildir]$

※気づき:NISサーバとNFSでマウントしていたら、このテストはうまくいかない。なぜなら、user01のホームディレクトリをNFSサーバに作成されており、localhostで送った先のホームディレクトリとは別だったのである。。そのため、NISやNFSを構築しているサーバでは注意が必要だ。

  • mialコマンドを使ってメールを確認する
    ※事前にmailxをインストールしておく
[root@mailtest1 postfix]# yum install mailx
[user01@mailtest1 ~]$ mail -f ~/Maildir
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/home/user01/Maildir": 1 message 1 new
>N  1 root@mailtest1        Mon May  6 20:56  12/394
& 1
Message  1:
From root@mailtest1 Mon May  6 20:56:42 2024
Return-Path: <root@mailtest1>
X-Original-To: user01@mailtest1
Delivered-To: user01@mailtest1
Date: Mon,  6 May 2024 20:56:42 +0900 (JST)
From: root@mailtest1
Status: R

test!!!!!!

& q
"/home/user01/Maildir" complete
[user01@mailtest1 ~]$

既読したメールは、~/Maildir/newから消えてcurに移動する。

[user01@mailtest1 ~]$ ll
合計 0
drwx------. 5 user01 user01 39  5  6 20:57 Maildir
[user01@mailtest1 ~]$ ll Maildir
合計 0
drwx------. 2 user01 user01 58  5  6 21:54 cur
drwx------. 2 user01 user01  6  5  6 21:54 new
drwx------. 2 user01 user01  6  5  6 20:57 tmp
[user01@mailtest1 ~]$ ll Maildir/new
合計 0
[user01@mailtest1 ~]$ ll Maildir/cur
合計 4
-rw-------. 1 user01 user01 393  5  6 20:57 1714996634.Vfd00I872d2aM157873.mailtest1:2,S
[user01@mailtest1 ~]$

3.6 そのほか

  • Mailbox形式
    すべてのメールが一つのファイルに書き込まれる方式。
    デフォルトでは、/var/spool/mail/[ユーザ] ファイルにたまっていく。

  • Maildir形式
    メール一通ごとに一つのファイルに書き込まれる(別ファイル)
    ファイルが分かれるため、Mailbox形式のようなデメリットがない(ファイル肥大化や、データ消失リスク)

Postfixはどちらにも対応している。

また、/var/log/maillogにログが保存される。メールが届かないときには、こちらを確認する。

4 Dovecotインストール

4.1 Dovecot

デフォルトではインストールされていないので、dovecotをインストールする。

[root@mailtest1 ~]# yum install dovecot
[root@mailtest1 ~]# yum list installed dovecot
インストール済みパッケージ
dovecot.x86_64                           1:2.3.16-4.el8                            @appstream
[root@mailtest1 ~]#

4.2 Dovecotの設定1

/etc/dovecot/dovecot.conf にて設定を行う

  • 有効にするプロトコルの設定
    protocolsのコメントアウトを外す(POP3などを有効)
     23 # Protocols we want to be serving.
     24 #protocols = imap pop3 lmtp submission
     25 protocols = imap pop3
  • リッスンするインタフェースを指定
    コメントアウトを外して全インタフェースを許可する
     31 #listen = *, ::
     32 listen = *, ::
     33

4.3 Dovecotの設定2

/etc/dovecot/conf.d/10-mail.conf の設定を行う
locationで Maildirを有効化する

     23 #
     24    mail_location = maildir:~/Maildir
     25 #   mail_location = mbox:~/mail:INBOX=/var/mail/%u

4.4 Dovecotの設定3

/etc/dovecot/conf.d/10-auth.conf の設定を行う
平文を有効化する

     10 #disable_plaintext_auth = yes
     11 disable_plaintext_auth = no

4.5 Dovecotの設定4

/etc/dovecot/conf.d/10-ssl.conf の設定を行う
受信接続にSSLを使用しない

      8 #ssl = required
      9 ssl = no

4.6 Dovecotの再起動

設定を有効化するため、Dovecotを再起動する

[root@mailtest1 conf.d]# systemctl restart dovecot
[root@mailtest1 conf.d]# systemctl is-active dovecot
active
[root@mailtest1 conf.d]#

4.7 Firewallの設定

firewall-cmd --list-services
firewall-cmd --add-service=pop3 --permanent
firewall-cmd --add-service=imap --permanent
firewall-cmd --reload

[root@mailtest1 conf.d]# firewall-cmd --list-services
cockpit dhcpv6-client smtp ssh
[root@mailtest1 conf.d]# firewall-cmd --add-service=pop3 --permanent
success
[root@mailtest1 conf.d]# firewall-cmd --add-service=imap --permanent
success
[root@mailtest1 conf.d]# firewall-cmd --reload
success
[root@mailtest1 conf.d]# firewall-cmd --list-services
cockpit dhcpv6-client imap pop3 smtp ssh
[root@mailtest1 conf.d]#

4.8 動作チェック

POP3 -> telnet mailtest 110
IMPA -> telnet mailtest 143

以下のように、メールが参照できれば、POP3を使ってメールが取得できたことが確認できる。

[root@mailtest1 conf.d]# telnet mailtest1 110
Trying 192.168.56.105...
Connected to mailtest1.
Escape character is '^]'.
+OK Dovecot ready.
user user01
+OK
pass test@12345
+OK Logged in.
list
+OK 1 messages:
1 404
.
retr 1
+OK 404 octets
Return-Path: <root@mailtest1>
X-Original-To: user01@mailtest1
Delivered-To: user01@mailtest1
Received: from mailtest1 (localhost [IPv6:::1])
        by mail.mailtest1 (Postfix) with SMTP id 2A2EC12D693A
        for <user01@mailtest1>; Mon,  6 May 2024 20:56:42 +0900 (JST)
Message-Id: <20240506115701.2A2EC12D693A@mail.mailtest1>
Date: Mon,  6 May 2024 20:56:42 +0900 (JST)
From: root@mailtest1

test!!!!!!
.
logout
-ERR Unknown command: LOGOUT
quit
+OK Logging out.
Connection closed by foreign host.
[root@mailtest1 conf.d]#

今回のメールサーバの設定はこれでOK。

5 メールを送ってみよう

もう一台別のホストで2~4の設定を行い、合計2台のメールサーバをつくって、メールを飛ばしてみよう。

[root@mailtest1 conf.d]# su - user01
[user01@mailtest1 ~]$ mail user01@rockylinux_test_zabbix
Subject: Title
test message.
.
EOT
[user01@mailtest1 ~]$

ログを確認する

[root@mailtest1 conf.d]# cat /var/log/maillog
May  7 00:40:28 mailtest1 sendmail[10414]: My unqualified host name (mailtest1) unknown; sleeping for retry
May  7 00:41:28 mailtest1 sendmail[10414]: unable to qualify my own domain name (mailtest1) -- using short name
May  7 00:41:28 mailtest1 sendmail[10414]: 446FfSwJ010414: from=user01, size=234, class=0, nrcpts=1, msgid=<202405061541.446FfSwJ010414@mailtest1>, relay=user01@localhost
May  7 00:41:28 mailtest1 postfix/smtpd[10430]: connect from localhost[127.0.0.1]
May  7 00:41:28 mailtest1 postfix/smtpd[10430]: discarding EHLO keywords: CHUNKING
May  7 00:41:28 mailtest1 sendmail[10414]: STARTTLS=client, relay=[127.0.0.1], version=TLSv1.3, verify=FAIL, cipher=TLS_AES_256_GCM_SHA384, bits=256/256
May  7 00:41:28 mailtest1 postfix/smtpd[10430]: discarding EHLO keywords: CHUNKING
May  7 00:41:28 mailtest1 postfix/smtpd[10430]: 9A8BF12D690A: client=localhost[127.0.0.1]
May  7 00:41:28 mailtest1 postfix/cleanup[10433]: 9A8BF12D690A: message-id=<202405061541.446FfSwJ010414@mailtest1>
May  7 00:41:28 mailtest1 sendmail[10414]: 446FfSwJ010414: to=user01@rockylinux_test_zabbix, ctladdr=user01 (1000/1000), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30234, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 9A8BF12D690A)
May  7 00:41:28 mailtest1 postfix/qmgr[6504]: 9A8BF12D690A: from=<user01@mailtest1>, size=673, nrcpt=1 (queue active)
May  7 00:41:28 mailtest1 postfix/smtpd[10430]: disconnect from localhost[127.0.0.1] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
May  7 00:41:28 mailtest1 postfix/smtp[10434]: 9A8BF12D690A: to=<user01@rockylinux_test_zabbix>, relay=rockylinux_test_zabbix[192.168.56.109]:25, delay=0.38, delays=0.07/0.06/0.2/0.05, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 5E6E021C8207)
May  7 00:41:28 mailtest1 postfix/qmgr[6504]: 9A8BF12D690A: removed
[root@mailtest1 conf.d]#

送信先のサーバを見てみる.
Maildir/newに新規メールがある。

[user01@rockylinux_test_zabbix ~]$ ll Maildir/new
合計 4
-rw-------. 1 user01 user01 982  5  6 11:41 1715010089.Vfd00I21c821dM413719.rockylinux_test_zabbix
[user01@rockylinux_test_zabbix ~]$

中身を確認すると、きちんとメールが受信できている。

[user01@rockylinux_test_zabbix ~]$ mail -f Maildir/
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"Maildir/": 2 messages 1 new
    1 root@rockylinux_test  Mon May  6 10:51  12/501
>N  2 user01                Mon May  6 11:41  24/983   "Title"
& 2
Message  2:
From user01@mailtest1 Mon May  6 11:41:29 2024
Return-Path: <user01@mailtest1>
X-Original-To: user01@rockylinux_test_zabbix
Delivered-To: user01@rockylinux_test_zabbix
From: user01 <user01@mailtest1>
Date: Tue, 07 May 2024 00:40:28 +0900
To: user01@rockylinux_test_zabbix
Subject: Title
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
Status: R

test message.

& q
"Maildir/" complete
[user01@rockylinux_test_zabbix ~]$

これで、別のドメインのメールサーバ間でメールの送受信ができることが確認できた。