超シンプル！centos7、ローカル環境でsendmail、DNSサーバ構築

## はじめに
Linuxでメールサーバ、DNSサーバの勉強を始めましたが、
情報サイトはいろいろあるものの、私には難易度高過ぎ！ 
なので、自分で試行錯誤して作ってみました。

セキュリティを度外視した、閉じたLAN内限定で、
限界まで設定を削ぎ落とした超シンプル構成です。  


## 構成
|  用途 |ユーザ名 |IPアドレス  |メールアドレス|
| ---- | ---- |---- |---- |
|メール送信サーバ|c10|192.168.65.10/24|-|
|DNSサーバ|c53|192.168.65.53/24|-|
|メール受信サーバ|c20|192.168.65.20/24| c20@test.test|
![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491652/00252bd4-e247-a9f8-3046-aeb60c35c5f9.png)
![環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491652/184ecef3-bcb4-0d5e-e8cf-26a62dec600e.png)


PC1台(Windows2012ServerR2)、VMware Workstation 15 Player、centos7.7を使用しました。
PC3台にcentosを導入した構成でもOKです。



## VMware新規仮想マシンのインストール、設定[c10、c20、c53]

以降、アドレス、ユーザ名はそれぞれのサーバにあわせて、読み替えてください。

・新規仮想マシンの作成
　インストール先:ローカルの標準ディスク
　日本語選択

・rootパスワード:c10
　確認:c10

・ユーザの作成
　フルネーム:c10
　ユーザ名:c10
　パスワード:c10
　パスワードの確認:c10
　このユーザを管理者にする:チェック

・ネットワークアダプタ
　NAT:ホストのIPを共有して使用


## VMwareでネットワーク設定[c10、c20、c53]
```
[root@localhost c10/c53/c20]# nmcli connection modify ens33 ipv4.addresses 192.168.65.10/24 ### IPアドレス設定
[root@localhost c10/c53/c20]# nmcli connection modify ens33 ipv4.method manual　　　　　　   ### IP固定割り当てに設定
[root@localhost c10/c53/c20]# nmcli connection modify ens33 connection.autoconnect yes　　  ### 自動起動
[root@localhost c10/c53/c20]# nmcli connection down ens33　　　　　　　　　　　　　　　　　　  ### インターフェース再起動                     　　　　　　　   　　　　　　　　　　　　　　　　　　
[root@localhost c10/c53/c20]# nmcli connection up ens33　　　　　　　　　　　　　　　　　　　  ### インターフェース再起動                     
[root@localhost c10/c53/c20]# nmcli connection modify ens33 ipv4.dns 8.8.8.8
[root@localhost c10/c53/c20]# nmcli connection modify ens33 ipv4.gateway 192.168.65.2
[root@localhost c10/c53/c20]# systemctl restart network　　　　　　　　　　　　　　　　　　　  ### ネットワーク再起動
```

```
[root@localhost c10]# ip add show
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:84:a7:43 brd ff:ff:ff:ff:ff:ff
    inet 192.168.65.10/24 brd 192.168.65.255 scope global noprefixroute ens33
```
→以降の作業は、teratermなどターミナルソフトにて、それぞれのマシンにssh接続します。







## Firewall無効化[c10、c20、c53]
```
[root@localhost c10/c53/c20]# systemctl stop firewalld      ### サービス停止
[root@localhost c10/c53/c20]# systemctl status firewalld    ### サービス状態確認
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 日 2020-01-05 15:34:19 JST; 979ms ago
     Docs: man:firewalld(1)
```
→inactiveであることを確認します。




## SELinux無効化[c10、c20、c53]
```
[root@localhost c10/c53/c20]# vi /etc/selinux/config
# 30行目：enforcingから修正
SELINUX=disabled
```
→SELinuxは、
「Linuxのカーネルに強制アクセス制御機能を付加するモジュール」とのことですが、
 　今回は不要なので、停止します。











## 各種ソフト導入[c10、c20、c53]
```
[root@localhost c53]# yum install bind 　　　　　　　　　　   ### DNSサーバ
```
```
[root@localhost c10/c53/c20]# yum install telnet
[root@localhost c10/c53/c20]# yum install bind-utils        ### digコマンド
[root@localhost c10/c53/c20]# yum install tcpdump
```
```
[root@localhost c10/c20]# yum install sendmail sendmail-cf  ### メールサーバ
[root@localhost c10/c20]# yum install mailx　　　　　　　　   ### メール送受信に使用
```

各種ソフトを導入し終えたら、DNS設定を内向き、新DNSサーバ向けにします。
インターネット側のポートを抜線、遮断するなど、LAN内(192.168.65.x/24)に通信を閉じます。

```
[root@localhost c10/c53/c20]# nmcli connection modify ens33 ipv4.dns 192.168.65.53
[root@localhost c10/c53/c20]# systemctl restart network
```







## メールサーバソフト確認[C10、c20]
メールサーバソフトとしてsendmailを使用しているか、確認します。

