VirtualBoxを使用してメールサーバー、DNSサーバーの構築

## やりたいこと
- メールサーバーの構築
- DNSサーバーの構築
- クライアント１からクライアント２にメールを送信
  ![構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636718/e1fa3094-7bab-28af-2604-ad6cc131f633.jpeg)

## 環境

バーチャルボックス: 7.0.0
ゲストOS:Alma Linux

メールサーバー:192.168.56.106 mailserver.linux.com

DNSサーバー:192.168.56.104 DNS-server.linux.com

クライアント１:192.168.56.109 client1.linux.com

クライアント２: 192.168.56.108 client2.linux.com

## メールサーバー
postfixをインストール
`yum install -y postfix`

再起動しても自動で起動するように設定する。
`systemctl enable postfix`

現在の状態を確認
`systemctl status postfix`

Activeと表示されていればＯＫ
main.cfを編集
`vi /etc/postfix/main.cf`
下記の項目を編集
- myhostname = [ホスト名] mailserver.linux.com
- mydomain = [ドメイン名] linux.com
- myorigin = $mydomain
- inet-interfaces = all 全てのインターフェイスで受け付ける
- mydestination = \\$myhostname, localhost.\\$mydomain, localhost, $mydomain
- mynetworks = 所属するNW 192.168.56.0/24
- home_mailbox = Maildir/

postfixを再起動する。
`systemctl restart postfix`

次にdovecotのインストールする
`yum install -y dovecot`

設定ファイルの編集をする。

`vi /etc/dovecot/dovecot.conf`
protocols = imap pop3 lmtp
にする。

`vi /etc/dovecot/conf.d/10-mail.conf`
mail_location = maildir:~/Maildir
にする

`vi /etc/dovecot/conf.d/10-master.conf`
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail　★ここで指定するユーザーが存在しないと※１のエラーが発生する。
    # Assuming the default Postfix user and group
    group = postfix
  }

  \# Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}
にする。

dovecotを再起動する。
`systemctl restart dovecot`

※１
dovecot[2606]: Fatal: service(auth) User doesn't exist: vmail (See service auth { unix_listener /run/dovecot/auth-userdb { user } } setting)
dovecot[2606]: master: Fatal: service(auth) User doesn't exist: vmail (See service auth { unix_listener /run/dovecot/auth-userdb { user } } setting)

# クライアント１、クライアント２の設定

`vi /etc/resolv.conf`
search linux.com next.linux.com
nemaeserver dnsサーバーのIPアドレス(192.168.56.104)

nameserverがないとDNSに問い合わせができない。
ない場合は/etc/hostsを参照する。

この設定で、システムがserver1というホスト名を解決しようとすると、まずはserver1.linux.comとして解決を試みます。もしserver1.linux.comが見つからない場合、次にserver1.next.linux.comとして解決を試みます。

searchオプションを使用することで、ユーザーは部分的なホスト名をタイプするだけで、フルのドメイン名をタイプする手間を省くことができます。

つまりsearchに指定している検索したいもの＋searchのドメインとなる

## DNSサーバー

bindをインストール
`yum install -y bind bind-utils`

/etc/named.confでゾーン情報について定義をする。
`vi /etc/named.conf`
```
options {
    ~~省略~~
    listen-on port 53 { any; };
    ~~省略~~
}

zone "linux.com" IN {
        type master;
        file "forward.linux.com";
};
```

nemed.confの構文をチェックする
`named-checkconf`
何も結果がかえって来なければOK

名前解決を行うためにレコードを追加する。
`vi /var/named/forward.linux.com`
```
$TTL 1D
@       IN SOA  DNS-server.linux.com. root.linux.com. (
                                        2023061101      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      DNS-server.linux.com.
DNS-server.linux.com.   IN      A       192.168.56.104
@       IN      MX      10      mailserver
mailserver      IN      A       192.168.56.106
client1         IN      A       192.168.56.109
client2         IN      A       192.168.56.108
```

@はオリジンに置き換わります。
どういうことかというと/etc/named.confで設定したzone "linux.com"に置き換わります。
つまり@ IN SOAは linux.com. IN SOAと同じ意味になる。

