DJB Tools Tips

Menu

daemontools, tcpserver, tcpanalog, djbdns,

daemontools

セキュアなサーバ御用達のdaemontoolsを/usr/local/配下にインストール

build & install

[root@portage root]# cd /usr/local/
[root@portage local]# tar xvpfz ~yano/daemontools-0.76.tar.gz
admin
admin/daemontools-0.76
admin/daemontools-0.76/package
admin/daemontools-0.76/package/README
    :
[root@portage daemontools]# cd admin/daemontools-0.76/
[root@portage daemontools-0.76]# ./package/install
Linking ./src/* into ./compile...
Compiling everything in ./compile...
    :
[root@portage daemontools-0.76]# ll /command/
合計 2
drwxr-xr-x    2 root     root         1024  8月 31 15:02 ./
drwxr-xr-x   21 root     root         1024  8月 30 16:39 ../
lrwxrwxrwx    1 root     root           43  8月 31 15:02 envdir -> /usr/local/admin/daemontools/command/envdir*
lrwxrwxrwx    1 root     root           46  8月 31 15:02 envuidgid -> /usr/local/admin/daemontools/command/envuidgid*
    :
[root@portage daemontools-0.76]#

Fedora Coreなどでglibcのアップグレードに伴って「undefined reference to `errno'」というエラーが発生するようになっている。その場合はパッチ ftp://moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch を適用し、error.hのextern int errno;#include <errno.h>に置き換えれば良い。

daemontools-0.76.errno.patch
diff -ur daemontools-0.76.old/src/error.h daemontools-0.76/src/error.h
--- daemontools-0.76.old/src/error.h    2001-07-12 11:49:49.000000000 -0500
+++ daemontools-0.76/src/error.h        2003-01-09 21:52:01.000000000 -0600
@@ -3,7 +3,7 @@
#ifndef ERROR_H
#define ERROR_H

-extern int errno;
+#include <errno.h>

extern int error_intr;
extern int error_nomem;

起動スクリプト

システム起動時にsupervisorを起動させる為、/etc/rc.d/init.d/svscanを作成してサービスとして起動する。

もしくは/etc/inittabの最後に"SV:123456:respawn:env - PATH=/usr/local/bin:/usr/sbin:/usr/bin:/bin svscan /service </dev/null >/dev/console 2>&1"を追加するのもあり。

/etc/rc.d/init.d/svscan
[yano@portage yano]$ cat /etc/rc.d/init.d/svscan
#!/bin/sh
#
# svscan        Start svscan.
#
# Author:       TAKIZAWA Takashi <taki@cyber.email.ne.jp>
#
# chkconfig: 345 99 50
# description:  svscan starts and monitors a collection of services.
#               see http://cr.yp.to/daemontools.html
# processname: svscan
# service directory: /service

# Source function library.
. /etc/rc.d/init.d/functions

PATH="/usr/local/bin:$PATH"
prog=svscan
SVDIR=/service
RETVAL=0
export PATH SVDIR


start() {
  echo -n $"Starting $prog: "
  daemon svscan $SVDIR &
  RETVAL=$?
  echo_success
  echo
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/svscan
}

stop() {
  echo -n $"Stopping $prog: "
  killproc svscan
  RETVAL=$?
  (cd $SVDIR && svc -dx $SVDIR/*)
  (cd $SVDIR && svc -dx $SVDIR/*/log)
  echo
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/svscan
}


case "$1" in
start)
  start
  ;;
stop)
  stop
  ;;
status)
  status svscan
  RETVAL=$?
  ;;
restart|reload)
  stop
  start
  ;;
*)
  echo $"Usage: $prog {start|stop|status|restart|reload}"
  exit 1
esac

exit $RETVAL
[yano@portage yano]$ sudo /sbin/chkconfig --add svscan
参照
daemontoolshttp://www.emaillab.org/djb/daemontools/
実用qmailサーバ運用・管理術http://www.atmarkit.co.jp/flinux/index/indexfiles/qmailindex.html
私家版 daemontools FAQhttp://www.unixuser.org/~euske/doc/daemontools/

