vsftpdのインストール 
RedHat(FedoraCore)なんかにはデフォルトで
採用されているftpデーモンがvsftpdになっている。
pro-ftpdが一番主流かもしれないが、vsftpdも
かなり設定が簡単にできるのでLinuxな方は使っている。
実際にredhatのftpサーバもvsftpdだとか・・・
本当かどうか知りませんが・・・一日数万のアクセスにも
十分実用できているらしい。

【準備】
・vsftpd
http://vsftpd.beasts.org/
ここに最新のソースがあります。
IPv6に対応してないOSを使用するときは
1.1.3を使うしか今のところ方法がありません。
ftp://vsftpd.beasts.org/users/cevans/
もしもlinuxですでにvsftpdが入ってるなら
rpm -e vsftpdで消しておきましょう。

【インストール】
[07:05pm solaris26@ ftp]# ls
vsftpd-1.2.2.tar.gz
[07:09pm solaris26@ ftp]# gzip -dc vsftpd-1.2.2.tar.gz | tar xf -
[07:09pm solaris26@ ftp]# cd vsftpd-1.2.2

[07:12pm solaris26@ vsftpd-1.2.2]# cp -p builddefs.h builddefs.h.dist
[07:12pm solaris26@ vsftpd-1.2.2]# vi builddefs.h
[07:13pm solaris26@ vsftpd-1.2.2]# diff builddefs.h builddefs.h.dist
4c4
< #define VSF_BUILD_TCPWRAPPERS
---
> #undef VSF_BUILD_TCPWRAPPERS
[07:13pm solaris26@ vsftpd-1.2.2]# make 2>&1| tee make.log

