この記事は2005年頃に執筆した文書がもとになっている。
序
使用した OS は FreeBSD5.3-RELEASE。ftpd のバージョンは 6.00。FreeBSD 標準の ftpd である。
有効化
OS のインストール時に既にインストールされているので、まずは rc.conf で inetd を有効化してやる。
# vi /etc/rc.conf
inetd_enable="YES"
# vi /etc/inetd.conf
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -S
-l -l のオプションを指定すると諸操作とファイル名を記録出来る。-S オプションは、anonymous 接続のログを記録。
なお、スタンドアロンで起動する場合は、
# /usr/libexec/ftpd -D
設定
ログを採る為の設定。
# vi /etc/syslog.conf
!ftpd *.* /var/log/ftpd_log
# vi /etc/newsyslog.conf
/var/log/ftpd_log 640 10 * $W0D0 Z
# touch /var/log/ftpd_log
inetd の設定ファイルでローカルネットワーク(例では 192.168.1.0/24)からのアクセスのみ許可。
# vi /etc/hosts.allow
ftpd : 192.168.1.0/255.255.255.0 : allow
デフォルトだとディレクトリを掘られてしまうので、chroot を設定。設定したいユーザとグループを指定してやる。
# vi /etc/ftpchroot
user1 user2 @group1 @grop2
その他、/etc/ftpusers で制限したいユーザを、/etc/ftpwelcome で接続時のメッセージを、/etc/ftpmotd でログイン後のメッセージを設定出来る。
ローカルタイムの定義
chroot を設定すると /etc/localtime を参照出来ないので、ファイル転送した時間がずれてしまう。これを解決するには、ホスト自体の内蔵時計を GMT に合わせたり、ユーザディレクトリに localtime をコピーしてやる方法がある。
# mkdir /home/user/etc # cp /etc/localtime /home/user/etc/localtime
もしくは、ftpd のソースを書き換えて再コンパイルする(146-155行目)。
# vi /usr/src/libexec/ftpd/popen.c
optreset = optind = optopt = 1; /* Close syslogging to remove pwd.db missing msgs */ closelog(); /* Trigger to sense new /etc/localtime after chroot */ setenv("TZ", "JST-9", 1); # 追加 if (getenv("TZ") == NULL) { setenv("TZ", "", 0); tzset(); unsetenv("TZ"); tzset(); }
# make clean # make # make install
Anonymous FTP
vipw か /stand/sysinstall の Configure – Netoworking – Anon FTP から Anonymous FTP 用のユーザ ftp を作成する。
# vipw
ftp:*:14:5::0:0:Anonymous FTP Admin:/var/ftp:/nonexistent
# mkdir /var/ftp # mkdir /var/ftp/bin # mkdir /var/ftp/etc # mkdir /var/ftp/pub # cp /bin/ls /var/ftp/bin
/stand/sysinstall から行った場合、接続時のメッセージも設定出来る。また、各ディレクトリは自動で作成される。ディレクトリ名等は好みで。続けて、chroot も設定。
# vi /etc/ftpchroot
ftp