tcpserver

インストール

[yano@portage yano]$ tar zxvf ucspi_tcp-0.88.tar.gz
[yano@portage yano]$ cd ucspi-tcp0.88
[yano@portage ucspi-tcp0.88]$ make
[yano@portage ucspi-tcp0.88]$ sudo make setup check

アクセスルール

テキストでアクセスルールを作って、cdb形式のデータベースに変換する。sshだけでなくftpの分も忘れずに。

[yano@portage ucspi-tcp0.88]$ cd ~/tcpserver
[yano@portage tcpserver]$ cat ssh.rules ← サンプル
127.0.0.1:allow # localhostは接続許可
192.168.199.:allow # LAN内マシン(192.168.199.*)は接続許可
=.ap.plala.or.jp:allow # 接続を許可するプロバイダだけ列挙
=.infoweb.ne.jp:allow # 接続を許可するプロバイダだけ列挙
:deny # デフォルト接続拒否
[yano@portage tcpserver]$ /usr/local/bin/tcprules ssh.cdb ssh.tmp <ssh.rules
[yano@portage tcpserver]$ ll
合計 48
drwxr-xr-x    2 yano     member       4096  8月 29 22:00 ./
drwx-----x   53 yano     member       4096  8月 28 21:48 ../
lrwxrwxrwx    1 yano     member         14  8月 16 14:53 cdbs -> /etc/tcpserver/
-rw-r--r--    1 yano     member       2222 12月 30  2001 ftp.cdb
-rw-r--r--    1 yano     member        108 12月 30  2001 ftp.rules
-rw-r--r--    1 yano     member         37  5月 11  2001 pop3.rules
-rw-r--r--    1 yano     member       2140  5月 26  2001 smtp.cdb
-rw-r--r--    1 yano     member         61  5月 11  2001 smtp.rules
-rw-r--r--    1 yano     member       2222  8月 29 22:00 ssh.cdb
-rw-r--r--    1 yano     member         86  8月 29 21:57 ssh.rules
-rw-r--r--    1 yano     member         61  8月 16 16:28 tcp.smtp
-rw-r--r--    1 yano     member       2143  5月 26  2001 telnet.cdb
-rw-r--r--    1 yano     member         41  8月 24 11:01 telnet.rules
[yano@portage tcpserver]$ sudo cp ssh.cdb cdbs

ftpd,sshd用の環境を作成

下記shellスクリプトでサービス毎に起動環境を作成する

for daemon in ftpd sshd
do
  mkdir /etc/$daemon
  mkdir /etc/$daemon/log
  chmod +t /etc/$daemon
  mkdir /var/log/$daemon
  chmod 755 /var/log/$daemon
  touch /etc/$daemon/run
  echo "#!/bin/sh" >/etc/$daemon/log/run
  echo "exec /usr/local/bin/setuidgid root /usr/local/bin/multilog t /var/log/$daemon" >>/etc/$daemon/log/run
  chmod 744 /etc/$daemon/run /etc/$daemon/log/run
done

で、runを以下の様に作成

/etc/ftpd/run
#!/bin/sh
PATH=/usr/local/bin:/usr/sbin/
tcpserver -u 0 -g 0 -v \
  -x /etc/tcpserver/ftp.cdb 0 ftp \
  /usr/sbin/in.ftpd -l -a 2>&1
/etc/sshd/run
#!/bin/sh
PATH=/usr/local/bin:/usr/sbin/
tcpserver -u 0 -g 0 -v \
  -x /etc/tcpserver/ssh.cdb 0 ssh \
  /usr/local/sbin/sshd -i 2>&1

log/runは以下の様に出来ているハズ

