下記は、access_dbやmailertableの説明が詳しく書かれている
■構成
・postfix1を動作させるホスト
※access_dbでsendmailにリレー許可されていてsendmailが受信したメールをAaliasesによって転送する転送先MTA
ホスト名:pc3_centos7_k1
DNS上のA:mail.postfix1.local
メモリ:2GB
CPU:2コア
OS:CentOS7.3
IPアドレス:192.168.101.31
・postfix2を動作させるホスト
※access_dbでsendmailにリレー許可されているMTA
ホスト名:pc3_centos7_k2
DNS上のA:mail.postfix2.local
メモリ:2GB
CPU:2コア
OS:CentOS7.3
IPアドレス:192.168.101.32
・postfix3を動作させるホスト
※access_dbでsendmailにリレー許可されていないMTA
ホスト名:pc3_centos7_k3
DNS上のA:mail.postfix3.local
メモリ:2GB
CPU:2コア
OS:CentOS7.3
IPアドレス:192.168.101.33
・sendmail、bindを動作させるホスト
ホスト名:pc3_centos7_k4
DNS上のA:mail.sendmail1.local
メモリ:1GB
CPU:1コア
OS:CentOS7.3
IPアドレス:192.168.101.34
・postfix0を動作させるホスト
※インターネット上のMTAを想定
ホスト名:optiplex3020
DNS上のA:mail.postfix0.local
メモリ:8GB
CPU:4コア
OS:CentOS7.8
IPアドレス:192.168.100.2
■構築
・bind構築
主にsendmailが引くDNSサーバをsendmailと同じホスト(pc3_centos7_k4)に構築。
[root@pc3_centos7_k4 named]# rpm -q bind
bind-9.11.4-26.P2.el7_9.3.x86_64
[root@pc3_centos7_k4 etc]# pwd
/etc
[root@pc3_centos7_k4 etc]# diff named.conf.org named.conf
13c13
< listen-on port 53 { 127.0.0.1; };
---
> listen-on port 53 { 192.168.101.34; };
21c21
< allow-query { localhost; };
---
> allow-query { 192.168.0.0/16; };
29c29
< cause your server to become part of large scale DNS amplification
---
> cause your server to b.locale part of large scale DNS amplification
57a58,83
>
> zone "postfix0.local" IN {
> type master;
> file "postfix0.zone";
> };
>
> zone "postfix1.local" IN {
> type master;
> file "postfix1.zone";
> };
>
> zone "postfix2.local" IN {
> type master;
> file "postfix2.zone";
> };
>
> zone "postfix3.local" IN {
> type master;
> file "postfix3.zone";
> };
>
> zone "sendmail1.local" IN {
> type master;
> file "sendmail1.zone";
> };
[root@pc3_centos7_k4 named]# pwd
/var/named
[root@pc3_centos7_k4 named]# ll
合計 36
drwxrwx---. 2 named named 23 1月 12 05:24 data
drwxrwx---. 2 named named 60 1月 12 07:30 dynamic
-rw-r-----. 1 root named 2253 4月 5 2018 named.ca
-rw-r-----. 1 root named 152 12月 15 2009 named.empty
-rw-r-----. 1 root named 152 6月 21 2007 named.localhost
-rw-r-----. 1 root named 168 12月 15 2009 named.loopback
-rw-r-----. 1 root named 261 1月 12 07:28 postfix0.zone
-rw-r-----. 1 root named 263 1月 12 07:28 postfix1.zone
-rw-r-----. 1 root named 261 1月 12 07:29 postfix2.zone
-rw-r-----. 1 root named 261 1月 12 07:29 postfix3.zone
-rw-r-----. 1 root named 261 1月 12 07:27 sendmail1.zone
drwxrwx---. 2 named named 6 12月 16 01:32 slaves
[root@pc3_centos7_k4 named]# cat sendmail1.zone
$TTL 1D
@ IN SOA ns.sendmail1.local. root.sendmail1.local.(
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.sendmail1.local.
ns A 192.168.101.34
mail A 192.168.101.34
@ MX 10 mail.sendmail1.local.
[root@pc3_centos7_k4 named]# cat postfix0.zone
$TTL 1D
@ IN SOA ns.sendmail1.local. root.sendmail1.local.(
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.sendmail1.local.
ns A 192.168.101.34
mail A 192.168.100.2
@ MX 10 mail.postfix0.local.
[root@pc3_centos7_k4 named]# cat postfix1.zone
$TTL 1D
@ IN SOA ns.sendmail1.local. root.sendmail1.local.(
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.sendmail1.local.
ns A 192.168.101.34
mail A 192.168.101.31
@ MX 10 mail.postfix1.local.
[root@pc3_centos7_k4 named]# cat postfix2.zone
$TTL 1D
@ IN SOA ns.sendmail1.local. root.sendmail1.local.(
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.sendmail1.local.
ns A 192.168.101.34
mail A 192.168.101.2
@ MX 10 mail.postfix2.local.
[root@pc3_centos7_k4 named]# cat postfix3.zone
$TTL 1D
@ IN SOA ns.sendmail1.local. root.sendmail1.local.(
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.sendmail1.local.
ns A 192.168.101.34
mail A 192.168.101.3
@ MX 10 mail.postfix3.local.
[root@pc3_centos7_k4 named]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.101.34
[root@pc3_centos7_k4 named]# cat /etc/NetworkManager/NetworkManager.conf
---(略)---
[main]
dns=none
---(略)---
・postfix0構築(インターネット上のMTA)
[root@optiplex3020 postfix]# rpm -q postfix
postfix-2.10.1-9.el7.x86_64
[root@optiplex3020 postfix]# pwd
/etc/postfix
[root@optiplex3020 postfix]# diff main.cf.org main.cf
75c75
< #myhostname = host.domain.tld
---
> myhostname = mail.postfix0.local
83a84
> mydomain = postfix0.local
98c99
< #myorigin = $myhostname
---
> myorigin = $myhostname
113c114
< #inet_interfaces = all
---
> inet_interfaces = all
116c117
< inet_interfaces = localhost
---
> #inet_interfaces = localhost
119c120,121
< inet_protocols = all
---
> #inet_protocols = all
> inet_protocols = ipv4
164,165c166,167
< mydestination = $myhostname, localhost.$mydomain, localhost
< #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
---
> #mydestination = $myhostname, localhost.$mydomain, localhost
> mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
250c252
< #mynetworks_style = subnet
---
> mynetworks_style = subnet
264c266
< #mynetworks = 168.100.189.0/28, 127.0.0.0/8
---
> mynetworks = 192.168.100.0/24, 127.0.0.0/8
419c421
< #home_mailbox = Maildir/
---
> home_mailbox = Maildir/
[root@optiplex3020 postfix]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.101.34
[root@optiplex3020 postfix]#cat /etc/NetworkManager/NetworkManager.conf
---(略)---
[main]
dns=none
---(略)---
・postfix1構築(sendmeilの転送先)
※リゾルバはpostfix0と同じ
※main.cfはpostfix0とだいたい同じ
・postfix2構築(sendmeilでリレー許可されてるMTA)
※リゾルバはpostfix0と同じ
※main.cfはpostfix0とだいたい同じ
・postfix3構築(sendmeilでリレー許可されていないMTA)
※リゾルバはpostfix0と同じ
※main.cfはpostfix0とだいたい同じ
・sendmail構築
[root@pc3_centos7_k4 mail]# rpm -q sendmail{,-cf}
sendmail-8.14.7-6.el7.x86_64
sendmail-cf-8.14.7-6.el7.noarch
[root@pc3_centos7_k4 mail]# pwd
/etc/mail
[root@pc3_centos7_k4 mail]# ll
合計 292
-rw-r--r--. 1 root root 92 11月 28 2019 Makefile
-rw-r--r--. 1 root root 531 1月 12 09:20 access
-rw-r-----. 1 root root 12288 1月 12 09:20 access.db
-rw-r-----. 1 root root 12288 1月 12 07:47 access.db.org
-rw-r--r--. 1 root root 469 11月 28 2019 access.org
-rw-r--r--. 1 root root 0 1月 12 07:48 aliasesdb-stamp
-rw-r--r--. 1 root root 233 11月 28 2019 domaintable
-rw-r-----. 1 root root 12288 1月 12 07:47 domaintable.db
-rw-r--r--. 1 root root 5584 4月 1 2020 helpfile
-rw-r--r--. 1 root root 80 1月 12 09:22 local-host-names
-rw-r--r--. 1 root root 64 11月 28 2019 local-host-names.org
-rw-r--r--. 1 root root 997 11月 28 2019 mailertable
-rw-r-----. 1 root root 12288 1月 12 07:47 mailertable.db
-rw-r-----. 1 root root 12288 1月 12 07:47 mailertable.db.org
-rw-r--r--. 1 root root 997 11月 28 2019 mailertable.org
-rwxr-xr-x. 1 root root 2700 11月 28 2019 make
-rw-r--r--. 1 root root 58664 1月 12 09:17 sendmail.cf
-rw-r--r--. 1 root root 58498 4月 1 2020 sendmail.cf.org
-rw-r--r--. 1 root root 7370 1月 12 09:17 sendmail.mc
-rw-r--r--. 1 root root 7306 11月 28 2019 sendmail.mc.org
-rw-r--r--. 1 root root 41680 4月 1 2020 submit.cf
-rw-r--r--. 1 root root 1041 4月 1 2020 submit.mc
-rw-r--r--. 1 root root 127 11月 28 2019 trusted-users
-rw-r--r--. 1 root root 1847 11月 28 2019 virtusertable
-rw-r-----. 1 root root 12288 1月 12 07:47 virtusertable.db
[root@pc3_centos7_k4 mail]# diff sendmail.mc.org sendmail.mc
12a13,15
> Dwmail
> Dmsendmail1.local
> define(`confDOMAIN_NAME',`$w.$m')dnl
118c121
< DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
---
> dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
[root@pc3_centos7_k4 mail]# m4 sendmail.mc > sendmail.cf
[root@pc3_centos7_k4 mail]# diff access.org access
12a13,14
> Connect:192.168.101.31 RELAY
> Connect:192.168.101.32 RELAY
[root@pc3_centos7_k4 mail]# makemap.sendmail hash access.db < access
[root@pc3_centos7_k4 mail]# ll /etc/aliases{,.org}
-rw-r--r--. 1 root root 1518 6月 7 2013 /etc/aliases
-rw-r--r--. 1 root root 1518 6月 7 2013 /etc/aliases.org
・procmail構築
※sendmailのMDAはprocmail
※後回し
■検証
・受信確認
①自ドメイン宛てかつ存在するアカウント宛のメールを受信してメールボックスに保存すること
※postfix0から自ドメイン宛かつ存在するアカウント宛のメールを受信してメールボック
スに保存すること → OK
※メールボックス形式かメールディレクトリ形式か確認する
→ デフォルトでは /var/spool/mail/rootにメールボックス形式で受信された
②自ドメイン宛て以外のメールは受信しないこと
③自ドメイン宛てかつ存在しないアカウント宛のメールを受信せず500番台エラーでリターンメールを返信すること → 送信側MTAがMUAにbounceメールを送信した
※自ログと相手ログできちんと500番台エラーを確認 → OK
--------------------telnetによるメール送信テスト---------------------------
※ postfix1からpostfix0にsendmail1でリレーしてメールを送信する場合
※ postfix1のホストのターミナルからtelnetを起動して下記のように入力
$ telnet mail.sendmail1.local 25
HELO mail.postfix1.local
MAIL FROM: dagyah@postfix1.local
RCPT TO: root@postfix0.local
DATA
From: dagyah@postfix1.local
Subjet: うんこしたい
うんこしたいお
.
QUIT
-----------------------------------------------------------------------
・送信確認
①自ホストをaccess_dbに記載しないと自ホスト内からメールを送信しないこと
※mailxコマンドで試す
[root@pc3_centos7_k4 mail]# diff access_20210113 access
10,12c10,12
< Connect:localhost.localdomain RELAY
< Connect:localhost RELAY
< Connect:127.0.0.1 RELAY
---
> #Connect:localhost.localdomain RELAY
> #Connect:localhost RELAY
> #Connect:127.0.0.1 RELAY
[root@pc3_centos7_k4 mail]# makemap.sendmail hash access.db < access ;echo $?
0
→上記のようにlocalhost等を注釈化してもメールを送信できた
②自ホストをaccess_dbに記載したら自ホスト内からメールを送信すること
※telnetで試す
※mailxコマンドで試す → OK
※送信メールがsentメールボックスに保存されること → OK
・リレー確認
※自ログと相手ログできちんと400番台500番台エラーを確認
※リターンメールの有無←普通どうするんだっけ
①許可したMTAからのメールをリレーすることを確認
※postfix1からpostfix0にsendmail1でリレーしてメールを配送できることを確認
--------------------telnetによるメール送信テスト---------------------------
※ postfix1のホストのターミナルからtelnetを起動して下記のように入力
$ telnet mail.sendmail1.local 25
HELO mail.postfix1.local
MAIL FROM: dagyah@postfix1.local
RCPT TO: root@postfix0.local
DATA
From: dagyah@postfix1.local
Subjet: うんこしたい
うんこしたいお
.
QUIT
-----------------------------------------------------------------------
→OK
[root@optiplex3020 new]# cat 1610473572.Vfd00I90ec6M281336.optiplex3020
Return-Path: <dagyah@postfix1.local>
X-Original-To: root@postfix0.local
Delivered-To: root@postfix0.local
Received: from mail. (unknown [192.168.101.34])
by mail.postfix0.local (Postfix) with ESMTP id 327B6408E6F9
for <root@postfix0.local>; Wed, 13 Jan 2021 02:46:12 +0900 (JST)
Received: from mail.postfix1.local ([192.168.101.31])
by mail. (8.14.7/8.14.7) with SMTP id 10CHjHNA014217
for root@postfix0.local; Wed, 13 Jan 2021 02:45:39 +0900
Date: Wed, 13 Jan 2021 02:45:17 +0900
Message-Id: <202101121745.10CHjHNA014217@mail.>
From: dagyah@postfix1.local
Subjet: うんこしたい
うんこしたいお
②許可してないMTAからのメールをリレーしないことを確認
[検証1] postfix0をaccess_dbで禁止しpostfix0からpostfix1にsendmail1でリレーしてメールを
配送できないことを確認
--------------------telnetによるメール送信テスト---------------------------
※ postfix0のホストのターミナルからtelnetを起動して下記のように入力
$ telnet mail.sendmail1.local 25
HELO mail.postfix0.local
MAIL FROM: dagyah@postfix0.local
RCPT TO: root@postfix1.local
DATA
From: dagyah@postfix0.local
Subjet: しょんべんしたい
おしっこもれちゃうお><
.
QUIT
-----------------------------------------------------------------------
→OK
[root@optiplex3020 new]# telnet mail.sendmail1.local 25
Trying 192.168.101.34...
Connected to mail.sendmail1.local.
Escape character is '^]'.
220 mail. ESMTP Sendmail 8.14.7/8.14.7; Wed, 13 Jan 2021 02:57:47 +0900
HELO mail.postfix0.local
250 mail. Hello gateway [192.168.101.2], pleased to meet you
MAIL FROM: dagyah@postfix0.local
250 2.1.0 dagyah@postfix0.local... Sender ok
RCPT TO: root@postfix1.local
550 5.7.1 root@postfix1.local... Relaying denied
RCPT TO: root@postfix1.local
550 5.7.1 root@postfix1.local... Relaying denied
DATA
503 5.0.0 Need RCPT (recipient)
QUIT
221 2.0.0 mail. closing connection
Connection closed by foreign host.
・sendmail1側のログ
[root@pc3_centos7_k4 mail]# tail /var/log/maillog
---(略)---
Jan 13 02:58:11 pc3_centos7_k4 sendmail[14222]: 10CHvlDX014222: ruleset=check_rcpt, arg1=root@postfix1.local, relay=gateway [192.168.101.2], reject=550 5.7.1 root@postfix1.local... Relaying denied
Jan 13 02:58:45 pc3_centos7_k4 sendmail[14222]: 10CHvlDX014222: ruleset=check_rcpt, arg1=root@postfix1.local, relay=gateway [192.168.101.2], reject=550 5.7.1 root@postfix1.local... Relaying denied
Jan 13 02:59:21 pc3_centos7_k4 sendmail[14222]: 10CHvlDX014222: from=dagyah@postfix0.local, size=0, class=0, nrcpts=0, proto=SMTP, daemon=MTA, relay=gateway [192.168.101.2]
[検証2] postfix0をaccess_dbで禁止すると、mailertableでpostfix1.localドメイン宛のメール
の経路をmail.postfix1.localに指定しても、postfix0からpostfix1にsendmail1でリレ
ーしてメールを配送できないことを確認
[root@pc3_centos7_k4 mail]# diff mailertable mailertable.org
30,32c30
< # where D.S.N is an RFC 1893 compliant error code.
< postfix1.local esmtp:[192.168.101.31]
---
> # where D.S.N is an RFC 1893 compliant error code.
[root@pc3_centos7_k4 mail]# makemap -v hash /etc/mail/mailertable.db < /etc/mail/mailertable;echo $?
key=`postfix1.local', val=`esmtp:[192.168.101.31] '
0
→mailertable.dbのタイムスタンプが更新されたことを確認
[root@optiplex3020 new]# telnet mail.sendmail1.local 25
Trying 192.168.101.34...
Connected to mail.sendmail1.local.
Escape character is '^]'.
220 mail.sendmail1.local ESMTP Sendmail 8.14.7/8.14.7; Wed, 13 Jan 2021 03:57:47 +0900
HELO mail.postfix0.local
250 mail.sendmail1.local Hello gateway [192.168.101.2], pleased to meet you
MAIL FROM: dagyah@postfix0.local
250 2.1.0 dagyah@postfix0.local... Sender ok
RCPT TO: root@postfix1.local
550 5.7.1 root@postfix1.local... Relaying denied
DATA
503 5.0.0 Need RCPT (recipient)
QUIT
221 2.0.0 mail.sendmail1.local closing connection
Connection closed by foreign host.
→リレーを拒否した
・mailertable動作確認
①mailertableのレコードに書かれたMX情報はDNSのMX情報が無くてもMX転送されるか確認
※postfix1からpostfix0宛(インターネット上のMTA)のメールのリレーを試す
※sendmail1のリゾルバを無効にしてmailertableにpostfix1への配送情報があれば
sendmail1からpostfix1にメールを送信できるか?
→ sendmailのクライアントキューに入って滞留してしまった
→ 何か設定が間違ってるかもしれない
③①のレコードがあってもaccess_dbでリレーを許可してない場合はリレーされないことを確認
→リレーされなかった
・aliases動作確認
①aliasesにhoge rootと書かれてたらhoge宛のメールがrootのメールボックスに保存されることを確認
→mailer-daemon宛のbouncemailがrootのメールボックスに保存された
②aliasesにroot root@fuga.comと書かれていたらroot宛のメールがroot@fuga.comに転送されることを確認
※この場合ローカルのrootのメイルボックスには保存されないことを確認
※fuga.comはDNSのMXレコードで転送先解決
※fuga.comはmailtableで転送先解決
[root@pc3_centos7_k4 mail]# diff /etc/aliases{.org,}
96a97,98
>
> root: root@postfix1.local
[root@pc3_centos7_k4 mail]# newaliases
/etc/aliases: 77 aliases, longest 19 bytes, 794 bytes total
[root@pc3_centos7_k4 mail]# echo $?
0
→/etc/aliases.dbのタイムスタンプが更新された
・postfix2からroot@sendmail1.localにメールを送信
[root@pc3_centos7_k2 ~]# mail root@sendmail1.local
Subject: ぷにぷに
postfix2からroot@sendmail1.localへメール送信
.
EOT
→sendmail1のrootのメールボックスには何も書き込まれなかった。
postfix1のrootのメールボックス(転送先)にメールが書き込まれた
・differキューの動作確認
※400番台エラー時に一定期間differキューに格納されること
→ mailqコマンドで確認できる
※differキュー内のメールは一定間隔ごとに再送されること
※differキュー内のメールは一定期間後に破棄されること
※differキュー内に滞留しているメールは適切なコマンドで状態を確認できること
・リターンメールの動作確認
※500番台エラー時にリターンメールを送信すること
→送信された
※リターンメールが届かなかった場合に設定どおりに振る舞うこと
・複数のインタフェースから接続を許可する設定
[root@pc3_centos7_k4 mail]# cat -n /etc/mail/sendmail.mc
----(略)----
121 DAEMON_OPTIONS(`Port=smtp,Addr=192.168.101.34, Name=MTA')dnl
122 DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
----(略)----
[root@pc3_centos7_k4 mail]# netstat -napt | grep 25
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 20237/sendmail: acc
tcp 0 0 192.168.101.34:25 0.0.0.0:* LISTEN 20237/sendmail: acc
→192.168.101.34と127.0.0.1に接続してメールメール受信できた
