2010年7月23日

[postfix-jp: 3812]postfixadminとの組み合わせで謎の現象


はじめまして。
大塚と申します。

postfix+postfixadminとの組み合わせで謎の現象が発生しております。
一応、解決方法まで分かったのですが、内容的にコミュニティに連絡した方がいい
かなと思ったので連絡します。
(少々長いですがご容赦下さい)


以下の構成でメールサーバを構築しました。

[サーバ構成]
postfix 2.7.1 + VDA(2.7.0版を適用)
postfixadmin 2.3(バーチャルドメイン運用)
mysql 5.1.48(デフォルト文字コード:utf-8)
dovecot 1.2.12


[不思議な現象-1]
envelope fromに全角文字があるメールを「別アドレスに転送設定が行われている
メールアドレス」送ると、次の2つの警告が発生します。

postfix/cleanup[4459]: warning: mysql query failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
postfix/cleanup[4459]: warning: 7AB851A00B4: virtual_alias_maps map lookup problem for **envelope fromのアドレス**

該当メールはバウンスしてキューに残ります。
問題なのはこのエラーが発生した直後、少しの間、まったく関係のない別のメール処理
にも警告が発生することです。
こちらの警告は1つです。

postfix/cleanup[4459]: warning: 7AB851A00B4: virtual_alias_maps map lookup problem for **toのアドレス**

該当メールは「4.3.0 Error: queue file write error」で一旦終了します。
巻き込まれるメールの数は不特定で1通だけだったり3〜4通の時もあります。
一応4xxのステータスコードなので、通常は相手のメールサーバからの再送が期待でき
るのでメールの到着が遅延するだけで済みます…。

ただ、厄介なのがenvelope fromに全角文字があるメールはキューに残っているので、
定期的に再送→警告発生を繰り返し、その度に別のメールが巻き込まれてエラーに
なってしまいます。


[不思議な現象-2]
今度はtoに全角文字があるメールが送られてきたときです。
この場合は次の警告が発生します。

warning: mysql query failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

該当メールは「4.3.0 Temporary lookup failure」となり接続を切ります。
(キューには残りません)

こちらも同じように警告が発生した直後、少しの間、まったく関係のない別のメールも
「4.3.0 Temporary lookup failure」が発生します。


[対策]
不思議な現象が始まるきっかけは以下の警告です。

postfix/cleanup[4459]: warning: mysql query failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

これはpostfixadminが文字コードlatin1でテーブルを作成しており、全角文字が含まれ
たクエリを処理する時に出力されるMySQLのエラーです。
僕はpostfixadminのテーブルの一部をutf-8に変えることでMySQLのエラーを出ないよう
にしました。
変更部分は以下の通りです。

aliasテーブルのaddress
※使ったSQL文
ALTER TABLE `TABLE名`.`alias` MODIFY COLUMN `address` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

このエラーが出ないようになると、postfixにも警告が出力されず、不思議な現象も
発生しなくなります。


[postfixの動作について-1]
SQLのクエリログを取っていると、転送設定が入っているメールアドレスヘメール送信
が来たときに不要なクエリが実行されている気がします。

例)
メールアドレス:hoge@xxxxx
転送先 :fuga@xxxxx
※メールボックスに残しても、残さなくてもOK

envelope fromを「hoge@xxxxx」にしてhoge@xxxxxにメールを送信
すると、次のクエリが実行されている。

SELECT goto FROM alias WHERE address='hoge@xxxxx';

envelope fromである「hoge@xxxxx」をaddressに入れてクエリを実行してい
ます。
どんな意図があって実行しているかわかりませんが、不要かなぁと思ってます。
ちなみにメールアドレスに転送設定を入れていないとこのクエリは実行されません。
(そのため、上記で説明した「不思議な現象-1」は再現しなくなります)

[postfixの動作について-2]
MySQLの実行がエラーになりpostfix側で警告ログが表示されたとき、少しの間、
MySQLとの疎通がうまく取れなくなるのでしょうか?
今回の現象を見ているとどうもそのような気がしています。

バグなのか、そういう仕様なのかは自分では分かっていません。


[問題点]
実際に確認しているわけではないですが、この構成のメールサーバに全角文字を含ん
だfrom,toを持つメールを大量に送りつけるとDOSになり得ないかと思っています。
(他も関係ないメールも巻き込んで4xxエラーを出してしまうので)

尚、海外サイトですが、こちらの方も同じ現象で問い合せています。

http://www.mailinglistarchive.com/postfix-users@xxxxx/msg44454.html

こちらの方はQuery文の修正で対応しています。
postfixは2.4.5のようです。

以上です。

---------------------
大塚 総司(OTSUKA soushi) <otsuka@xxxxx>

_______________________________________________
Postfix-jp-list mailing list
Postfix-jp-list@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list


投稿者 xml-rpc : 2010年7月23日 03:03
役に立ちました?:
過去のフィードバック 平均:(5) 総合:(5) 投票回数:(1)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/97163
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。