/etc/ftpd/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid root /usr/local/bin/multilog t /var/log/ftpd
/etc/sshd/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid root /usr/local/bin/multilog t /var/log/sshd
参照
tcpserverhttp://www.emaillab.org/djb/tcpserver/
OCN Tech Web セキュリティ - TCPServerhttp://www.ocn.ad.jp/security/linux/011.html

tcpanalog

ログ形式に合わせてmultilog用をチョイスする事。

build & install

[yano@portage yano]$ tar xvpfz tcpanalog-multilog-0.23.tar.gz
[yano@portage yano]$ cd tcpanalog-multilog-0.23
[yano@portage tcpanalog-multilog-0.23]$ make
[yano@portage tcpanalog-multilog-0.23]$ sudo make install
/etc/cron.weekly/tcpanalog.cron
#!/bin/sh
MAILTO=logwatcher@bravotouring.com
MAILFROM=tcpanalog@bravotouring.com
export PATH="$PATH:/usr/local/bin:/usr/local/bin/tcpanalog"
tmpdir=/tmp/tcpana-cron.$$.$RANDOM
tmplog=$tmpdir/logfile
tmpfile=$tmpdir/repfile

mkdir $tmpdir
pushd $tmpdir >/dev/null

s_year=`date -d '1 week ago' +%Y`
s_month=`date -d '1 week ago' +%m`
s_day=`date -d '1 week ago' +%d`
e_year=`date +%Y`
e_month=`date +%m`
e_day=`date +%d`
x_year=`date -d '1 day' +%Y`
x_month=`date -d '1 day' +%m`
x_day=`date -d '1 day' +%d`

start="$s_year-$s_month-$s_day"
end="$e_year-$e_month-$e_day"
xday="$x_year-$x_month-$x_day"

LOGDIR=/var/log/

echo -e "\n$start 〜 $end" > $tmpfile

# 配下のdaemonを増やす時はここに並べる↓
for daemon in ftpd sshd; do
cat "$LOGDIR/$daemon"/{"@",cur}* 2>/dev/null \
  | tai64n2tai \
  | logselect.pl start $start end $xday \
  | tcpmatchup >$tmplog 5>/dev/null

(echo -e "\n---------- report of $daemon ----------"
ztcpdomains < $tmplog
ztcphosts < $tmplog
ztcpdeny < $tmplog ) >>$tmpfile
done

(echo "To: $MAILTO"
echo "From: $MAILFROM"
echo "Subject: tcpanalog for $e_year-$e_month-$e_day"
echo ""
cat $tmpfile ) | /var/qmail/bin/qmail-inject -f $MAILTO

popd >/dev/null
rm -rf $tmpdir
/usr/local/bin/tcpanalog/logselect.pl
#!/usr/bin/perl
#
# http://www.qcc.sk.ca/%7Echarlesc/software/misc/qlogselectを改造
#
use Time::Local;

$start_time = 0;
$end_time = 0;
$from_pattern = undef;
$add_status = 0;
$strip_status = 0;

sub conv_date {
 local($_) = shift;
 my $time;
 if(/^(\d+)-(\d+)-(\d+)$/) {
  $time = timelocal(0, 0, 0, $3, $2-1, $1);
 } elsif(/^\d+$/) {
  $time = $_;
 } else {
  print STDERR "Invalid time: '$_'\n";
  exit 1;
 }
 $time;
}

while($arg = shift @ARGV) {
 if($arg eq 'start') {
  $start_time = &conv_date(shift @ARGV);
 } elsif($arg eq 'end') {
  $end_time = &conv_date(shift @ARGV);
 } elsif($arg eq 'from') {
  $from_pattern = shift @ARGV;
 } elsif($arg eq 'stripstatus') {
  $strip_status = 1;
 } elsif($arg eq 'addstatus') {
  $add_status = 1;
 } else {
  print STDERR "Invalid argument '$arg'\n";
  exit 1;
 }
}

if($start_time) {
 while(<>) {
  next unless /^(\d+\.\d+) /o;
  last if $1 >= $start_time;
 }
}

