サーバ構築(6) メールサーバ(sendmail/dovecot)
MTA(Mail Transfer Agent)の選択肢から qmail が消えて久しい(勝手に消すなよ(^^;)わけですが、qmail 亡き後(だから勝手に亡き者にするなって)、sendmail に戻るか、Postfix にシフトするかは自由です。最近は他にもいくつか出てますが、とりあえずそれは置いておいて、簡単な sendmail に戻りましょうと。いえ、単に慣れてるだけですけど。
昔と違って、今の sendmail はデフォルト状態でも非常にセキュアなので、セキュリティについてあまり神経質になる必要はなくなってます。ただ、メールによるウィルスは相変わらず減らない上、SPAM が年を追うごとに倍々ゲームで増えているので、メールサーバを運用するのにはそれなりの覚悟が必要です。
OSインストール時に「メールサーバ」を選択しなくても、sendmail パッケージはインストールされます。余計なものをインストールされても鬱陶しいだけなので、むしろ「メールサーバ」はインストール時に積極的に候補から外してます。MTA として運用するには sendmail パッケージだけでは足りないので、二つほど追加インストールします。sendmail-devel パッケージは sendmail だけで運用する分には不要ですが、ウィルス対策等行う際に必要になりますので入れておきます。
# yum -y install sendmail-cf sendmail-devel |
デフォルトの sendmail は lo (local loopback=127.0.0.1) でしか25番ポートで LISTEN しない(すなわち、外部から25番ポートに接続できない)設定になっていますので、これを変更する必要があります。sendmail.cf の変更はそれだけでも充分ですが、ついでに名前解決できないホストを拒否する設定も入れておきます。自宅サーバならそれくらい厳しくしても問題ないでしょう。sendmail.cf を変更するためには、sendmail.mc を編集してから ‘make -C /etc/mail’ を実行するか、sendmail を再起動します。
# vi /etc/mail/sendmail.mc [/etc/mail/sendmail.mc] 116c116 < 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 149c149 < FEATURE(`accept_unresolvable_domains')dnl --- > dnl FEATURE(`accept_unresolvable_domains')dnl # service sendmail restart |
ちなみに、sendmail.mc では行頭に ‘dnl’ を入れるとコメント行扱いです。上の例は、デフォルトから2行コメントアウトしたことになります。
続いて、メールを受け取るドメイン名(使いたいメールアドレスの @ 以降)を全て /etc/mail/local-host-names に記述します。当然の事ながら、DNS サーバ側で MX レコードが適切に設定されていることが大前提です。
# vi /etc/mail/local-host-names [/etc/mail/local-host-names] example.jp mail.example.jp |
さらに、tcp_wrappers で sendmail への接続を許可します。
# vi /etc/hosts.allow [/etc/hosts.allow] sendmail : ALL |
とりあえずはこれだけでも使えるようになりますが、この状態だと sendmail は bob だの john だの、適当に宛先アドレスでっち上げて送りつけられて来る SPAM に対して律儀に USER UNKNOWN のエラーメールを返そうとします。この手の SPAM はたいてい yahoo あたりのフリーメールを騙るので受け取ってもらえないエラーメールが queue に滞留してえらいことになります。そこで、存在しないアドレスに対するメールは受け取らない設定を仕込みます。
例として、webmaster@example.jp をローカルアカウントの hoge に配送し、それ以外にアドレスは存在しないものとします。sendmailでは、全てのメールアドレスをvirtusertableで定義することにより、この設定が可能となります。
# vi /etc/mail/virtusertable [/etc/mail/virtusertable] webmaster@example.jp hoge @example.jp error:No such user here. # makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable |
makemap を実行する代わりに’service sendmail restart’ で sendmail を再起動してもよいです。これで存在しないアドレス宛のメールは受け取らずに拒否するようになります。ここまででもかなりイイ感じになりますが、さらに qmail でおなじみになった Maildir への配送も仕込みます。sendmail 自体には Maildir 配送の機能はないので、procmail のレシピで Maildir への配送を定義しておきます。
# vi /etc/procmailrc [/etc/procmailrc] PATH=/bin:/usr/bin:/usr/local/bin MAILDIR=$HOME/Maildir/ VERBOSE=off LOCKFILE=$HOME/.lockmail FORMAIL=/usr/bin/formail NSLOOKUP=/usr/sbin/nslookup DEFAULT=$MAILDIR |
ユーザを追加したときに Maildir が作成されるように、スケルトン(ひな形)を用意しておきます。
# mkdir -p /etc/skel/Maildir/new # mkdir -p /etc/skel/Maildir/cur # mkdir -p /etc/skel/Maildir/tmp # chmod -R 700 /etc/skel/Maildir |
なお、POP3 サーバ dovecot は特別な設定をしなくても、Maildir があれば勝手に読みに行ってくれるスグレモノです。
# yum -y install dovecot # vi /etc/dovecot.conf [/etc/dovecot.conf] 17a18 > protocols = pop3 # chkconfig dovecot on # service dovecot start |
さらに ClamAV を利用したウィルス対策へと進むわけですが、これは以前まとめたものが別館にありますのでここでは割愛します。