poprelayd (POP before SMTP authentication daemon)

[ 戻る | トップページに戻る ]

概要

poprelayd とは、sendmail を利用して POP before SMTP を実装する際の 認証データ管理デーモン (?) 。ipop3d/imapd に対応。

URL

http://poprelay.sourceforge.net/ (Official Site)
http://www1.plala.or.jp/fukafuka/works/patch/poprelayd.html (拙作の qpopper 3.0.2 対応化 poprelayd パッチ)

インストール環境

Slackware 7.0 (Kernel 2.2.14 + glibc 2.1.2)
sendmail 8.9.3/3.7W
CF-3.7Wpl2
qpopper 3.0.2

必要なもの

Perl

バージョン

不明

インストール手順 (POP before SMTP 設定方法)

sendmail, qpopper のインストールは終っているとして、 以下、Software Design 誌 1999/5 月号の記事を参考に作業を進める。

qpopper 3.0.2 の場合、記事通りに popper/pop_apop.c, popper/pop_pass.c に パッチを当てて、再コンパイルするとエラーになるので注意。 以下のように HERE の部分が記事と違っているので修正する。
    pop_log(p,POP_PRIORITY, HERE,
                            ~~~~~ 記事のパッチに追加
          "Login user=%s host=%s [%s]",
          p->user,p->client,p->ipaddr);

    /*  
     * Authorization completed successfully
     */

./qpopper3.0.2/popper/popper.h の定義から Linux の場合...
POP_FACILITY    LOG_MAIL
POP_PRIORITY    LOG_NOTICE

となるので、/etc/syslog.conf に以下のエントリを追加。
mail.*                /var/log/maillog

kill -HUP <syslogd の PID> し、qpopper にアクセスした時のログはこんな感じ。
Sep 15 20:08:21 pop-server popper[31027]: apop "foo"
Sep 15 20:08:24 pop-server popper[31027]: Stats: foo 0 0 0 0 hoge.foo.co.jp xxx.xxx.xxx.xxx

むう。先のパッチって、あんまし意味ないような...。確かに qpopper 2.53 頃のログは 以下のような感じで、必要な情報が取れなかったのだけれど...。
Sep 11 09:03:47 pop-server popper[5389]: apop "foo"
Sep 11 09:03:50 pop-server popper[5389]: Stats: foo 0 0 0 0

次に poprelayd 。まず以下のように修正。
#!/usr/local/bin/perl5
       ~~~~~~        ~ 削除
(snip)
$dbfile = "/etc/mail/popip.db";         # Sendmail map to update.
                ~~~~~~~~~~~~~ 修正 (適宜)

後は記事どおり、以下の修正を行う。
    if ($s =~ m/(ipop2d|ipop3d|imapd|popper|qpopper)\[[0-9]+\]: Login user=/)  
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 修正

$dbfile で指定したファイルを事前に作成しておく。
$ su
# makemap hash /etc/pop.authip.db < /dev/null
               ~~~~~~~~~~~~~~~~~~ 先の修正に合わせて

最後に poprelayd のインストール。
$ su
# install -m 511 poprelayd /usr/local/bin

poprelayd -d で起動した後、qpopper にアクセスしてから poprelayd -p で登録された IP を表示...されない。 スクリプトをよく見る。むう。あのパッチどおりのフォーマットしか認識しないのね。 しかも、プロセスいないじゃないか。どっかで死んでるのか?

調べてみると、以下のエラーが出ていることが分かった。
Your vendor has not defined Fcntl macro O_EXLOCK, used at /usr/local/bin/poprelayd line 79.

もう一度、オリジナルの Perl スクリプトを見直すと、こんな行があったので、 これのコメントアウトを外して (=有効にして) 実行。 これでとりあえず動く (いいのかな?) 。
(注) これは Linux 等、O_EXLOCK が使えない場合のみ。 FreeBSD 等では必要なし。
# You may need to uncomment this if your fcntl.ph doesn't export it.
#sub O_EXLOCK { 0x20 };

ここでちょっと別解
qpopper へのパッチ、3.0.2 の場合ほとんど意味がないので、qpopper 3.0.2 には 一切手を加えることなく (poprelayd を) 使用できるようなパッチを作成した。 詳しくは qpopper 3.0.2 対応化 poprelayd パッチ のページを参照のこと。
このパッチを適用した場合、後は perl のパス、$dbfile を修正するくらいで OK 。

最後に sendmail の設定。sendmail.cf を以下のように修正し、sendmail を HUP すればおしまい。
(注) 最後に追加する 3 行は、右辺と左辺をTab で区切ることに注意。 また、Scheck_rcpt に記述すべきことにも注意。
# default relay host
DRsmtp-server.hoge.co.jp

Kpopauth hash /etc/pop.authip   <--- 追加 (.db を除くことに注意)

################################
# SMTP processing restrictions #
################################

(snip)

##
## RCPT TO validation
##

Scheck_rcpt                     <--- Scheck_mail と間違えないよう注意!

(snip)

# client address check -- accept messages from hosts within allowed domain
R$* $| $* $| $* $| $*                   $: $1 $| $2 $| $3 $| $4 $| $(popauth $1 $:  $)    <--- 追加
R$* $| $* $| $* $| $* $| <?>            $: $1 $| $2 $| $3 $| $4                           <--- 追加
R$* $| $* $| $* $| $* $| $+             $@ $>Check_rcpt_inside $3 $| $4                   <--- 追加
R$={RoamIP}$* $| $* $| $* $| $*         $@ $>Check_rcpt_roam $4 $| $5
R$* $| $*$={RoamDom} $| $* $| $*        $@ $>Check_rcpt_roam $4 $| $5

[ 戻る | トップページに戻る ]