ゾーンファイルの構文をチェックする。
`named-checkzone linux.com /var/named/forward.linux.com`
引数の1つ目はドメイン、2つ目の引数はゾーンファイルの場所
今回はOKと表示されればOK

namedのリロード
`systemctl reload named`

実際に名前解決ができるかDNSサーバーでdigコマンドで確認する。
`dig @localhost mailserver.linux.com`
```
～～省略～～
;; ANSWER SECTION:
mailserver.linux.com.   86400   IN      A       192.168.56.106
～～省略～～
```
と返ってくれば名前解決はできている。
今回は自分自身（@localhost）にあるドメインで名前解決できる確認する。

クライアント１からメールサーバーの名前解決ができるか確認をする。
`dig mailserver.linux.com`
```
～～省略～～
;; ANSWER SECTION:
mailserver.linux.com.   86400   IN      A       192.168.56.106
～～省略～～
```
と返ってくれば名前解決ができている。

## メールを送ってみる

クライアント１→クライアント２に送ってみる
中継でメールサーバーを経由する設定になっているので、クライアント１→メールサーバー→クライアント２という経路でメールが送られる。

```
[root@client1 ~]# sendmail client2@linux.com
From:root@client1.linux.com
To:client2@linux.com
Subject:test
this is test mail
.
```

ログを見てみる

```
[root@client1 ~]# cat /var/log/maillog
Jun 28 18:35:01 client1 postfix/pickup[2217]: 6A9C9319FEB4: uid=0 from=<root>
Jun 28 18:35:01 client1 postfix/cleanup[2312]: 6A9C9319FEB4: message-id=<20230628093501.6A9C9319FEB4@client1.linux.com>
Jun 28 18:35:01 client1 postfix/qmgr[1108]: 6A9C9319FEB4: from=<root@client1.linux.com>, size=307, nrcpt=1 (queue active)
Jun 28 18:35:01 client1 postfix/smtp[2314]: 6A9C9319FEB4: to=<user1@client2.linux.com>, relay=mailserver.linux.com[192.168.56.106]:25, delay=35, delays=35/0.07/0.06/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 480843103628)
Jun 28 18:35:01 client1 postfix/qmgr[1108]: 6A9C9319FEB4: removed
```

**480843103628**のキュー番号でメールサーバーに送っているのが分かる。
`relay=mailserver.linux.com`

次にメールサーバーにもメールが届いているか確認する。
```
[root@mailserver ~]# cat /var/log/maillog | grep 480843103628
Jun 26 03:52:42 mailserver postfix/smtpd[3094]: 480843103628: client=unknown[192.168.56.109]
Jun 26 03:52:42 mailserver postfix/cleanup[3098]: 480843103628: message-id=<20230628093501.6A9C9319FEB4@client1.linux.com>
Jun 26 03:52:42 mailserver postfix/qmgr[2597]: 480843103628: from=<root@client1.linux.com>, size=503, nrcpt=1 (queue active)
Jun 26 03:52:42 mailserver postfix/smtp[3099]: 480843103628: to=<user1@client2.linux.com>, relay=client2.linux.com[192.168.56.108]:25, delay=0.26, delays=0.03/0.08/0.1/0.05, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as C7BE12205436)
Jun 26 03:52:42 mailserver postfix/qmgr[2597]: 480843103628: removed
```

**C7BE12205436**というキュー番号でuser1@client2.linux.comにメールを送信していることがわかる。

クライアント２にメールが届いているか確認する。

```
[root@client1 ~]# cat /var/log/maillog | grep C7BE12205436
Jun 28 18:35:01 client1 postfix/smtpd[2034]: C7BE12205436: client=unknown[192.16                                                                                                                                                             8.56.106]
Jun 28 18:35:01 client1 postfix/cleanup[2039]: C7BE12205436: message-id=<20230628093501.6A9C9319FEB4@client1.linux.com>
Jun 28 18:35:01 client1 postfix/qmgr[988]: C7BE12205436: from=<root@client1.linux.com>, size=699, nrcpt=1 (queue active)
Jun 28 18:35:01 client1 postfix/smtpd[2034]: disconnect from unknown[192.168.56.106] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Jun 28 18:35:01 client1 postfix/local[2040]: C7BE12205436: to=<user1@client2.linux.com>, relay=local, delay=0.06, delays=0.03/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Jun 28 18:35:01 client1 postfix/qmgr[988]: C7BE12205436: removed
```

