2010年5月22日

[postfix-jp: 3773] Re:ポート番号を記録する方法

須藤です。

In <4BF753EC.4050303@xxxxx>
"[postfix-jp: 3772] ポート番号を記録する方法" on Sat, 22 May 2010 12:47:56 +0900,
Mitsuru Ogino <ogino@xxxxx> wrote:

> Postfix の smtpd が、メールをある Queue ID で受信したとき、使用された送
> 信元 TCP ポート番号を知る方法を探しているのですが見つからないでおります。

>
> Postfix のログか、または他の方法でも良いのですが、なにか方法がありました
> らお教えください。ソースコードに手を入れる以外の方法があり難いです。

Postfixもサポートしているmilterという仕組みがある(*)のですが、
それを使うとできそうな気がします。

(*)
http://www.postfix.org/MILTER_README.html
http://www.postfix-jp.info/trans-2.3/jhtml/MILTER_README.html

milterではPostfixからいくつか情報をもらうのですが、"connect"
というイベント(*)のときにもらうhostaddrの情報が「使用された送
信元 TCP ポート番号」にあたるのではないかと思います。

(*) https://www.milter.org/developers/api/xxfi_connect


↑の情報をログに残すようなmilterを作るにはC, C++, Python,
Rubyなどでプログラムを書く必要があるのですが、たとえば、Ruby
で書くとこんな感じになります。

https://milter-manager.svn.sourceforge.net/svnroot/milter-manager/milter-manager/trunk/tmp/milter-report-port.rb

#!/usr/bin/env ruby
#
# Copyright (C) 2010 Kouhei Sutou <kou@xxxxx>
#
# This library is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this library. If not, see < http://www.gnu.org/licenses/>;.

require 'syslog'
require 'milter'

class MilterReportPortSession < Milter::ClientSession
def connect(host, address)
@host = host
@address = address
end

def end_of_message
queue_id = @context.macros["i"]
Syslog.info("host_name=%s address=%s port=%d queue_id=%s",
@host, @address.address, @address.port, queue_id)
accept
end
end

command_line = Milter::Client::CommandLine.new

command_line.run do |client, _options|
Syslog.open("milter-report-port",
Syslog::LOG_PID | Syslog::LOG_CONS,
Syslog::LOG_MAIL)
client.register(MilterReportPortSession)
end

Syslog.close

↑を動かすには開発版のmilter managerが必要になります。
Debian/Ubuntuならlibmilter-toolkit-ruby1.8というパッケージ、
CentOSならruby-milter-toolkitというパッケージをインストール
する必要があります。
参考:
Debian: http://milter-manager.sourceforge.net/dev/reference/ja/install-to-debian.html
Ubuntu: http://milter-manager.sourceforge.net/dev/reference/ja/install-to-ubuntu.html
CentOS: http://milter-manager.sourceforge.net/dev/reference/ja/install-to-centos.html

以下のように↑のmilterを起動し、
% ruby milter-report-port.rb --daemon

main.cfに以下を追加すると、
smtpd_milters = inet:localhost:20025

syslog経由で/var/log/mail.logとか/var/log/maillogあたりに以
下のようなログが記録されると思います。

May 22 16:11:08 mx milter-report-port[5816]: host_name=localhost address=127.0.0.1 port=47793 queue_id=3845128C079

--
須藤 功平 <kou@xxxxx>
株式会社クリアコード < http://www.clear-code.com/>; (03-6231-7270)

Mozilla Firefox/Thunderbirdサポート:
http://www.clear-code.com/services/mozilla/menu.html
迷惑メール対策:
http://www.clear-code.com/software/milter-manager.html
テスティングフレームワーク:
http://www.clear-code.com/software/cutter.html
http://www.clear-code.com/software/uxu.html

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


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




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