どうも id:kizashi1122 です。
弊社が開発・運営している Re:lation というサービスの中のサーバではないのですが、とある用途で IMAP のサーバをAWSのEC2上に立てていました。ソフトウェアとしては 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 先生。 以下のサイトがみつかりました。日付も近い。
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"; }