sendmailで複数ドメイン運用

あまりやりたくない運用だけれども、やらざるを得ないときもあるということで設定するための方法は以下のとおり。
1./etc/mail/local-host-namesにローカル配送するためのドメインを記述する
aaa.com
のような感じ。この設定を変更した場合には、サービスの再起移動が必要。
2./etc/mail/virtusertableにエイリアスを設定する。
たとえば、xxx@aaa.com宛てのメールを zzz@bbb.com に転送するときは
xxx@aaa.com zzz@bbb.com
とする。
3.makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable を実行して、登録内容を更新する。なお、virtusertableを変更してmakemapしたらサービスの再起動は不要。 ちなみにsendmailのキューは /var/spool/mqueue にたまるので、うまくメールが受信できないようであれば、トラブルシュートの手段のひとつとして、ここにたまっていないか確認する必要がある。

qmailについて

qmailでキューにどれくらいのメールがあるか確認する方法について。
キューの数を確認する
/var/qmail/bin/qmail-qstat
キューの内容を確認する
/var/qmail/bin/qmail-qread
qmailの設定で注意すべき点。いろいろなqmailのインストール紹介サイトで
echo > /var/qmail/alias/.postmaster-alias
という記述が見られるが、
/var/qmail/alias/.postmaster-alias
が0byteだとpostmaster宛に送信することで /var/qmail/control/queuelifetime 秒間だけキューにたまり続けてしまい、多少なりとも負荷がかかる。メール爆弾を受けたらサーバーのサービスが止まるかもしれない。
なお、queuelifetimeを過ぎると
Unable to chdir to maildir. (#4.2.1)
I’m not going to try again; this message has been in the queue too long.
が送信元に返される。
ちなみに、ウィルスチェックソフト qmail-scannerが動作すると1メールあたりの処理時間が長くなるので高負荷になりやすく、alias対策は必須だ。

“qmailについて” の続きを読む

メールが送信できない

僕のサーバーは、mydnsを利用してダイナミックDNSによって公開しているが、プロバイダがOP25B対策をしているため、外部にメールを送信するためにはSubmission Portを利用しなければならない。
mydnsではIPアドレスを定期的に更新している送信元からSubmission Portによるメールリレーサービスがあるので、これを利用させてもらっている。
今日メールを送ろうとしたところ、なぜかメールが送れなかったため、/var/log/maillogを確認して原因を調査したところ
Dec 24 04:28:53 (ホスト名) postfix/qmgr[2240]: 17F8AFC03: to=<(送信元)>, relay=none, delay=16802, delays=16802/0.21/0/0, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to auth.gate-on.net[210.197.72.170]: Connection timed out)
というログが出ていることが確認できた。auth.gate-on.netはpingが通ることから、どうやらメールリレーサーバーから接続を拒否されているようだ。
もっと前のログを確認したところ
Dec 23 04:02:39 (ホスト名) postfix/smtp[29536]: 03866F775: to=<(送信元)>, relay=auth.gate-on.net[210.197.72.170]:587, delay=25031, delays=24999/28/0.09/5, dsn=4.0.0, status=deferred (host auth.gate-on.net[210.197.72.170] said: 450 Error: too much mail from 122.20.52.249 (in reply to MAIL FROM command))
というエラーログが確認できた。どうやらメールを送りすぎているらしい。
たしかにmaillogを確認したところログサイズがかなり大きい状態であったため、もしかして不正中継しているのかと思い、RBL.JPによる不正中継テストを実施したところ特に不正中継はできない状態を確認した。
となるとなぜそんな大量のメールを送る必要があるのか・・・・詳しく調べてみたところ管理ドメインではあるが受信を予期していないサブドメインあてのメール(xxx@yyy.development-network.net)が大量に送られており、それが原因でエラーメッセージを大量に送信元に返しているためということがわかった。
確かにダイナミックDNSを利用していると、 development-network.net のMXレコードも yyy.development-network.net のMXレコードも存在するように見えてしまう。実際には、yyy.development-network.netドメインはメール受信できるような設定になっていないので、こんなことが起こってしまうのだ。
これを回避するためには、自サーバーにDNSを立てて、/etc/resolv.confに nameserver 127.0.0.1 を設定する。その上で、development-network.netドメインのみMXレコードを設定し、メールサーバーあてに来たメールの宛先がMXレコードに存在しなければメールを拒否するようにすればよい。また、合わせて送信元のメールアドレスが正しくない(MXレコードが引けない)場合も合わせて拒否するようにした。
そこで、postfixに以下の設定をした。
smtpd_sender_restrictions=
smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination

smtpd_sender_restrictions=reject_unknown_sender_domain
smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,reject_unknown_recipient_domain
ここで設定パラメータの意味をおさらいしてみたい。

reject_unknown_sender_domain MAIL FROM アドレスに DNS A または MX レコードがなく、Postfix がその送信者アドレスの最終配送先ではない場合に、要求を拒否します。
reject_unknown_recipient_domain RCPT TO アドレスに DNS A または MX レコードがなく、Postfix がその受信者アドレスの最終配送先ではない場合に、要求を拒否します。

この設定をすることによって
Dec 31 22:16:05 (サーバー名) postfix/smtpd[24930]: NOQUEUE: reject: RCPT from adsl-ull-139-91.47-151.net24.it[151.47.91.139]: 450 4.1.2 <(送信先)>: Recipient address rejected: Domain not found; from=<(送信元)> to=<(送信先)> proto=ESMTP helo=
というログが記録されるようになり、正しく拒否することによって不用意にリレーさせないようになっていることを確認できた。
この設定の後、Bフレッツを再接続してWAN側のIPアドレスを変更し、mydnsに新しいIPアドレスを通知することで正しく通信できるようになった。
最後になりましたが、mydnsさんへはこの件で大変ご迷惑をおかけしました。この場を借りてお詫びいたします。

Postfixにスパムメールフィルターを入れる

Webサイトを公開していると公開ドメインの特定のアカウントに対してスパムメールが送られてくることも珍しくなく、僕の場合には、1日当たり200通くらいスパムメールが来る。そこで、spamassasinというソフトウエアを組み込むことで簡単にスパムメールフィルターを実装することができたので紹介する。
ちなみにインストールにあたってLinuxで自宅サーバーさんのサイトが役に立った。動作する概要を知るにはとても役に立つのでご一読いただきたい。また以下のインストール手順も多くは参考に記載しているものであることをお断りしておく。
Fedora Core 6上にPostfixが稼働している環境にspamassasinを以下の手順でインストールした。
1.yum install spamassasin コマンドを実行するとspamassasin以外にperlモジュールをたくさん入れる必要があることが分かるので、yを押す。
2.rpm -qi procmail を実行し、procmailコマンドがあることを確認する。ただし、設定ファイルである/etc/procmailrc がないため、 vi /etc/procmailrc として以下を記述する。

# パスを設定
PATH=/bin:/usr/bin:/usr/local/bin
# メールボックスの設定
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
# Procmailのログファイル出力先を指定
LOGFILE=$MAILDIR/procmaillog
# ロックファイルのパスを指定
LOCKFILE=$HOME/.lockmail
# メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動します
:0fw
*!^X-Spam.*
|spamassassin
# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納します(ただし、POPサーバーで受信しているケースがある場合には、この設定をするとスパム扱いされたメールが確認メールソフトからできないので注意)
:0
* ^X-Spam-Status: Yes
$MAILDIR/.Spam/

※.Spamディレクトリは/home/XXX/Maildir以下に作成しなければならないようだが、みている限りでは、上記設定をすることでメールの受信が始まると勝手に作ってくれるようだ。
4.Postfixでメールを受信をした際にprocmailで処理させるために以下の記述を/etc/postfix/main.cf に記述する

mailbox_command = /usr/bin/procmail

5.spamassasinサービスを自動起動させるために以下のコマンドを実行する。
/sbin/chkconfig –level 35 spamassassin on
6.spamassasinサービスの起動&postfixの再起動を行う
/etc/init.d/spamassasin start
/etc/init.d/postfix restart
7.postfixで配送を管理しているドメインあてにメールを送ってヘッダーに以下の情報があることを確認する。

X-Spam-Checker-Version: SpamAssassin 3.1.9 (2007-02-13) on
(サーバー名)
X-Spam-Level:
X-Spam-Status: No, score=0.5 required=5.0 tests=NO_REAL_NAME,NO_RELAYS
autolearn=no version=3.1.9

もしスパムメールを受け取った場合には、.Spamというフォルダに移動され、以下のようなヘッダーが付け加えられる。

