2006年7月11日

[postfix-jp: 2155] Re: sleep中にコネクションが切断されたことを検出したい


柳澤です。

On Tue, 11 Jul 2006 19:42:57 +0900
SATOH Kiyoshi wrote:

> > > きにどうしよう、と思ってやめたんですが、こっちが返して無いうちにな
> > > んか送ってきてたら504で終了、とすることで、あまり大きな修正にせず

> > > にすみますね。
> > この実装でいった場合、EHLOの応答でpipeliningを通知しないように
> > smtpd_discard_ehlo_keywordsを設定する必要があります。
> > また、pipeliningを通知していないのに使ってくる(変な)クライアントもあ
> > るようなので、その点でも注意が必要だと思います。
>
>  ご指摘、ありがとうございます。
>  ESMTPじゃないのにpipeliningしてきたら、まあそれはスパムとして判断さ
> せてもらっていいかな、と思っています。

ESMTPか否かを判定するにはreject_unauth_pipelining関数のように
これの結果を利用しても良いかも知れません。
strcasecmp(state->protocol, MAIL_PROTO_EMSTP) != 0
それで、これの結果がtrueの場合にのみreject_unauth_pipeliningのための
プログラムを動かすという感じですね。

あと、外部向のsmtpdと内部利用者向けのsmtpdを分けて、内部向けsmtpdに
ついては甘々な設定にしておくと変なクライアントには対処できそうですね。
sleepの設定を使っている時点で分けていらっしゃると思いますが。

>  柳澤さんにいただいたアイデアで実装してみてますが、切断の検出や
> pipelining無視の検出は出来たものの、VSTREAM_GETCがブロックしてしまい、
> 思った遅延時間にならない、という問題が ^^;
>  ブロックしない、もしくはタイムアウト時間を0にとかできないのかな?も
> うちょいいじってみます。

タイムアウト時間を調整するなら、setsockopt(2)でやる方法とSIGALRMで
割り込んでもらう方法がありますね。前者だとこの設定がPostfix自体に
どういう影響を及ぼすか良くわからないという問題があります。
(前の値を保存しておいて、実行後に元に戻せば良いかも知れませんが)
後者はシグナルを使うのでsmtpdがマルチスレッドで動いていると
(たしか動いていないと思いますが)まずいことがあるかもしれません。

--
-------------------------------------------------------
Yoshisato YANAGISAWA
Dept. of Mathematical and Computing Sciences,
Graduate School of Information Science and Engineering,
Tokyo Institute of Technology.
_______________________________________________
Postfix-jp-list mailing list
Postfix-jp-list@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list

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




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