relay-ctrl3.1.1のインストールと設定
relay-ctrl3.1.1のインストールと設定
0.改訂履歴
- 2006.08.11 新規作成
- 2007.01.22 誤字修正.
1.はじめに
このドキュメントでは,relay-ctrlのインストール手順を説明する. このツールも長い間バージョンアップされていない模様.
relay-ctrlとは,qmail上でPOP before SMTPを実現するツールで,qmail-popupとqmail-pop3dの組み合わせで使用する. qmail-popup以外のPOPサーバでは利用できないが,Courier-IMAPサーバとは共存できる.
POP before SMTPとは,POP認証が成功したユーザに対して,一定時間メール送信(SMTP接続)を許可する仕組みで,そのサイトのユーザ以外は送信できないようにする方法の1つである.
今回は,qmailとtcpserverを組み込んでいる環境に,このrelay-ctrlを組み合わせる事とする.
なお,使用しているOSは,RedHat Linux ES上で稼働している.
2.動作原理について
- 動作原理を知っておくと良いので,箇条書きで簡単に説明する.
- メールクライアントが,POPでメールを取得するために接続する.
- POP3サーバは,POPで認証を行う.
- 成功したらRELAY_CTRL_DIRで指定したディレクトリに接続してきたクライアントのIPアドレスを記録する.
- このドキュメントでは,RELAY_CTRL_DIR=/var/spool/relay-ctrl/allow
- ファイル名がIPアドレスのファイルが格納される.
- クライアントが,メールを送信する為にSMTPサーバに接続する.
- SMTPサーバは,接続してきたクライアントのIPアドレスがRELAY_CTRL_DIRに保存されているものだったら,送信を許可する.
- 送信を許可する時間は,RELAY_CTRL_EXPIRYで指定された時間内.
- relay-ctrl-ageコマンドをcronで定期的に動作させることによって,保存期間を過ぎた記録を削除する.
3.モジュールの入手とインストール
- 公式サイトは,次のURLとなる.
- モジュールをダウンロードする.
[root@jupiter Download]# curl -O http://untroubled.org/relay-ctrl/relay-ctrl-3.1.1.tar.gz
% Total % Received % Xferd Average Speed Time Curr.
Dload Upload Total Current Left Speed
100 35046 100 35046 0 0 27209 0 0:00:01 0:00:01 0:00:00 56076
[root@jupiter Download]#
|
[root@jupiter Download]# ls -la relay-ctrl-3.1.1.tar.gz
-rw-r--r-- 1 root root 35046 Aug 11 15:46 relay-ctrl-3.1.1.tar.gz
[root@jupiter Download]#
|
[root@jupiter Download]# tar xfz relay-ctrl-3.1.1.tar.gz
[root@jupiter Download]#
|
[root@jupiter Download]# cd relay-ctrl-3.1.1
[root@jupiter relay-ctrl-3.1.1]# ls
ANNOUNCEMENT direntry.h1 packet.html setenv.c
COPYING direntry.h2 relay-ctrl-3.1.1.spec setenv.h1
FILES fork.h1 relay-ctrl-age.8 setenv.h2
Makefile fork.h2 relay-ctrl-age.c touch.c
NEWS installer.c relay-ctrl-allow.8 trydirent.c
README installer.h relay-ctrl-allow.c trypoll.c
TARGETS instcheck.c relay-ctrl-chdir.c trysetenv.c
TODO insthier.c relay-ctrl-check.8 trysysel.c
VERSION instshow.c relay-ctrl-check.c trysystime.c
authenticated.c iobuf relay-ctrl-send.8 trytime.c
chdir.c iopoll.c relay-ctrl-send.c tryvfork.c
choose.sh iopoll.h1 relay-ctrl-udp.8 validate_ip.c
conf-bin iopoll.h2 relay-ctrl-udp.c warn-auto.sh
conf-cc misc relay-ctrl.h
conf-ld msg select.h1
conf-man net select.h2
[root@jupiter relay-ctrl-3.1.1]#
|
- このモジュールはconfigureをするタイプではない為,makeを実行する.
[root@jupiter relay-ctrl-3.1.1]# make
( echo '#!/bin/sh';¥
echo 'main="$1"; shift';¥
echo exec `head -1 conf-ld` '-o "$main" "$main.o" ${1+"$@"}';¥
) >load
chmod 755 load
( echo '#!/bin/sh'; ¥
echo 'source=$1; shift'; ¥
echo 'base=`echo "$source" | sed -e s:¥¥¥¥.c$::`'; ¥
echo exec `head -1 conf-cc` '-I. -o ${base}.o -c $source ${1+"$@"}'; ¥
) >compile
chmod 755 compile
( ( ./compile trysystime.c >/dev/null 2>&1 && ¥
echo '#include <sys/time.h>' ); ¥
( ./compile trytime.c >/dev/null 2>&1 && ¥
echo '#include <time.h>' ) ) >systime.h
rm -f trysystime.o trytime.o
./compile relay-ctrl-allow.c
( echo '#!/bin/sh'; ¥
echo 'main="$1"; shift';¥
echo 'rm -f "$main"';¥
echo 'ar cr "$main" ${1+"$@"}';¥
echo 'ranlib "$main"';¥
) >makelib
chmod 755 makelib
./compile authenticated.c
./compile chdir.c
./compile touch.c
./compile validate_ip.c
./makelib relay-ctrl.a authenticated.o chdir.o touch.o validate_ip.o
./compile misc/strtou.c
./compile misc/utoa.c
./compile misc/utoa2.c
./makelib misc/misc.a misc/strtou.o misc/utoa.o misc/utoa2.o
./compile msg/common.c
./compile msg/debug.c
./compile msg/die.c
./compile msg/error.c
./compile msg/warn.c
./makelib msg/msg.a msg/common.o msg/debug.o msg/die.o msg/error.o msg/warn.o
./compile iobuf/iobuf_close.c
./compile iobuf/iobuf_copy.c
./compile iobuf/iobuf_init.c
cat warn-auto.sh choose.sh >choose
chmod 755 choose
./choose clr trypoll iopoll.h1 iopoll.h2 > iopoll.h
./compile iobuf/iobuf_timeout.c
./compile iobuf/ibuf_getc.c
./compile iobuf/ibuf_gets.c
./compile iobuf/ibuf_getu.c
./compile iobuf/ibuf_init.c
./compile iobuf/ibuf_open.c
./compile iobuf/ibuf_peek.c
./compile iobuf/ibuf_read.c
./compile iobuf/ibuf_refill.c
./compile iobuf/ibuf_seek.c
./compile iobuf/ibuf_status.c
./compile iobuf/ibuf_stdin.c
./compile iobuf/ibuf_tell.c
./compile iobuf/obuf_close.c
./compile iobuf/obuf_endl.c
./compile iobuf/obuf_flush.c
./compile iobuf/obuf_init.c
./compile iobuf/obuf_open.c
./compile iobuf/obuf_pad.c
./compile iobuf/obuf_put2s.c
./compile iobuf/obuf_put3s.c
./compile iobuf/obuf_put4s.c
./compile iobuf/obuf_put5s.c
./compile iobuf/obuf_put6s.c
./compile iobuf/obuf_put7s.c
./compile iobuf/obuf_putc.c
./compile iobuf/obuf_putiw.c
./compile iobuf/obuf_putnetstring.c
./compile iobuf/obuf_putsflush.c
./compile iobuf/obuf_putuw.c
./compile iobuf/obuf_seek.c
./compile iobuf/obuf_stderr.c
./compile iobuf/obuf_stdout.c
./compile iobuf/obuf_sync.c
./compile iobuf/obuf_write.c
./makelib iobuf/iobuf.a iobuf/iobuf_close.o iobuf/iobuf_copy.o iobuf/iobuf_ini
t.o iobuf/iobuf_timeout.o iobuf/ibuf_getc.o iobuf/ibuf_gets.o iobuf/ibuf_getu.
o iobuf/ibuf_init.o iobuf/ibuf_open.o iobuf/ibuf_peek.o iobuf/ibuf_read.o iobu
f/ibuf_refill.o iobuf/ibuf_seek.o iobuf/ibuf_status.o iobuf/ibuf_stdin.o iobuf
/ibuf_tell.o iobuf/obuf_close.o iobuf/obuf_endl.o iobuf/obuf_flush.o iobuf/obu
f_init.o iobuf/obuf_open.o iobuf/obuf_pad.o iobuf/obuf_put2s.o iobuf/obuf_put3
s.o iobuf/obuf_put4s.o iobuf/obuf_put5s.o iobuf/obuf_put6s.o iobuf/obuf_put7s.
o iobuf/obuf_putc.o iobuf/obuf_putiw.o iobuf/obuf_putnetstring.o iobuf/obuf_pu
tsflush.o iobuf/obuf_putuw.o iobuf/obuf_seek.o iobuf/obuf_stderr.o iobuf/obuf_
stdout.o iobuf/obuf_sync.o iobuf/obuf_write.o
./choose c trysysel select.h1 select.h2 > select.h
./compile iopoll.c
./load relay-ctrl-allow relay-ctrl.a misc/misc.a msg/msg.a iobuf/iobuf.a iopol
l.o
./choose cl trysetenv setenv.h1 setenv.h2 > setenv.h
./compile relay-ctrl-check.c
relay-ctrl-check.c: In function `main':
relay-ctrl-check.c:87: warning: implicit declaration of function `do_chdir'
relay-ctrl-check.c:75: warning: unused variable `dir'
./compile setenv.c
./load relay-ctrl-check relay-ctrl.a misc/misc.a msg/msg.a iobuf/iobuf.a iopol
l.o setenv.o
( ./compile trydirent.c >/dev/null 2>&1 ¥
&& cat direntry.h2 || cat direntry.h1 ) > direntry.h
rm -f trydirent.o
./compile relay-ctrl-age.c
./load relay-ctrl-age msg/msg.a iobuf/iobuf.a iopoll.o
./compile relay-ctrl-udp.c
./compile net/ipv4_addr.c
./compile net/ipv4_format.c
./compile net/ipv4_parse.c
./makelib net/ipv4.a net/ipv4_addr.o net/ipv4_format.o net/ipv4_parse.o
./compile net/accept4.c
./compile net/acceptu.c
./compile net/bind4.c
./compile net/bindu.c
./compile net/broadcast.c
./compile net/connect4.c
./compile net/connected.c
./compile net/connectu.c
./compile net/cork.c
./compile net/getaddr4.c
./compile net/linger.c
./compile net/listen.c
./compile net/pair.c
./compile net/recv4.c
./compile net/recvu.c
./compile net/reuse.c
./compile net/send4.c
./compile net/sendu.c
./compile net/shutdown.c
./compile net/tcp.c
./compile net/udp.c
./compile net/uncork.c
./compile net/unixdgm.c
./compile net/unixstr.c
./makelib net/socket.a net/accept4.o net/acceptu.o net/bind4.o net/bindu.o net
/broadcast.o net/connect4.o net/connected.o net/connectu.o net/cork.o net/geta
ddr4.o net/linger.o net/listen.o net/pair.o net/recv4.o net/recvu.o net/reuse.
o net/send4.o net/sendu.o net/shutdown.o net/tcp.o net/udp.o net/uncork.o net/
unixdgm.o net/unixstr.o
./load relay-ctrl-udp relay-ctrl.a misc/misc.a msg/msg.a iobuf/iobuf.a net/ipv
4.a net/socket.a iopoll.o
( ( ./compile tryvfork.c && ./load tryvfork ) >/dev/null 2>&1 ¥
&& cat fork.h2 || cat fork.h1 ) > fork.h
rm -f tryvfork.o tryvfork
./compile relay-ctrl-send.c
./load relay-ctrl-send relay-ctrl.a msg/msg.a iobuf/iobuf.a net/ipv4.a net/soc
ket.a iopoll.o
./compile relay-ctrl-chdir.c
./load relay-ctrl-chdir misc/misc.a msg/msg.a iobuf/iobuf.a setenv.o iopoll.o
./compile installer.c
head -1 conf-bin | ¥
sed -e 's/"/¥¥"/g' ¥
-e 's/^/const char conf_bin[] = "/' ¥
-e 's/$/";/' >conf_bin.c
head -1 conf-man | ¥
sed -e 's/"/¥¥"/g' ¥
-e 's/^/const char conf_man[] = "/' ¥
-e 's/$/";/' >conf_man.c
./compile insthier.c
./load installer insthier.o
./compile instcheck.c
./load instcheck insthier.o
./compile instshow.c
./load instshow insthier.o
[root@jupiter relay-ctrl-3.1.1]#
|
[root@jupiter relay-ctrl-3.1.1]# ./installer
[root@jupiter relay-ctrl-3.1.1]#
|
3.設定
- 接続許可IPアドレスのリストを置くためのディレクトリを作成する.
[root@jupiter relay-ctrl-3.1.1]# mkdir -p /var/spool/relay-ctrl/allow
[root@jupiter relay-ctrl-3.1.1]# chmod 700 /var/spool/relay-ctrl/
[root@jupiter relay-ctrl-3.1.1]# chmod 777 /var/spool/relay-ctrl/allow
[root@jupiter relay-ctrl-3.1.1]#
|
[root@jupiter relay-ctrl-3.1.1]# mkdir /etc/relay-ctrl
[root@jupiter relay-ctrl-3.1.1]#
|
[root@jupiter relay-ctrl-3.1.1]# cd /etc/relay-ctrl
[root@jupiter relay-ctrl]# echo /var/spool/relay-ctrl/allow > RELAY_CTRL_DIR
[root@jupiter relay-ctrl]# echo 900 > RELAY_CTRL_EXPIRY
[root@jupiter relay-ctrl]#
|
- 環境変数RELAY_CTRL_DIRが,接続元IPアドレスを格納するディレクトリを示す.
- 環境変数RELAY_CTRL_EXPIRYで指定した数値は,秒数で有効時間となる.
コピペ用
mkdir -p /var/spool/relay-ctrl/allow
chmod 700 /var/spool/relay-ctrl/
chmod 777 /var/spool/relay-ctrl/allow
mkdir /etc/relay-ctrl
cd /etc/relay-ctrl
echo /var/spool/relay-ctrl/allow > RELAY_CTRL_DIR
echo 900 > RELAY_CTRL_EXPIRY
|
[root@jupiter relay-ctrl]# locate run | grep pop3d
/var/qmail/supervise/pop3d/run
[root@jupiter relay-ctrl]#
|
変更前 |
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/pop3d/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" /usr/local/bin/tcpserver -v -x /etc/tcp
server/pop3_rules.cdb -R -H 0 pop3 /var/qmail/bin/qmail-popup jupiter /bin/che
ckpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1
[root@jupiter relay-ctrl]#
|
変更後 |
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/pop3d/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" /usr/local/bin/envdir /etc/relay-ctrl
relay-ctrl-chdir /usr/local/bin/tcpserver -v -x /etc/tcpserver/pop3_rules.cdb -
R -H 0 pop3 /var/qmail/bin/qmail-popup jupiter /bin/checkpassword
relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1
[root@jupiter relay-ctrl]#
|
- ここでは,ログインが成功したときにralay-ctrl-allowコマンドが呼び出される.
- 次に,SMTPDの起動スクリプトを探す.
[root@jupiter relay-ctrl]# locate run | grep smtpd
/var/qmail/supervise/smtpd/run
[root@jupiter relay-ctrl]#
|
変更前 |
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/smtpd/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:/usr/local/bin:/bin:/usr/bin" /usr/local/bin/
tcpserver -v -x /etc/tcpserver/smtpd_rules.cdb -R -H -lo -u 712 -g 710 0 smtp
/var/qmail/bin/qmail-smtpd 2>&1
[root@jupiter relay-ctrl]#
|
変更後 |
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/smtpd/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:/usr/local/bin:/bin:/usr/bin"
/usr/local/bin/envdir /etc/relay-ctrl relay-ctrl-chdir
/usr/local/bin/tcpserver -v -x /etc/tcpserver/smtpd_rules.cdb -R -H -lo -u 712
-g 710 0 smtp relay-ctrl-check /var/qmail/bin/qmail-smtpd 2>&1
[root@jupiter relay-ctrl]#
|
- SMTP通信する前に,relay-ctrl-checkプログラムが呼び出される.
- これで設定終了
3.動作を確認してみる
[root@jupiter root]# cd /var/spool/relay-ctrl/allow
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx 2 root root 4096 Aug 15 19:55 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
-rw-rw-rw- 1 support ujpjp 13 Aug 15 19:55 192.168.123.128
[root@jupiter allow]#
|
- 現在192.168.123.128のアドレスが許可されている.
- このファイルを消す.
[root@jupiter allow]# rm 192.168.123.128
rm: remove regular file `192.168.123.128'? y
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx 2 root root 4096 Aug 15 20:00 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
[root@jupiter allow]#
|
- ファイルが消えたので,メーラを使って送信を行う.
- すると,次のようなダイアログが表示される.
[root@jupiter allow]# touch 192.168.123.128
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx 2 root root 4096 Aug 15 20:03 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
-rw-r--r-- 1 root root 0 Aug 15 20:03 192.168.123.128
[root@jupiter allow]#
|
- この状態で送信が可能となる.
- また,このファイルは削除してメールソフトで受信すると,(たとえメールの受信が無くても)新たにファイルが作成されていることが確認できる.
[root@jupiter allow]# rm 192.168.123.128
rm: remove regular file `192.168.123.128'? y
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx 2 root root 4096 Aug 15 20:07 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx 2 root root 4096 Aug 15 20:07 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
-rw-rw-rw- 1 support ujpjp 13 Aug 15 20:07 192.168.123.128
[root@jupiter allow]#
|
- なお,このファイルはクライアントがPOPで受信を行う都度,最新のタイムスタンプに更新される.
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx 2 root root 4096 Aug 15 20:12 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
-rw-rw-rw- 1 support ujpjp 13 Aug 15 20:12 192.168.123.128
[root@jupiter allow]#
|
4.許可リストをメンテナンスする
- このままで運用すると,allowディレクトリにファイルができたままとなり許可しっぱなしとなる.
- よって,許可リストを定期的に削除する必要がある.
- relay-ctrl-ageコマンドを使うことで,期限が切れたファイルを削除することができる.
- つまり,このrelay-ctrl-ageコマンドをcronで定期的に実行することで目的が達成できる.
- まずは,動作を確認する.
- デフォルトの900秒(15分)では長いので,期限を1分に設定する.
[root@jupiter allow]# echo 60 > /etc/relay-ctrl/RELAY_CTRL_EXPIRY
[root@jupiter allow]# cat /etc/relay-ctrl/RELAY_CTRL_EXPIRY
60
[root@jupiter allow]#
|
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx 2 root root 4096 Aug 15 20:33 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
-rw-rw-rw- 1 support ujpjp 13 Aug 15 20:33 192.168.123.128
[root@jupiter allow]# rm 192.168.123.128
rm: remove regular file `192.168.123.128'? y
[root@jupiter allow]#
|
- メールクライアントでメール受信を行い,新たにファイルができていることを確認する.
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx 2 root root 4096 Aug 15 21:02 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
-rw-rw-rw- 1 support ujpjp 13 Aug 15 21:02 192.168.123.128
[root@jupiter allow]# date
Tue Aug 15 21:02:54 JST 2006
[root@jupiter allow]#
|
[root@jupiter allow]# /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
[root@jupiter allow]# date
Tue Aug 15 21:03:21 JST 2006
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx 2 root root 4096 Aug 15 21:02 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
-rw-rw-rw- 1 support ujpjp 13 Aug 15 21:02 192.168.123.128
[root@jupiter allow]#
|
- 経過時間が30秒弱なので,ファイルが残っている.
- もうしばらく待って,実行してみる.
[root@jupiter allow]# date
Tue Aug 15 21:05:40 JST 2006
[root@jupiter allow]# /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
[root@jupiter allow]# date
Tue Aug 15 21:05:44 JST 2006
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx 2 root root 4096 Aug 15 21:05 .
drwx------ 3 root root 4096 Aug 11 16:13 ..
[root@jupiter allow]#
|
- ファイルが消えていることがわかる.
- 期限切れ時間を元に戻しておく.
[root@jupiter allow]# echo 900 > /etc/relay-ctrl/RELAY_CTRL_EXPIRY
[root@jupiter allow]#
|
*/10 * * * * /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
|