X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.1.9 (2007-02-13) on
(サーバー名)
X-Spam-Level: ******************
X-Spam-Status: Yes, score=18.2 required=5.0 tests=ALL_TRUSTED,
FORGED_MUA_OUTLOOK,INVALID_MSGID,REPLICA_WATCH,URIBL_JP_SURBL,URIBL_OB_SURBL,
URIBL_SBL,URIBL_SC_SURBL,URIBL_WS_SURBL autolearn=no version=3.1.9
X-Spam-Report:
* -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP
* 2.3 REPLICA_WATCH BODY: Message talks about a replica watch
* 1.1 URIBL_SBL Contains an URL listed in the SBL blocklist
* [URIs: prnewperiod.net]
* 3.4 URIBL_JP_SURBL Contains an URL listed in the JP SURBL blocklist
* [URIs: prnewperiod.net]
* 1.5 URIBL_WS_SURBL Contains an URL listed in the WS SURBL blocklist
* [URIs: prnewperiod.net]
* 2.6 URIBL_OB_SURBL Contains an URL listed in the OB SURBL blocklist
* [URIs: prnewperiod.net]
* 3.6 URIBL_SC_SURBL Contains an URL listed in the SC SURBL blocklist
* [URIs: prnewperiod.net]
* 1.7 INVALID_MSGID Message-Id is not valid, according to RFC 2822
* 3.4 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook

8.定期的に学習させるためにcronへ登録する。vi /etc/cron.d/spamassasin を実行し、以下のを記述する。

0 1 * * * /usr/bin/sa-learn –spam /home/*/Maildir/.Spam/cur > /dev/null
0 1 * * * /usr/bin/sa-learn –ham /home/*/Maildir/cur > /dev/null

以上で設定完了だ。
なお、.Spamに移動したファイルは通常は読み取りできないので、もしsquirrelmailを使っているようであれば、フォルダメニューで.spamを登録すれば読み取りできるようになる。

sendmailではまる

最近はSMTPサーバーにsendmailを利用せず、いきなりPostfixやqmailに置き換えすることが多いので、なかなかsendmailに触れる機会も減ってきた。とはいってもデフォルトでインストールされているので、そのまま利用しなければならないケースもまれにある。
今回は、sendmailについて無知だったために送信ができなかったケースだ。
たとえば、abc.hogehoge.com というホスト名においては、送信するドメインがデフォルトでは @abc.hogehoge.com になってしまう。ただ、多くの場合、abc.hogehoge.comはMXレコードに登録されておらず、このまま送信しようとしても、多くの送信先では送信元のMXレコードをチェックしていることが多いためはじかれてしまう。
実は、MASQUERADE_ASオプションというのがあり、sendmail.cfにて
MASQUERADE_AS(`hogehoge.com’)
とすれば送信元ドメインを変更することができる。

PostfixでSubmissionポートをあける

最近のOP25Bの影響によって、プロバイダによってはレンタルサーバーあるサーバーなどのSMTPサーバーに接続できないケースが出てきました。OP25Bの回避策である567番ポート(Submissionポート)をLISTENさせることでこの問題は回避でき、Postfixでは非常に簡単に出来ます。
/etc/postfix/master.cfにある以下のコメントを外すだけでOKです。
submission inet n – n – – smtpd

Postfixの配送エラー

Postfixをマルチドメインで運用している場合には、配送エラーに悩まされることが多い。
エラーメッセージとともに対応方法をリスト化しておきたい。
554 5.7.1 <(あて先アドレス)>: Relay access denied; from=<(送信元アドレス)> to=<(あて先アドレス)> proto=ESMTP helo=<(接続元サーバー)>
あて先アドレスが自ドメインでなければ、不正中継しようとしているわけなので拒否して問題ないが、これが自ドメインなのにもかかわらず不正中継扱いされるケースだとメールが届かない。これは
main.cfのmydestinationが正しく設定されているかどうかチェックする。
たとえばこのような形にすると改善されるかもしれない。
domain = (自ドメイン)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

vodafoneへメールが送信できない

postfix/smtp[26573]: connect to mx.t.vodafone.ne.jp[210.169.176.59]: Connection timed out (port 25)
SMTP中継しようとするとOCN網からだと拒否されてしまう。
他のドメインでは発生しない症状なので、おそらくOCN側で携帯ドメインの転送をしないように設定していることが予想される。
mydnsのOPB25対策のサービスを利用することこの問題は回避できるが、本来であればOCNのSMTPサーバーをリレーしたいところ。そこで利用するのがSASL(SMTP-AUTH)になる。
SASLについては今後書いていきたいと思う。