--------OSがIPv6に対応してないと----------
sysutil.c:83: error: field `u_sockaddr_in6' has incomplete type
sysutil.c: In function `vsf_sysutil_get_ipv6_sock':
sysutil.c:1534: error: `PF_INET6' undeclared (first use in this function)
sysutil.c:1534: error: (Each undeclared identifier is reported only once
sysutil.c:1534: error: for each function it appears in.)
sysutil.c: In function `vsf_sysutil_bind':
sysutil.c:1566: error: `AF_INET6' undeclared (first use in this function)
sysutil.c:1568: error: invalid application of `sizeof' to an incomplete type
sysutil.c: In function `vsf_sysutil_accept_timeout':
sysutil.c:1632: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_connect_timeout':
sysutil.c:1665: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_getsockname':
sysutil.c:1727: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_getpeername':
sysutil.c:1752: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_alloc_ipv6':
sysutil.c:1803: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_clone':
sysutil.c:1820: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_addr_equal':
sysutil.c:1841: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_is_ipv6':
sysutil.c:1887: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_set_ipv6addr':
sysutil.c:1924: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_ipv6_v4':
sysutil.c:1940: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_get_raw_addr':
sysutil.c:1959: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_get_ipsock':
sysutil.c:1990: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_set_any':
sysutil.c:2009: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_sockaddr_set_port':
sysutil.c:2028: error: `AF_INET6' undeclared (first use in this function)
sysutil.c: In function `vsf_sysutil_inet_ntop':
sysutil.c:2056: error: `AF_INET6' undeclared (first use in this function)
sysutil.c:2059: warning: implicit declaration of function `inet_ntop'
sysutil.c:2061: warning: initialization makes pointer from integer without a cast
sysutil.c: In function `vsf_sysutil_inet_aton':
sysutil.c:2090: warning: implicit declaration of function `inet_aton'
make: *** [sysutil.o] Error 1
のようになってしまいます。

version1.2.0以降でIPv6に対応させましたが
OSがIPv6に対応していないOSでコンパイルすると
エラーが出てコンパイルできません。
IPv6を無効にすることが今の所できないので
できるまで待ってくれと・・・
もしくは1.1.13以下のバージョン使うようにすべきだとか・・・

FAQのファイルを見るとそう書いてました。
Q) Help! vsftpd doesn't build, it complains about problems with incomplete
types in sysutil.c.
A) Your system probably doesn't have IPv6 support. Either use a more modern
system, use an older vsftpd (e.g. v1.1.3), or wait for a version of vsftpd
without this problem!
古いOSではなくて新しい目のOSでコンパイルするのがよいかと・・・

ということなので仕方がないので今回は1.1.3を使います。
IPv6対応してる場合は最新を使いましょう!

[08:15pm solaris26@ ftp]# ls
vsftpd-1.1.3.tar.gz  vsftpd-1.2.2/  vsftpd-1.2.2.tar.gz
[08:15pm solaris26@ ftp]# gzip -dc vsftpd-1.1.3.tar.gz | tar xf -
[08:15pm solaris26@ ftp]# cd vsftpd-1.1.3

[08:16pm solaris26@ vsftpd-1.1.3]#
[08:16pm solaris26@ vsftpd-1.1.3]# cp -p builddefs.h builddefs.h.dist
[08:16pm solaris26@ vsftpd-1.1.3]# vi builddefs.h

[08:16pm solaris26@ vsftpd-1.1.3]# make 2>&1| tee make.log
[08:18pm solaris26@ vsftpd-1.1.3]# ls -l vsftpd
-rwxr-xr-x    1 root     other       94756 Jun 20 20:18 vsftpd*

vsftpdはnobodyがデフォルトのユーザに設定されています。
違うユーザで使う場合は作成しましょう。

[08:20pm solaris26@ vsftpd-1.1.3]# groupadd vsftpd
[08:20pm solaris26@ vsftpd-1.1.3]# useradd -g vsftpd -c "vsftpd user" -d /usr/local/share/empty -s /bin/false vsftpd
[08:22pm solaris26@ vsftpd-1.1.3]# mkdir -p /usr/local/share/empty

○anonymous用の準備
anonymous FTPにはftpユーザが存在している必要があります。
ftpユーザはホームディレクトリ(ftpユーザ所有でないか、ftpユーザに書き込み権がない)
が必要です。


[08:22pm solaris26@ vsftpd-1.1.3]# mkdir -p /usr/local/var/ftp
[08:43am solaris26@ vsftpd-1.1.3]# useradd -d /usr/local/var/ftp ftp
[08:44am solaris26@ vsftpd-1.1.3]# chmod og-w /usr/local/var/ftp
[08:45am solaris26@ vsftpd-1.1.3]# ls -dl /usr/local/var/ftp
drwxr-xr-x    2 root     other         512 Jun 20 20:23 /usr/local/var/ftp/

実際にデーモンと設定ファイルやmanをインストールします。
[08:45am solaris26@ vsftpd-1.1.3]# ls -dl /usr/local/var/ftp
drwxr-xr-x    2 root     other         512 Jun 20 20:23 /usr/local/var/ftp/
[08:45am solaris26@ vsftpd-1.1.3]# make install 2>&1| tee make_install.log
if [ -x /usr/local/sbin ]; then \
        install -m 755 vsftpd /usr/local/sbin/vsftpd; \
else \
        install -m 755 vsftpd /usr/sbin/vsftpd; fi
if [ -x /usr/local/man ]; then \
        install -D -m 644 vsftpd.8 /usr/local/man/man8/vsftpd.8; \
        install -D -m 644 vsftpd.conf.5 /usr/local/man/man5/vsftpd.conf.5; \
elif [ -x /usr/share/man ]; then \
        install -D -m 644 vsftpd.8 /usr/share/man/man8/vsftpd.8; \
        install -D -m 644 vsftpd.conf.5 /usr/share/man/man5/vsftpd.conf.5; \
else \
        install -D -m 644 vsftpd.8 /usr/man/man8/vsftpd.8; \
        install -D -m 644 vsftpd.conf.5 /usr/man/man5/vsftpd.conf.5; fi
if [ -x /etc/xinetd.d ]; then \
        install -m 644 xinetd.d/vsftpd /etc/xinetd.d/vsftpd; fi

【動作確認】
vsftpdはinetやxinetd経由ではなくスタンドアロンで動作します。
inet経由の方が制御はスタンドアロンよりもできますが、ひとまず
最初はinetなしで動かして、結構テストしてからにしましょう。
/etc/vsftpd.confが設定ファイルですので編集しましょう。

[08:46am solaris26@ vsftpd-1.1.3]# vi /etc/vsftpd.conf
listen=YES
この一行だけひとますいれます。
inetd経由ではないのでこれでテストしましょう。
他にftpがあがっていないことを確認しましょう。
[09:00am solaris26@ vsftpd-1.1.3]# netstat -a |grep ftp
      *.ftp                *.*                0      0     0      0 LISTEN
あがっている場合はとめておきましょう。
こんかいはsolarisでインストールしたので
vi /etc/inetd.confで^ftpなところをコメントアウトして
inetdにHUPしておきます。

[09:01am solaris26@ vsftpd-1.1.3]# netstat -a |grep ftp
[09:02am solaris26@ vsftpd-1.1.3]# /usr/local/sbin/vsftpd &
[1] 23356
[09:02am solaris26@ vsftpd-1.1.3]# ps -ef |grep ftp
    root 23360 22955  0 09:02:42 pts/0    0:00 grep ftp
    root 23356 22955  1 09:02:35 pts/0    0:00 /usr/local/sbin/vsftpd

[09:03am solaris26@ vsftpd-1.1.3]# ftp localhost
Connected to localhost.
220 (vsFTPd 1.1.3)
Name (localhost:root): ftp
331 Please specify the password.
Password:
230 Login successful. Have fun.
ftp>
これでうまく動作できることが確認できました。
killしておきましょ。

【設定】
[09:07am solaris26@ vsftpd-1.1.3]# vi /etc/inetd.conf
#ftp    stream  tcp     nowait  root    /usr/sbin/in.ftpd       in.ftpd
ftp     stream  tcp     nowait  root    /usr/local/sbin/tcpd    /usr/local/sbin/vsftpd

もとのftpの記述はコメントして新しくエントリを作っておきます。
tcp_wrapperかましているので
# vi /etc/hosts.allow

vsftpd:all:allow
のようなエントリをとりあえず追加しておきます。
※実際に制御するなら172.16.0.:allowとか192.168.128.:allow
 を入れておきましょう。

xinetdでも適宜変更になるところ編集すればよいでしょう。
サンプルがソースの中にあるのでEXAMPLE/INTERNET_SITE/READMEを見ればわかるでしょう。


---------オプション-------------
PAMでローカルログインを設定しているなら
もしPAMが有効になったマシンでvsftpdを動かしているなら
/etc/pam.d/ftpファイルが必要です。でないと匿名アクセスが失敗します。
#もしも古いバージョンのPAMだとファイル名は/etc/pam.confです。

スタンダードな設定はサンプルがあるのでコピーします。
# cp RedHat/vsftpd.pam /etc/pam.d/ftp
今回はsolaris2.6(なんでいまどきこんな古い!!)ってのは
おいといてとりあえずsolarisではいりませんね。
solaris9でも同じく特にこの作業は必要ないです。

------------------------------

設定作業本番です。
デフォルトの設定ファイルの位置は/etc/vsftpd.confです。
vsftpd.confは展開したソースの中にデフォルトのものが入っています。
なのでそれをコピーして必要なところを編集する形で使いましょう。

[09:17am solaris26@ vsftpd-1.1.3]# cp vsftpd.conf /etc

デフォルトの設定はローカルユーザのログインもアノニマスのアップロードもできません。
[09:34am solaris26@ var]# vi /etc/vsftpd.conf
[09:34am solaris26@ var]# grep -v ^# /etc/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/usr/local/var/log/vsftpd.log
idle_session_timeout=600
data_connection_timeout=120
nopriv_user=vsftpd
ftpd_banner=""
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
secure_chroot_dir=/usr/local/var/empty

# mkdir -p /usr/local/var/log
をしておかないとログの吐き場所がないとか怒られます。

あとsecure_chroot_dirがないと
[09:37am solaris26@ var]# ftp localhost
Connected to localhost.
500 OOPS: vsftpd: not found: directory given in 'secure_chroot_dir'
ftp>

となってログインできません。

設定ファイルは書きかたらすぐに有効になります。
inetdから起動してるので。


このままではanonymous以外はすべてchrootされません。
もしローカルユーザでchrootしたい場合は

[09:48am solaris26@ var]# vi /etc/vsftpd.chroot_list
にchrootをしたいユーザ名を入れておきましょう。

どれくらいデフォルトと違うかというと

[09:33am solaris26@ var]# diff /usr/local/src/ftp/vsftpd-1.1.3/vsftpd.conf /etc/vsftpd.conf
10c10
< #local_enable=YES
---
> local_enable=YES
13c13
< #write_enable=YES
---
> write_enable=YES
17c17
< #local_umask=022
---
> local_umask=022
46c46
< #xferlog_file=/var/log/vsftpd.log
---
> xferlog_file=/usr/local/var/log/vsftpd.log
52c52
< #idle_session_timeout=600
---
> idle_session_timeout=600
55c55
< #data_connection_timeout=120
---
> data_connection_timeout=120
59c59
< #nopriv_user=ftpsecure
---
> nopriv_user=vsftpd
80c80
< #ftpd_banner=Welcome to blah FTP service.
---
> ftpd_banner=""
91c91
< #chroot_list_enable=YES
---
> chroot_list_enable=YES
93c93,94
< #chroot_list_file=/etc/vsftpd.chroot_list
---
> chroot_list_file=/etc/vsftpd.chroot_list
> secure_chroot_dir=/usr/local/var/empty