[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



須藤です。

In <4BF753EC.4050303@xxxxxxxxxx>
  "[postfix-jp: 3772] ポート番号を記録する方法" on Sat, 22 May 2010 12:47:56 +0900,
  Mitsuru Ogino <ogino@xxxxxxxxxx> 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@xxxxxxxxxxxxxx>
  #
  # 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@xxxxxxxxxxxxxx>
株式会社クリアコード <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@xxxxxxxxxxxxxxxxxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list

Follow-Ups
[postfix-jp: 3774] Re: ポート番号を記録する方法, Mitsuru Ogino
References
[postfix-jp: 3772] ポート番号を記録する方法, Mitsuru Ogino

[検索ページ] [Postfix-JP ML Home]