up_l dmy up_r
dmy home dmy dmy dmy

●tcpserverでtelnetd&proftpd●

(※管理人は現在これを使用していません)

inetdでproftpdを運用しているとDoS攻撃(大量にコネクションをはってくるだけ)
を受けた場合、いとも簡単にinetdは死んでしまいます。
とはいっても実際にはinetd自身が一時的にサービスを停止しているだけで、
数分後にはまだサービスが開始されます。
ただこのDoS攻撃を受けた続けた場合、「停止→復旧→停止」を繰り返すだけなので、
FTPはまともに使えないということになってしまいます。
xinetdが主流になってからはそういった脆さは改善された?のではないかと思いますが、
個人的にはinetd(xinetd)を使わずにtcpserverでproftpdを動かすことにしました。
私の環境下ではinetdで動かしてしたのはtelnetd、proftpdのみでしたので、
ついでにtelnetdもtcpserverで動かして完全にinetdを停止することにしました。

■tcpserverの入手&インストール

> wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
> tar zxvf ucspi-tcp-0.88.tar.gz
> cd ucspi-tcp-0.88
> make
> make setup check

※インストール先は「/usr/local/bin/」になります。

■接続制御データベースの作成

> mkdir /etc/tcpserver
> vi /etc/tcpserver/ftp.rules
> vi /etc/tcpserver/telnet.rules

※接続制御データベースの記述方法
:allow                  #すべて許可する
192.168.0.12:allow      #192.168.0.12のみ許可する
192.168.0.12-20:allow   #192.168.0.12から192.168.0.20を許可する
:deny                   #すべて拒否する
192.168.0.12:deny       #192.168.0.12のみ拒否する
192.168.0.12-20:deny    #192.168.0.12から192.168.0.20を拒否する

例)
----------------------------------------------------------------
192.168.0.12-20:allow
:deny
----------------------------------------------------------------
192.168.0.12から192.168.0.20を許可してそれ以外からのアクセスは拒否する

※下記コマンドを実行することで接続制御データベースが作成されます。

> tcprules /etc/tcpserver/ftp.cdb /tmp/ftp.tmp < /etc/tcpserver/ftp.rules
> tcprules /etc/tcpserver/telnet.cdb /tmp/telnet.tmp < /etc/tcpserver/telnet.rules

※更新するごとに上記コマンド実行するのは面倒なのでスクリプトを作成します。

> vi /etc/tcpserver/tcprules.sh

[ tcprules.sh ]
----------------------------------------------------------------
#!/bin/sh
/usr/local/bin/tcprules /etc/tcpserver/ftp.cdb /tmp/ftp.tmp < /etc/tcpserver/ftp.rules
/usr/local/bin/tcprules /etc/tcpserver/telnet.cdb /tmp/telnet.tmp < /etc/tcpserver/telnet.rules
----------------------------------------------------------------

■起動スクリプトの作成

> vi /etc/rc.d/init.d/tcpserver
> vi /etc/rc.d/init.d/tcpserver_sub

[ tcpserver ]

----------------------------------------------------------------
#!/bin/sh

. /etc/rc.d/init.d/functions

RETVAL=0

case "$1" in
    start)
        echo -n "Starting tcpserver daemon: "
        daemon /etc/rc.d/init.d/tcpserver_sub
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/tcpserver
        ;;
    stop)
        echo -n "Stopping tcpserver daemon: "
        killproc tcpserver
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/tcpserver
        ;;
    status)
        status tcpserver
        RETVAL=$?
        ;;
    restart)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
    *)
        echo "Usage: tcpserver {start|stop|status|restart}"
        exit 1
esac
exit $RETVAL
----------------------------------------------------------------

[ tcpserver_sub ]
----------------------------------------------------------------
#!/bin/sh
/usr/local/bin/tcpserver -v -u 0 -g 0 -x /etc/tcpserver/telnet.cdb 0 telnet /usr/sbin/in.telnetd &
/usr/local/bin/tcpserver -v -u 0 -g 0 -x /etc/tcpserver/ftp.cdb 0 ftp /usr/local/sbin/in.proftpd &
----------------------------------------------------------------

> chmod 755 tcpserver
> chmod 755 tcpserver_sub

※ランレベルにtcpserverを追加

> /sbin/chkconfig --add tcpserver

■tcpserverの起動

※起動する前にinetd(xinetd)からのtelnetd、proftpdサービスを停止しておいて下さい。

> /etc/rc.d/init.d/tcpserver start

▲TOP

dmy
low_l dmy low_r