FreeBSD 8.4 RELEASE - FTP - IP アドレス制限
1. 概要 「rc.conf の編集」のみで起動した場合、どこからでも FTP サーバにアクセスできてしまいます。 FTP サーバを inetd 経由で起動する場合は、/etc/hosts.allow を編集することでアクセスできる IP アドレスの制限をかけられますが、inetd 経由で起動する場合は、/etc/hosts.allow では IP アドレスの制限はかけられません。 ここでは tcpsever というツールを使用して、IP アドレス制限をかける方法を紹介します。 2. tcpserver のインストール tcpsever は ucspi-tcp という ports をインストールします。 tcpsever のインストールが終わったら、FTP 専用で動作させて他のソフトウェアと名前がユニークになるようにするために、シンボリックリンクを作成しておきます。 > ln -s /usr/local/bin/tcpserver /usr/local/bin/tcpserver_ftp 3. 許可アドレスの記述 FTP での接続は基本を拒否にして、許可アドレスを列挙する形式にします。 /etc/ ディレクトリに、/etc/tcp.ftp というファイルを作って次のように編集します。あなたのグローバルネットワークアドレスを仮に xxx.yyy.zzz.0/29 とします。 127.:allow xxx.yyy.zzz.0-8:allow # :deny 127. は、ループバックアドレス(127.0.0.1)です。 xxx.yyy.zzz.0-8 は許可する IP アドレスの記述です。 # ではじまる行は、コメント行です。 最後の :deny はデフォルトルールで、allow で記述したもの以外は拒否する仕組みです。 /etc/tcp.ftp の編集が終わったら、次のコマンドでデータベースを作成します。 > tcprules /etc/tcp.ftp.cdb /etc/tcp.ftp.tmp < /etc/tcp.ftp 4. ブートスクリプトの編集 tcpsever 経由で FTP サーバを起動するには、ブートスクリプトを編集しなければなりません。 ブートスクリプトは /etc/rc.d/ftpd です。 デフォルトで以下のように記述されています。 #!/bin/sh ・・・ . /etc/rc.subr name="ftpd" rcvar=`set_rcvar` command="/usr/libexec/${name}" pidfile="/var/run/${name}.pid" start_precmd=ftpd_prestart ftpd_prestart() { rc_flags="-D ${rc_flags}" return 0 } load_rc_config $name run_rc_command "$1" これを以下のように編集します。編集を行う前に /etc/rc.d/ftpd stop で忘れずに FTP サーバを停止しておいてください。 #!/bin/sh ・・・ . /etc/rc.subr name="ftpd" ftpd_enable=${ftpd_enable:-"NO"} procname="/usr/local/bin/tcpserver_ftp" start_cmd="ftpd_start" ftpd_start() { echo "Starting ${name}." /usr/local/bin/tcpserver_ftp -x /etc/tcp/tcp.ftp.cdb 0 \ ftp /usr/libexec/ftpd -ld 2>&1 & } load_rc_config $name run_rc_command "$1" これで、/etc/rc.d/ftpd start で FTP サーバを起動すれば、IP アドレスの制限がかかります。
> ln -s /usr/local/bin/tcpserver /usr/local/bin/tcpserver_ftp
127.:allow xxx.yyy.zzz.0-8:allow # :deny
> tcprules /etc/tcp.ftp.cdb /etc/tcp.ftp.tmp < /etc/tcp.ftp
#!/bin/sh ・・・ . /etc/rc.subr name="ftpd" rcvar=`set_rcvar` command="/usr/libexec/${name}" pidfile="/var/run/${name}.pid" start_precmd=ftpd_prestart ftpd_prestart() { rc_flags="-D ${rc_flags}" return 0 } load_rc_config $name run_rc_command "$1"
#!/bin/sh ・・・ . /etc/rc.subr name="ftpd" ftpd_enable=${ftpd_enable:-"NO"} procname="/usr/local/bin/tcpserver_ftp" start_cmd="ftpd_start" ftpd_start() { echo "Starting ${name}." /usr/local/bin/tcpserver_ftp -x /etc/tcp/tcp.ftp.cdb 0 \ ftp /usr/libexec/ftpd -ld 2>&1 & } load_rc_config $name run_rc_command "$1"