status=sent(delivered to mailbox)となっているのでメールボックスに届いていることが分かる。
メールボックスを確認する。

```
[root@client2 ~]# cat /var/spool/mail/user1
From root@client1.linux.com  Wed Jun 28 18:35:01 2023
Return-Path: <root@client1.linux.com>
X-Original-To: user1@client2.linux.com
Delivered-To: user1@client2.linux.com
Received: from mailserver.linux.com (unknown [192.168.56.106])
        by client2.linux.com (Postfix) with ESMTPS id C7BE12205436
        for <user1@client2.linux.com>; Wed, 28 Jun 2023 18:35:01 +0900 (JST)
Received: from client1.linux.com (unknown [192.168.56.109])
        by mailserver.linux.com (Postfix) with ESMTPS id 480843103628
        for <user1@client2.linux.com>; Mon, 26 Jun 2023 03:52:42 +0900 (JST)
Received: by client1.linux.com (Postfix, from userid 0)
        id 6A9C9319FEB4; Wed, 28 Jun 2023 18:35:01 +0900 (JST)
From:root@client1.linux.com
To:user1@client2.linux.com
Subject:test
Message-Id: <20230628093501.6A9C9319FEB4@client1.linux.com>
Date: Wed, 28 Jun 2023 18:34:26 +0900 (JST)

this is test
```

Received: from mailserver.linux.com (unknown [192.168.56.106])となっている
なぜ192.168.56.106はmailserver.linux.comと分かっているのにunknownなのか？

これは逆引きで名前解決しようとしたときに名前解決ができなかった事が原因
なので逆引きができるようにする。

namedの設定ファイルを編集する。
`vi /etc/named.conf`

zone "56.168.192.in-addr.arpa" IN {
        type master;
        file "reverse.linux.com";
};
を追記

zone名は192.168.56.0/24の逆引きの名前解決を行うファイルです。
IPアドレスを逆から書きます。ホスト部の部分はファイル名に含めません。

`named-checkconf`を実行して問題がないことを確認する。

56.168.192.in-addr-arpaを/var/namedに作成し、以下の内容を追記する。（通常のゾーンファイルと同じ場所）

$TTL 1D
@       IN SOA  DNS-server.linux.com root.linux.com (
                                        2023061101      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

@       IN      NS      DNS-server.linux.com.
4       IN      PTR     DNS-server.linux.com.
6       IN      PTR     test.mailserver.linux.com.
9       IN      PTR     client1.linux.com.
8       IN      PTR     client2.linux.com.
を追記する。

逆引きができるか確認してみる。
client1で逆引きができるか確認してみる
`dig -x 192.168.56.109`
;; ANSWER SECTION:
109.56.168.192.in-addr.arpa. 86400 IN   PTR     client1.linux.com.

逆引きができたので、もう一度クライアント１→クライアント２にメールをしてみて先ほどのunknownがちゃんと対象のドメインで表示される確認する。


```
[user1@client1 ~]$ cd /var/spool/mail/user1
-bash: cd: /var/spool/mail/user1: ディレクトリではありません
[user1@client1 ~]$ cd /var/spool/mail
[user1@client1 mail]$ more user1 | tail -10
Received: by client1.linux.com (Postfix, from userid 0)
        id CED27319FEB4; Fri, 30 Jun 2023 00:12:39 +0900 (JST)
From:root@client1.linux.com
To:user1@client2.linux.com
Subject:test
Message-Id: <20230629151239.CED27319FEB4@client1.linux.com>
Date: Fri, 30 Jun 2023 00:11:52 +0900 (JST)
```