```
[root@localhost c20]# alternatives --config mta
2 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
   1           /usr/sbin/sendmail.postfix
*+ 2           /usr/sbin/sendmail.sendmail

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
```
→sendmailを選択します。

```
[root@localhost c10/c20]# systemctl stop postfix
```
→postfixがインストールされている場合は停止します。
## メール送信サーバ設定[c10] 
送信サーバはsendmailインストールだけで、追加設定は不要です。

```
[root@localhost c10]# systemctl start sendmail    ### サービス起動
[root@localhost c10]# systemctl status sendmail   ### サービス状態確認
● sendmail.service - Sendmail Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/sendmail.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2020-01-05 19:33:58 JST; 7h ago
```
→active (running) を確認します。


## メール受信サーバ設定[c20] 

```
[root@localhost c20]# vi /etc/mail/local-host-names
test.test
```
→test.testドメインに送信されたメールを受信するように設定します。

```
[root@localhost c20]# vi /etc/mail/sendmail.mc
# 118行目：すべてのアドレスから受信に変更
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0,  Name=MTA')dnl　
# 157行目：ドメイン名変更
LOCAL_DOMAIN(`test.test')dnl
```
```
[root@localhost c20]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf ### 設定反映
```
```
[root@localhost c20]# systemctl restart sendmail  ### サービス再起動
[root@localhost c20]# systemctl status sendmail 　### サービス状態確認
● sendmail.service - Sendmail Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/sendmail.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2020-01-05 19:03:58 JST; 1s ago
  Process: 2252 ExecStart=/usr/sbin/sendmail -bd $SENDMAIL_OPTS $SENDMAIL_OPTARG (code=exited, status=0/SUCCESS)
```
→active (running) を確認します。



## DNSサーバ設定[c53]

```
[root@localhost c53]# vi /etc/named.conf
options {
        listen-on port 53    { any; };
        listen-on-v6 port 53 { none; };
        directory            "/var/named";
        allow-query          { localhost; 192.168.65/24; };
        allow-transfer       { localhost; 192.168.65/24; };
        recursion no;
};
zone "test.test" IN {
       type master;
       file "test.test.lan";
};
```

```
[root@localhost c53]# vi /var/named/test.test.lan
$TTL 86400
test.test.     3600    IN SOA  NS.test.test. hoge.gmail.com.(
                       2003031401      ; Serial
                       3600            ; Refresh
                       1800            ; Retry
                       604800          ; Expire
                       86400 )         ; Minimum TTL

test.test.     3600    IN NS  NS.test.test.
NS.test.test.  3600    IN A   192.168.65.53

test.test.     3600    IN MX  10 c20.test.test.
c20.test.test. 3600    IN A   192.168.65.20
```
```
[root@localhost c53]# systemctl restart named　 ### サービス起動
[root@localhost c53]# systemctl status named　　### サービス状態確認
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2020-01-05 19:18:10 JST; 9s ago
  Process: 2235 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
```
→active (running) を確認します。

## メール送信(C10)
```
[root@localhost c10]# echo "あなたへの8930万円の融資が決定致しました。" | mail -s "拘束銀行からのご連絡" -S smtp=smtp://192.168.65.20:25 -r HOGE@HOGE c20@test.test
```
→c10にてhogeドメインのユーザhogeを送信元として、
 　test.testドメインのユーザc20へメール送信します。




## メール受信(C20) 
メールを受信しているか確認します。

```
[root@localhost c20]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/c20": 1 messages 1 new
>N  1 HOGE@HOGE              Sun Jan  5 20:10  18/593   "拘束銀行からのご連絡"
& 1
Message  1:
From HOGE@HOGE  Sun Jan  5 20:10:14 2020
Return-Path: <HOGE@HOGE>
Date: Sun, 05 Jan 2020 20:10:14 +0900
From: HOGE@HOGE
To: c20@test.test
Subject: 拘束銀行からのご連絡
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=utf-8
Status: R

あなたへの8930万円の融資が決定致しました。

&

```


```
[root@localhost c20]# less /var/spool/mail/c20

From HOGE@HOGE  Sun Jan  5 20:10:14 2020
Return-Path: <HOGE@HOGE>
Received: from localhost ([192.168.65.10])
        by localhost.localdomain (8.14.7/8.14.7) with SMTP id 005BAEtA010237
        for <c20@test.test>; Sun, 5 Jan 2020 20:10:14 +0900
Date: Sun, 05 Jan 2020 20:10:14 +0900
From: HOGE@HOGE
To: c20@test.test
Subject: =?utf-8?B?6YqA6KGM44GL44KJ44Gu44GU6YCj57Wh?=
Message-ID: <5e11c416.CV3MXjGt/CAjqiTp%HOGE@HOGE>
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Status: RO

あなたへの8930万円の融資が決定致しました。

