dovecot が起動してない?

https://upload.wikimedia.org/wikipedia/commons/3/37/Dovecot-logo.png

どうも id:kizashi1122 です。

弊社が開発・運営している Re:lation というサービスの中のサーバではないのですが、とある用途で IMAP のサーバをAWSのEC2上に立てていました。ソフトウェアとしては dovecot を使っています。

Dovecot

さて、社内の利用者より「つながらないんですけど」と連絡がありました。

んなアホなと思い、みてみると確かに IMAP の接続に失敗する。認証に失敗ではなく接続に失敗する。

$ ps -ef | grep dovecot

をすると、プロセスがあがってません。 ps auxw を使ってない理由は特にないありません。昔 Solaris を使っていた手癖がまだ残ってるだけです・・・。

それはさておき。

上がってないなら上げればよいということで起動させようとしました。

[root@ip-172-31-XX-XX conf.d]# /etc/init.d/dovecot start
Starting Dovecot Imap: Error: service(pop3-login): listen(*, 995) failed: Address already in use
Error: service(imap-login): listen(*, 143) failed: Address already in use
Error: service(imap-login): listen(*, 993) failed: Address already in use
Fatal: Failed to start listeners
                                                           [FAILED]
[root@ip-172-31-XX-XX conf.d]#

誰かがポートを使ってる? んなアホな。

lsof で確かめます。

[root@ip-172-31-XX-XX conf.d]# /usr/sbin/lsof -i :993
[root@ip-172-31-XX-XX conf.d]# /usr/sbin/lsof -i :995
[root@ip-172-31-XX-XX conf.d]# /usr/sbin/lsof -i :143

ないんかい。

念の為、 netstat -tulpn でもみてみますが同ポートは誰もLISTENしてません。

困った。

困ったときの Google 先生。 以下のサイトがみつかりました。日付も近い。

stackoverflow.com

Hi it looks like you are using AWS as I am. I recently updated via Yum as well. I noticed that a new package named 'portreserve' was also installed. I killed that process, left the /etc/dovecot/dovecot.conf as it was before and then started Dovecot successfully. I was also immediately able to reconnect my mail clients connection. I hope that helps you.

I also restarted the portreserve program since it seems useful to limit port access.

まとめると、「最近 yum でアップデートしたら portreserve なるパッケージがインストールされてた。このプロセスを kill して dovecot を起動したらうまくいった」とのこと。

確かに、最近 yum でセキュリティアップデートがあったので yum update -y したばかりでした。その後再起動して放置してました。まさか dovecot が立ち上がってないとは思わず・・・。

実際に、このとおりにすると無事 dovecot が再起動しました。

ただ次にOSを再起動した際に同じことが起こるのはイヤです。

/etc/portreserve/ というディレクトリに dovecot というファイルがあります。

中身は

imap/tcp
imaps/tcp
pop3/tcp
pop3s/tcp
sieve/tcp

というような感じ。もうこいつが原因だろうということでこのファイルは削除しました。

ところで、この portreserve というサービスは何者なんでしょう? その名の通り、dovecot のために上記ポートを予約しておいてくれたのなら、なんで dovecot が立ち上がらなかったんだ?

謎が多いです。

今後は簡単に確認できるように、簡単な Perl スクリプトを作りました。

#!/usr/bin/env perl

use v5.16;
use Mail::IMAPClient;

my $imap_host = $ARGV[0] or die $!;
my $user      = $ARGV[1] or die $!;
my $pass      = $ARGV[2] or die $!;

my $imap = Mail::IMAPClient->new(
    Server   => $imap_host,
    User     => $user,
    Password => $pass,
    Ssl      => 0,
    Uid      => 1,
);

if ($imap) {
    say "AUTH OK";
} else {
    say "AUTH NG";
}