チェ・ゲバムラの日記

脱犬の道を目指す男のブログ

【Postfix+Dovecot】新規にメールサーバを立てたときに送受信できなくてハマった

Postfix,dovecot

やりたいこと

AWSでEC2をたてて、別サーバから接続してメール送受信をしたい。

環境

EC2(AWS、CentOS7)
VPC、セキュリティグループは既存で作れたとある場所と同じものを当て込んだ。
ただし既存のセキュリティグループでは受信ポートが空いていない状態。

めちゃ参考になったサイト様、やったことはほぼこれ。

メールサーバー構築(Postfix+Dovecot) - CentOSで自宅サーバー構築

DNS設定

お名前でやった。
A: mail.hogehoge.com value:メールサーバ自体のGIP
MX: hogehoge.com value: mail.hogehoge.com 優先:10
TXT(SPF): value: v=spf1 +ip4:メールサーバ自体のGIP ~all

ハマったこと

メール送受信両方できなかった。

原因と解決方法

・メール送信に関しては、/etc/postfix/main.cfで relayhost = mail.hogehoge.com:587 というように記載していて、
外からSMTPでつなぎにきているのを更に自分に中継?みたいになっていたのでエラーとなっていた。
(エラーログとりわすれたが、メールログではSASL Auth login failedみたいになっていて、送信元のCakePHPのログでは、パスワード認証エラーのようなメッセージがでていた)
これはrelayhostのところをコメントアウトしたら解決した。

・メール受信に関しては、Dovecotが起動に失敗していたことに気づかなかった。
systemctl status dovecotでエラーログを確認し、修正した。
またAWSのポートをセキュリティグループで許可すればCentOSは絶対にポートが空くと思っていた。
これは間違いではないのだが、ポートを空けてもnetstat -an | grep tcpコマンドをうつと空いていなくて、
なんでだろうなと思っていたら上記の通りDovecotのエラーで、LISTENしようがなかったということ。


まず全体の理解不足だった。
・送受信ともにPostfixだと思っていたが、送信メールサーバーにはPostfix、受信メールサーバーにはDovecotを使うことがわかってなかった。
・SASL認証というのがそもそもわかってなかった。
つまりCyrusというものを最初インストールもしてなかった。

localhostで送信ではなく、自分が中継として送受信するのは初めてだったのでてこづった。
つまりrelayhostの意味が全くわかってなかった。

・不明だけどuseraddしてパスを付けてもうまくSMTP認証されなかった。
下記のようにやればOK
echo "xxxxxxxxxxx" | saslpasswd2 -p -u hogehoge.com -c contact
echo "xxxxxxxxxxx" | saslpasswd2 -p -u mail.hogehoge.com -c contact
確認コマンドは下記
sasldblistusers2
hogehoge.comだけ設定したらメールソフトでは送信できるようになったが、
CakePHPプログラムで作ったフォームから送信しようとするとエラーで、
mail.hogehoge.comを追加したらうまく行ったので結局2つとも入れる必要があるっぽい。


その他わかったこと

Dovecot
/etc/dovecot/conf.d/10-mail.conf
ssl = yes

ssl = no

/etc/dovecot/conf.d/10-ssl.conf
ssl = required

ssl = no

ここでSSLをyes,requiredのままにしておくと、CentOS側では
netstat -an | grep tcp
としたときに995とかがLISTENになる。

今回はSSL通信しないのでnoに設定した。


■「fatal: no SASL authentication mechanisms」エラーがあった場合の対処
SASL認証のパッケージが足りない可能性があるため下記を実行
yum install cyrus-sasl-plain
yum install cyrus-sasl-md5

最終的な設定内容

今回はメーラーでも送受信したかったので下記が設定内容となった。

contact@hogehoge.com
ユーザ名:contact
PW: xxxxxxxx

送信サーバ
セキュリティ:保護なし 暗号化されたパスワード認証
mail.hogehoge.com
SMTP(587)

受信サーバ
セキュリティ:保護なし 平文のパスワード認証
mail.hogehoge.com
POP3(110)


■メールのパスワード変更、設定箇所メモ
SMTP認証用ユーザー/パスワード登録
[root@centos ~]# echo "パスワード" | saslpasswd2 -p -u centos.centossrv.com -c centos

SMTP認証用ユーザー/パスワード確認
[root@centos ~]# sasldblistusers2
centos@centos.centossrv.com: userPassword

・(※最初の1回のみ)/etc/sasldb2所有グループをpostfixに変更
[root@centos ~]# chgrp postfix /etc/sasldb2

SMTP認証用ユーザー/パスワード削除
[root@centos ~]# saslpasswd2 -d centos -u centos.centossrv.com

・設定反映
systemctl restart saslauthd


※2018/12/5追記
人にアカウント渡すときは今までメールクライアントもつかうとかあったので面倒で全部上記まで設定していたが、
Gmailとかにただ設定するだけなら必要ないぽい。
CentOSユーザ作成したあとにパスを設定してあげればそのままそれで使える模様。
その後に上記の手順をしてパスが違ったりすると競合?して認証できなくなる。(ハマった)


役に立ちそうなTipsとしてこれを書くとDovecotのログを詳細に出せる。
vi /etc/dovecot/dovecot.conf
#詳細ログ出力
auth_verbose = yes
auth_debug = yes


エイリアスには予約語的なものがあるので重複すると送受信共に出来なくなる(rootに届く)

support@hogehoge.comとか、user名には注意!

よく使うinfo,supportなどは予めpostfixのaliasesに記載されていて、初期ではrootユーザ宛に届くようになっている。
support:postmaster > postmaster:root とか
manager:root とか、、、

対処法としては
vi /etc/aliases
#support : postmaster

のようにコメントアウトして

systemctl restart postfix

としてやればよい。Postfix再起動で完了。

support宛に送ってるのに受信時になぜかroot宛にに届いていたことで気づいたのだが、
このままにしておくと送信時にも迷惑メールに入ってしまうので受信しない場合でも覚えておきたい。
SPFがPASSになっても迷惑メールに入る)

■ローカル配信と外部配信について
通常メーラーで受信したりする場合は上記で問題ないが、
社内Gmailなどで送受信したい場合などは

mydestination = localhost
とする必要があるらしい。

下記以下より引用
mydestinationでは、メールを外部に送信せずに、このサーバーローカルで配送処理するドメインのリストを指定する。
$mydomain, $myhostname を含めると、~@example.jp 宛のメールを外部に送信しなくなってしまうので、ここには含めず、localhostのみ許可するようにする。

https://inaba-serverdesign.jp/blog/20160620/postfix_send_mail.html


DKIM設定
配信できるようになっても迷惑メールに入ると意味がない。
そのためSPFレコード以外にもDKIMを設定する。
詳細は下記
SPF + DKIMを設定して、Postfixでメールを送信(CentOS)