(END)
```

```
[root@localhost c20]# less /var/log/maillog
Jan  5 20:10:14 localhost sendmail[10237]: 005BAEtA010237: from=<HOGE@HOGE>, size=349, class=0, nrcpts=1, msgid=<5e11c416.CV3MXjGt/CAjqiTp%HOGE@HOGE>, proto=SMTP, daemon=MTA, relay=[192.168.65.10]
Jan  5 20:10:14 localhost sendmail[10238]: 005BAEtA010237: to=<c20@test.test>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30522, dsn=2.0.0, stat=Sent
```
→届きました!







## トラブルシューティング
```
[root@localhost c10]# ping 192.168.65.20
PING 192.168.65.20 (192.168.65.20) 56(84) bytes of data.
64 bytes from 192.168.65.20: icmp_seq=1 ttl=64 time=1.34 ms
64 bytes from 192.168.65.20: icmp_seq=2 ttl=64 time=0.214 ms
```
→成功例。

```
[root@localhost c10]# ping c20.test.test
PING c20.test.test (192.168.65.20) 56(84) bytes of data.
64 bytes from 192.168.65.20 (192.168.65.20): icmp_seq=1 ttl=64 time=1.21 ms
64 bytes from 192.168.65.20 (192.168.65.20): icmp_seq=2 ttl=64 time=0.895 ms
```
→成功例。

```
[root@localhost c10]# ping c20.test.test
ping: c20.test.test: 名前またはサービスが不明です
```
→失敗例。DNSでの名前解決がうまく出来ていません。

```
[root@localhost c10]# dig test.test any

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> test.test any
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32366
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.test.                     IN      ANY

;; ANSWER SECTION:
test.test.              3600    IN      SOA     NS.test.test. test.gmail.com. 2003031401 3600 1800 604800 86400
test.test.              3600    IN      NS      NS.test.test.
test.test.              3600    IN      MX      10 c20.test.test.

;; ADDITIONAL SECTION:
NS.test.test.           3600    IN      A       192.168.65.53
c20.test.test.          3600    IN      A       192.168.65.20

;; Query time: 0 msec
;; SERVER: 192.168.65.53#53(192.168.65.53)
;; WHEN: 日  1月 05 22:00:59 JST 2020
;; MSG SIZE  rcvd: 157
```
→成功例。

```
[root@localhost c10]# telnet 192.168.65.20 25
Trying 192.168.65.20...
Connected to 192.168.65.20.
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.14.7/8.14.7; Sun, 5 Jan 2020 22:02:10 +0900
```
→成功例。

```
[root@localhost c10]# telnet 192.168.65.20 25
Trying 192.168.65.20...
telnet: connect to address 192.168.65.20: No route to host
[root@localhost c10]#
```
→失敗例。何らかの問題で接続出来ていません。

```
[root@localhost c20]# tcpdump -p -i ens33 host 192.168.65.10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
22:13:23.245337 IP 192.168.65.10.40542 > localhost.localdomain.smtp: Flags [S], seq 4220477456, win 29200, options [mss 1460,sackOK,TS val 29769713 ecr 0,nop,wscale 7], length 0
22:13:23.245399 IP localhost.localdomain.smtp > 192.168.65.10.40542: Flags [S.], seq 932260319, ack 4220477457, win 28960, options [mss 1460,sackOK,TS val 14031906 ecr 29769713,nop,wscale 7], length 0
22:13:23.245599 IP 192.168.65.10.40542 > localhost.localdomain.smtp: Flags [.], ack 1, win 229, options [nop,nop,TS val 29769714 ecr 14031906], length 0
22:13:23.278032 IP localhost.localdomain.smtp > 192.168.65.10.40542: Flags [P.], seq 1:89, ack 1, win 227, options [nop,nop,TS val 14031939 ecr 29769714], length 88: SMTP: 220 localhost.localdomain ESMTP Sendmail 8.14.7/8.14.7; Sun, 5 Jan 2020 22:13:23 +0900
22:13:23.278447 IP 192.168.65.10.40542 > localhost.localdomain.smtp: Flags [.], ack 89, win 229, options [nop,nop,TS val 29769746 ecr 14031939], length 0
22:13:23.279887 IP 192.168.65.10.40542 > localhost.localdomain.smtp: Flags [P.], seq 1:17, ack 89, win 229, options [nop,nop,TS val 29769747 ecr 14031939], length 16: SMTP: HELO localhost
```
→成功例。
## 参考サイト
・sendmailの送受信設定、ローカルで送受信テスト（Sendmail, BJD）
https://qiita.com/takahashi-kazuki/items/7eb41bbc0edaa2b81caf  

・【CentOS7】sendmail 基本設定 | server-memo.net
https://www.server-memo.net/server-setting/sendmail/sendmail-setting_centos7.html

・第64回DNS(3) リソースレコードタイプ
http://www5e.biglobe.ne.jp/aji/3min/64.html

## おわりに
最低限の設定で、メール送受信できました！
学習をすすめ、セキュリティ向上、逆引きなど、設定を追加していきます！
本投稿がどなたかのお役に立てれば幸いです！