最近は、perlベースの Pop-before-smtp を使うのがはやりっぽいですね。
試してみると、maillogを監視してて、popの認証ログをベースに動くから、pop認証後にメールが送れるようになるまで、時間が掛りすぎました。
それで、昔ながらのDRACを使ってみようと思った次第です。
popしてから、メールの送信が許可されるまでの遅延が気にならなければ、 perl ベースの pop-before-smtp が簡単で良いかもしれません。
DRAC と dovecot、postfixの関係はこんな感じです
- dovecotでpop/imapの認証が成功
- dovecotからdrac_pluginが呼び出される
- drac_pluginはdracdにデータベースの更新を依頼
- postfixはdracdが作成したデータベースを、中継可否を判断するデータベースとして利用する
導入の流れはこんな感じ
- BerkeleyDBの導入
- Dovecot-develの導入
- DRACの導入
- dovecot drac_pluginの導入
- dovecot がdrac_pluginを使うように設定
- postfix が、DRACが管理しているデータベースを参照するように設定
手順はこんな感じです
BerkeleyDB/Dovecot-develの導入
[root@cent6 ~]# yum install db4-devel dovecot-devel
|
DRACの導入
[root@cent6 ~]# mkdir drac
[root@cent6 ~]# mv drac.tar.Z drac
[root@cent6 ~]# cd drac
[root@cent6 drac]# tar zxf drac.tar.Z
[root@cent6 drac]# vi Makefile
#### Makefile for drac
## Tuneables
# Paths
##INSTALL = /usr/ucb/install
INSTALL = install
EBIN = /usr/local/sbin
MAN = /usr/local/man/man
# OS-Dependant settings
# Choose one of this pair...
# -DTI_RPC # Transport-independant RPC
# -DSOCK_RPC # Socket RPC
# Choose one of this pair...
# -DFCNTL_LOCK # fcntl() locking
# -DFLOCK_LOCK # flock() locking
# Choose one of this pair...
# -DSYSINFO # hostname from sysinfo()
# -DGETHOST # hostname from gethostname()
# If rpcgen -C is specified below...
# -DDASH_C # ANSI-C mode
# Settings for postfix and exim
# Do not set these for sendmail
# -DREQ_HASH # requires hash format
# -DCIDR_KEY # keys in CIDR format
# -DTERM_KD # keys and data nul-terminated
##DEFS = -DTI_RPC -DFCNTL_LOCK -DSYSINFO
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C -DTERM_KD
# Compiler flags
CC = gcc
RANLIB = :
##CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-4.1.25/build_unix
CFLAGS = $(DEFS) -g -fPIC
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-3.1.17/build_unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-2.4.14/Unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db.1.85/PORT/sunos.5.2/include
##LDLIBS = -L/usr/local/src/db/db-4.1.25/build_unix -lnsl -ldb-4.1
LDLIBS = -ldb
#LDLIBS = -L/usr/local/src/db/db-3.1.17/build_unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db-2.4.14/Unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db.1.85/PORT/sunos.5.2 -lnsl -ldb
##TSTLIBS = -L. -ldrac -lnsl
TSTLIBS = -L. -ldrac
##RPCGENFLAGS =
RPCGENFLAGS = -C -I
#RPCGENFLAGS = -C
# Man sections
MANLIB = 3
##MANADM = 1m
MANADM = 8
~~~~~~~~~~~~~~~~~
[root@cent6 drac]# make
[root@cent6 drac]# make install
install -c -o bin -g bin -m 0755 rpc.dracd /usr/local/sbin
[root@cent6 drac]# cp drac.h /usr/local/include/
[root@cent6 drac]# cp libdrac.a /usr/local/lib
|
dovecot drac_pluginの導入
[root@cent6 drac]# cd ../dovecot2-drac
[root@cent6 dovecot2-drac]# vi Makefile ##DOVDIR:=../dovecot-2.0.13 DOVDIR:= /usr/include/dovecot LIBS:=-ldrac LDFLAGS:=-L/usr/local/lib CFLAGS=-Wall -W -shared -fPIC -DHAVE_CONFIG_H -I$(DOVDIR) \ -I$(DOVDIR)/src/lib \ -I$(DOVDIR)/src/lib-index \ -I$(DOVDIR)/src/lib-mail \ -I$(DOVDIR)/src/lib-storage \ -I$(DOVDIR)/src/lib-storage/index \ -I$(DOVDIR)/src/lib-storage/index/maildir all: drac_plugin.so drac_plugin.so: drac-plugin.c $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ $(LIBS) clean: @rm -f *.so *.o [root@cent6 dovecot2-drac]# make cc -Wall -W -shared -fPIC -DHAVE_CONFIG_H -I/usr/include/dovecot -I/usr/include/dovecot/src/lib -I/usr/include/dovecot/src/lib-index -I/usr/include/dovecot/src/lib-mail -I/usr/include/dovecot/src/lib-storage -I/usr/include/dovecot/src/lib-storage/index -I/usr/include/dovecot/src/lib-storage/index/maildir -L/usr/local/lib drac-plugin.c -o drac_plugin.so -ldrac 32bitの場合 [root@cent6 dovecot2-drac]# cp -pi drac_plugin.so /usr/lib/dovecot/
64bitの場合
[root@cent6 dovecot2-drac]# cp -pi drac_plugin.so /usr/lib64/dovecot/
|
dovecotの設定変更
[root@cent6 dovecot2-drac]# vi /etc/dovecot/conf.d/10-mail.conf
# Space separated list of plugins to load for all services. Plugins specific to # IMAP, LDA, etc. are added to this list in their own .conf files. #mail_plugins = mail_plugins = drac [root@cent6 dovecot2-drac]# vi /etc/dovecot/conf.d/90-plugin.conf plugin { #setting_name = value dracdserver = localhost dracdtimeout = 60 } [root@cent6 dovecot2-drac]# |
dracの起動
[root@cent6 dovecot2-drac]# /usr/local/sbin/rpc.dracd -e 5 /etc/postfix/drac.db
-e 5 : DRACのデータベースでの存在期間(min) /etc/postfix/drac.db : データベースファイルの場所 |
dracd起動ファイルの例
#!/bin/bash
# chkconfig: - 90 25 ### BEGIN INIT INFO # Provides: rpcdrac # Short-Description: Dynamic Relay Authorization Control # Description: Dynamic Relay Authorization Control ### END INIT INFO . /etc/rc.d/init.d/functions prog="/usr/local/sbin/rpc.dracd" timeout="5" conf="/etc/postfix/drac.db" pidfile="/var/run/rpc.dracd.pid" RETVAL=0 start() { echo -n "Starting $prog:" daemon $prog -e $timeout $conf RETVAL=$? echo [ $RETVAL = 0 ] && touch $pidfile return $RETVAL } stop() { echo -n "Stopping $prog:" killproc $prog RETVAL=$? echo rm -f $pidfile return $RETVAL } case $1 in start ) start ;; stop ) stop ;; restart) stop && start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac |
postfixの設定変更
※下の方法だけじゃなくて、いろんな参照のさせ方があると思います。
[root@cent6 dovecot2-drac]# vi /etc/postfix/main.cf
mynetworks = check_client_access btree:/etc/postfix/drac [root@cent6 dovecot2-drac]# |
と、こんな感じでした。
2015/7/12 追記
・以下のエラーに対応
[root@cent6-64 dovecot2-drac]# make cc -Wall -W -shared -fPIC -DHAVE_CONFIG_H -I/usr/include/dovecot -I/usr/include/dovecot/src/lib -I/usr/include/dovecot/src/lib-index -I/usr/include/dovecot/src/lib-mail -I/usr/include/dovecot/src/lib-storage -I/usr/include/dovecot/src/lib-storage/index -I/usr/include/dovecot/src/lib-storage/index/maildir -L/usr/local/lib drac-plugin.c -o drac_plugin.so -ldrac /usr/bin/ld: /usr/local/lib/libdrac.a(dracauth.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libdrac.a: could not read symbols: Bad value collect2: ld はステータス 1 で終了しました make: *** [drac_plugin.so] エラー 1 [root@cent6-64 dovecot2-drac]# |