$_ = <> unless $_;

while(1) {
 $line = $_;
 chomp;
 unless(s/^(\d+\.\d+) +//o) {
  print STDERR "Bad line: '$_'\n";
  next;
 }
 last if $end_time && $1 > $end_time;
 print $line;
} continue {
 $_ = <>;
 last unless $_;
}
参照
tcpanaloghttp://www.emaillab.org/djb/tcpserver/tcpanalog.html

djbdns

install

tinydns-conf系では動作するローカルアドレス、dataでは応答するグローバルアドレスを記述する。

[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## 起動アカウントの作成
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# /usr/sbin/groupadd djbdns
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin tinydns
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin dnslog
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## 基本設定(ここで指定するのはローカルIPアドレス)
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# tinydns-conf tinydns dnslog /etc/tinydns 192.168.199.2
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# cd /etc/tinydns/root/
[root@nx9030 root]#
[root@nx9030 root]# ## レコード(いわゆるnamed.conf)の登録(ここはグローバルIPアドレス)
[root@nx9030 root]#
[root@nx9030 root]# cat data 実際はviで作成、211.127.***.***は全て同じアドレス
# SOA/NS/A
.bravotouring.com:210.175.***.***:ns1.bravotouring.com:86400
# SOA/NS
#.bravotouring.com::ns.spanavi.net:86400
.bravotouring.com:210.175.***.***:ns2.bravotouring.com:86400
# MX/A
@bravotouring.com::bunny.e-globaledge.com:10:86400
@bravotouring.com:210.175.***.***:mail.bravotouring.com:20:86400
# A
+bravotouring.com:210.175.***.***:86400
+www.bravotouring.com:210.175.***.***:86400
# TXT
'bravotouring.com:v=spf1 a -all:3600
'bravotouring.com:Powered by djbdns - http\072//cr.yp.to/djbdns.html
[root@nx9030 root]# make
/usr/local/bin/tinydns-data
[root@nx9030 root]#
[root@nx9030 root]# ## シンボリックリンクを張ると svscan によって起動する
[root@nx9030 root]#
[root@nx9030 root]# ln -s /etc/tinydns /service

dnscache/walldns

リゾルバにdnscacheを使用する。ローカルアドレスの逆引きならばloopback1で動かしているwalldnsに処理させる形。ローカルアドレスの逆引きをしなければバッサリ不要。

[root@nx9030 djbdns-1.05]# ## dnscache/walldns用のアカウントを作成
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin dnscache
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin walldns
[root@nx9030 djbdns-1.05]# ## walldns用のループバックインタフェースを作成
[root@nx9030 djbdns-1.05]# cat /etc/sysconfig/network-scripts/ifcfg-lo1
DEVICE=lo:1
IPADDR=127.0.0.2
NETMASK=255.0.0.0
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback1
[root@nx9030 djbdns-1.05]# /etc/sysconfig/network-scripts/ifup \
> /etc/sysconfig/network-scripts/ifcfg-lo1
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## reboot時にも生成されるように/etc/rc.d/init.d/networkのifcfg-lo制御部にもlo1処理を追加
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## dnscache,walldnsをインストール
[root@nx9030 djbdns-1.05]# dnscache-conf dnscache dnslog /etc/dnscache 127.0.0.1
[root@nx9030 djbdns-1.05]# walldns-conf walldns dnslog /etc/walldns 127.0.0.2
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# cd /etc/dnscache
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## DNSクエリーを受け入れるノード設定
[root@nx9030 dnscache]# touch root/ip/127.0.0.1
[root@nx9030 dnscache]# touch root/ip/192.168.199
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## ローカルアドレスの逆引きクエリーはwalldnsに問合せる設定
[root@nx9030 dnscache]# WALLIP=`cat /etc/walldns/env/IP`
[root@nx9030 dnscache]# echo $WALLIP > root/servers/168.192.in-addr.arpa
[root@nx9030 dnscache]# echo $WALLIP > root/servers/127.in-addr.arpa
[root@nx9030 dnscache]# echo $WALLIP > root/servers/10.in-addr.arpa
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## DNS fowarder の設定
[root@nx9030 dnscache]# echo 192.168.199.254 > root/servers/\@
[root@nx9030 dnscache]# echo true > env/FORWARDONLY
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## dnscache,walldnsを起動
[root@nx9030 dnscache]# ln -s /etc/dnscache /service
[root@nx9030 dnscache]# ln -s /etc/walldns /service
最後にリゾルバをdnscacheのアドレスに変更すれば万事OK。
[root@nx9030 dnscache]# echo "nameserver" `cat /etc/dnscache/env/IP` > /etc/resolv.conf
参照
djbdnshttp://djbdns.qmail.jp/
daemontoolshttp://www.emaillab.org/djb/daemontools/
EZ-NET特集 djbdnshttp://network.station.ez-net.jp/special/djbdns/

以下、参考

サーバ1台でdnscacheとtinydnsを同居させる為の仕掛け

dnscacheとtinydnsが同じポートUDP/53で競合する為、192.168.199.1[eth0] にalias機能で192.168.199.99[eth0:1]をオーバーラップさせる。

【2002.12.5】
NetGenesis SuperOPT70搭載のDNS forwarderを利用してdnscacheを停止する。tinydnsとaxfrdnsを192.168.199.1に移行し、192.168.199.99[eth0:1]は削除する。つまりこの細工は不要となった。

[root@portage root]#
[root@portage root]### aliasインタフェースを作成(eth0:0でも良かった?)
[root@portage root]#
[root@portage root]# /sbin/ifconfig eth0:1 inet 192.168.199.99
[root@portage root]#
[root@portage root]### aliasインタフェース作成の起動スクリプト
[root@portage root]#
[root@portage root]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:1 実際はviで作成
DEVICE=eth0:1
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.199.99
NETMASK=255.255.255.0
GATEWAY=192.168.199.254
[root@portage root]#

ゾーン転送forセカンダリDNS

U氏のご厚意によりセカンダリDNSを設置できた為、10月25日にaxfrdnsを導入しゾーン転送の設定を行う。インストール自体は難しくないが確認に時間がかかる。routerにUDPの53番も開ける必要があるらしい。(2002/10/27 OK)

レジストラのドメイン情報にもセカンダリDNSサーバ名を登録する必要があるので忘れずに。

[root@portage djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin axfrdns
[root@portage djbdns-1.05]# axfrdns-conf axfrdns dnslog /etc/tinydns 192.168.199.99
[root@portage djbdns-1.05]#
[root@portage djbdns-1.05]# cd /etc/tinydns/root/
[root@portage root]#
[root@portage root]#
[root@portage root]### レコード(いわゆるnamed.conf)の登録(ここはグローバルIPアドレス)
[root@portage root]#
[root@portage root]# cat data 実際はviで作成、211.127.***.***は全て同じアドレス
# SOA/NS/A
.bravotouring.com:211.127.*.*:ns1.bravotouring.com:259200
# SOA/NS
.bravotouring.com::ns.spanavi.net:259200

# MX/A
@bravotouring.com:211.127.*.*:mail.bravotouring.com:10:86400
# A
+www.bravotouring.com:211.127.*.*:86400
# TXT
'bravotouring.com:Powered by djbdns - http\072//cr.yp.to/djbdns.html

# SOA/NS
.yanoweb.com::ns1.bravotouring.com:259200
# MX
@yanoweb.com::mail.bravotouring.com:10:86400
# A
+www.yanoweb.com:211.127.*.*:86400
[root@portage root]#
[root@portage root]### シンボリックリンクを張ると svscan によって起動する
[root@portage root]#
[root@portage root]# ln -s /etc/axfrdns /service
[root@portage root]#
[root@portage root]### 念の為 tinydns を再起動
[root@portage root]#
[root@portage root]# svc -dx /service/tinydns
[root@portage root]#
[root@portage root]### セカンダリDNSに転送ゾーンデータへのアクセス許可を与える
[root@portage root]#
[root@portage root]# cd /etc/axfrdns
[yano@portage axfrdns]$ cat tcp 実際はviで作成、???.???は転送先DNSサーバ、***.***は転送するゾーンのアドレス
# sample line: 1.2.3.4:allow,AXFR="heaven.af.mil/3.2.1.in-addr.arpa"
219.117.???.???:allow,AXFR="bravotouring.com/***.***.127.211.in-addr.arpa"
:deny
[root@portage axfrdns]#
[root@portage axfrdns]# make
[root@portage axfrdns]#
[root@portage axfrdns]# cd ~yano/rpms/
[root@portage rpms]#
[root@portage rpms]# ## dataの更新後すぐにスレーブに反映させる為にtinydns-notify を使う
[root@portage rpms]# ## http://www.sericyb.com.au/tinydns-notify からダウンロード
[root@portage rpms]# snarf http://www.sericyb.com.au/tinydns-notify
[root@portage rpms]#
[root@portage rpms]# ## PerlNet::DNS モジュールが必要なので
[root@portage rpms]# ## http://www.net-dns.org/ からRPMをインストール
[root@portage rpms]# snarf http://perldns.8k.com/5.6.1/perl-Net-DNS-0.32-1.i386.rpm \
> http://perldns.8k.com/5.6.1/perl-Digest-HMAC-1.01-1.i386.rpm \
> http://perldns.8k.com/5.6.1/perl-Digest-SHA1-2.02-1.i386.rpm
[root@portage rpms]# rpm -Uvh perl-*
Preparing...
1:perl-Digest-SHA1
2:perl-Digest-HMAC
3:perl-Net-DNS
[root@portage rpms]# cd /etc/tinydns/root/
[root@portage root]#
[root@portage root]# cat Makefile
data.cdb: data
/usr/local/bin/tinydns-data
./tinydns-notify data ← ★★ 追加 ★★
[root@portage root]#
[root@portage root]# echo ns.spanavi.net > notify-list
[root@portage root]#
[root@portage root]# make
/usr/local/bin/tinydns-data
./tinydns-notify data
Received NOTIFY answer for bravotouring.com from 219.117.???.??? ← ★★ answerがあれば多分OK ★★
[root@portage root]#
========================
[yano@portage yano]$ ## dnsq でプライマリDNSからSOAレコードを引く
[yano@portage yano]$ dnsq soa bravotouring.com 192.168.199.99
6 bravotouring.com:
143 bytes, 1+1+2+1 records, response, authoritative, noerror
query: 6 bravotouring.com
answer: bravotouring.com 2560 SOA ns1.bravotouring.com hostmaster.bravotouring.com 1036027635 16384 2048 1048576 2560
authority: bravotouring.com 259200 NS ns1.bravotouring.com
authority: bravotouring.com 259200 NS ns.spanavi.net
additional: ns1.bravotouring.com 259200 A 211.127.***.***
[yano@portage yano]$ ## セカンダリDNSからも同じレコードが引ければOK
[yano@portage yano]$ dnsq soa bravotouring.com ns.spanavi.net
6 bravotouring.com:
159 bytes, 1+1+2+2 records, response, authoritative, weird ra, noerror
query: 6 bravotouring.com
answer: bravotouring.com 2560 SOA ns1.bravotouring.com hostmaster.bravotouring.com 1036027635 16384 2048 1048576 2560
authority: bravotouring.com 259200 NS ns1.bravotouring.com
authority: bravotouring.com 259200 NS ns.spanavi.net
additional: ns1.bravotouring.com 259200 A 211.127.***.***
additional: ns.spanavi.net 86400 A 219.117.???.???
[yano@portage yano]$

Tipsに戻る | Topに戻る

Copyright (c) 1998-2004 by YANO
All rights reserved.