从ftp://vsftpd.beasts.org/users/cevans/下载。
进入vsftpd-2.3.2,编译
[forrest@host vsftpd-2.3.2]$ make gcc -o vsftpd main.o utility.o prelogin.o ftpcmdio.o postlogin.o privsock.o tunables.o ftpdataio.o secbuf.o ls.o postprivparent.o logging.o str.o netstr.o sysstr.o strlist.o banner.o filestr.o parseconf.o secutil.o ascii.o oneprocess.o twoprocess.o privops.o standalone.o hash.o tcpwrap.o ipaddrparse.o access.o features.o readwrite.o opts.o ssl.o sslslave.o ptracesandbox.o ftppolicy.o sysutil.o sysdeputil.o -Wl,-s `./vsf_findlibs.sh` /lib/libpam.so.0: could not read symbols: File in wrong format collect2: ld returned 1 exit status make: *** [vsftpd] Error 1
google了一下,是因为上面的vsf_findlibs.sh脚本是按照32位系统来寻找lib包的,所以路径可能错误。需要手工修正。
已解决。
I also hit this - the problem is that the lib-finding script vsf_findlibs.sh returns e.g. /lib/libpam.so.0; however if you're on a x86_64 machine, for example, you need /lib64/libpam.so.0. Fixing this up sorted things out for me.
奇怪的是64位系统上居然有两个lib,而且都有内容:
[forrest@host ~]$ ll / | grep lib drwxr-xr-x 11 root root 4096 Sep 2 04:06 lib drwxr-xr-x 7 root root 4096 Sep 2 04:07 lib64 [forrest@host ~]$ ll /lib64/ | grep libpam lrwxrwxrwx 1 root root 17 Mar 8 2010 libpamc.so.0 -> libpamc.so.0.81.0 -rwxr-xr-x 1 root root 11264 Jun 18 2009 libpamc.so.0.81.0 lrwxrwxrwx 1 root root 21 Mar 8 2010 libpam_misc.so.0 -> libpam_misc.so.0.81.2 -rwxr-xr-x 1 root root 13456 Jun 18 2009 libpam_misc.so.0.81.2 lrwxrwxrwx 1 root root 16 Mar 8 2010 libpam.so.0 -> libpam.so.0.81.5 -rwxr-xr-x 1 root root 46800 Jun 18 2009 libpam.so.0.81.5 [forrest@host ~]$ ll /lib/ | grep libpam lrwxrwxrwx 1 root root 17 Mar 8 2010 libpamc.so.0 -> libpamc.so.0.81.0 -rwxr-xr-x 1 root root 9868 Jun 18 2009 libpamc.so.0.81.0 lrwxrwxrwx 1 root root 21 Mar 8 2010 libpam_misc.so.0 -> libpam_misc.so.0.81.2 -rwxr-xr-x 1 root root 8588 Jun 18 2009 libpam_misc.so.0.81.2 lrwxrwxrwx 1 root root 16 Mar 8 2010 libpam.so.0 -> libpam.so.0.81.5 -rwxr-xr-x 1 root root 43020 Jun 18 2009 libpam.so.0.81.5 [forrest@host usr]$ cd /usr [forrest@host usr]$ ll | grep lib drwxr-xr-x 83 root root 69632 Sep 2 04:07 lib drwxr-xr-x 92 root root 69632 Sep 2 04:08 lib64 drwxr-xr-x 11 root root 4096 Sep 7 20:21 libexec [forrest@host usr]$
Anyway,修改vi vsf_findlibs.sh,将这一行:locate_library /lib/libpam.so.0 && echo "/lib/libpam.so.0";修改为
locate_library /lib64/libpam.so.0 && echo "/lib64/libpam.so.0";
直接跑这个脚本验证一下是不是找对了:
[forrest@host vsftpd-2.3.2]$ ./vsf_findlibs.sh /lib64/libpam.so.0 -lpam -ldl -lnsl -lresolv -lutil /lib/libcap.so.1
再次编译:
[forrest@host vsftpd-2.3.2]$ make gcc -o vsftpd main.o utility.o prelogin.o ftpcmdio.o postlogin.o privsock.o tunables.o ftpdataio.o secbuf.o ls.o postprivparent.o logging.o str.o netstr.o sysstr.o strlist.o banner.o filestr.o parseconf.o secutil.o ascii.o oneprocess.o twoprocess.o privops.o standalone.o hash.o tcpwrap.o ipaddrparse.o access.o features.o readwrite.o opts.o ssl.o sslslave.o ptracesandbox.o ftppolicy.o sysutil.o sysdeputil.o -Wl,-s `./vsf_findlibs.sh` /lib/libcap.so.1: could not read symbols: File in wrong format collect2: ld returned 1 exit status make: *** [vsftpd] Error 1 [forrest@host vsftpd-2.3.2]$
类似的问题,如上解决。然后再次编译,done!
[forrest@host vsftpd-2.3.2]$ make [forrest@host vsftpd-2.3.2]$ sudo make install 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 -m 644 vsftpd.8 /usr/local/man/man8/vsftpd.8; \ install -m 644 vsftpd.conf.5 /usr/local/man/man5/vsftpd.conf.5; \ elif [ -x /usr/share/man ]; then \ install -m 644 vsftpd.8 /usr/share/man/man8/vsftpd.8; \ install -m 644 vsftpd.conf.5 /usr/share/man/man5/vsftpd.conf.5; \ else \ install -m 644 vsftpd.8 /usr/man/man8/vsftpd.8; \ install -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 [forrest@host vsftpd-2.3.2]$ sudo cp vsftpd.conf /etc
在make install后,一定不要忘记手工将vsftpd.conf文件cp到/etc目录下,否则会找不到这个配置文件的,这个是vsftpd一个非常恶心的地方。 否则运行时候会报如下错误: [forrest@host usr]$ sudo /usr/local/sbin/vsftpd
Password:
500 OOPS: vsftpd: not configured for standalone, must be started from inetd
这是因为是否以standalone形式运行,取决于vsftpd.conf文件中的listen配置。
同样如果你要支持本地用户登录,那么需要copy源码目录下的vsftpd.pam文件
|
cp后再次运行上面命令,报如下错误:
[forrest@host xinetd.d]$ sudo /usr/local/sbin/vsftpd 500 OOPS: could not bind listening IPv4 socket
google搜了一下,这是因为同时指定了xinetd(或者老的inetd)和standalone两种运行方式,端口冲突了。删除/etc/xinetd.d/vsftpd这个文件;然后重新启动xinetd服务器,就可以了。
[forrest@host var]$ netstat -ant | grep 21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN [forrest@host xinetd.d]$ cd /etc/xinetd.d/ [forrest@host xinetd.d]$ ls | grep vsftpd vsftpd [forrest@host xinetd.d]$ cat vsftpd # default: on # description: # The vsftpd FTP server serves FTP connections. It uses # normal, unencrypted usernames and passwords for authentication. # vsftpd is designed to be secure. service ftp { socket_type = stream wait = no user = root server = /usr/local/sbin/vsftpd # server_args = # log_on_success += DURATION USERID # log_on_failure += USERID nice = 10 disable = no } [forrest@host xinetd.d]$ sudo rm vsftpd [forrest@host xinetd.d]$ sudo /etc/init.d/xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ] [forrest@host xinetd.d]$ sudo /usr/local/sbin/vsftpd & ## Test forrest@ubuntu:~$ ftp 10.249.167.161 Connected to 10.249.167.161. 220 (vsFTPd 2.3.2) Name (10.249.167.161:forrest): ftp 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
vsFTPd运行有两种模式,standalone方式和xinetd(inetd)模式。可以在initd.d目录下编写一个启动脚本,这样服务器起来的时候就可以自动运行standalone方式。 |
sftpd服务器的配置文件为/etc/vsftpd.conf。事实上简单的使用vsftp,并不需要什么配置的,目前我们关系的两项就是:
listen=YES
anonymous_enable=YES
其他常用的vsftpd的配置项如下:
1.禁止匿名用户访问。
anonymous_enable=NO
2.允许本地用户登录并允许其上传文件。
local_enable=YES
write_enable=YES
要使上述选项生效,必须复制一个pam验证文件到/etc/pam.d,并改名为ftp。当然也可以改为其他名称,但必须修改pam_service_name的值,默认为ftp。
3.将本地用户锁定在主目录中,不允许切换到上一级目录中。
chroot_local_user=YES
4.禁止某些用户通过ftp登录服务器。
如果设置了local_enable=YES,那么所有的用户包括root也能通过ftp登录服务器,出于安全考虑,需要对某些用户进行限制。
在vsftpd.conf中有三个选项控制:
userlist_deny=YES/NO
userlist_enalbe=YES
userlist_file=/etc/vsftpd.user_list
现在让我们上传一些文件,然后登录看看能不能浏览和下载吧。
Radhat另一个恶心的地方是安装后生成了ftp:ftp用户和用户组,却没有生成ftp用户根目录/var/ftp。因此你需要自己创建一个:
[forrest@host ebooks]$ grep ftp /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 这个显示ftp用户的根目录为/var/ftp。 [forrest@host ebooks]$ groups ftp ftp : ftp [forrest@host ebooks]$ sudo mkdir /var/ftp 进入该目录放几个文件,然后用浏览器登录试一下,应该可以正常浏览和下载: [forrest@host init.d]$ cd /var/ftp/ [forrest@host ftp]$ ll total 8 drwxr-xr-x 2 root root 4096 Sep 19 17:39 ebooks -rw-r--r-- 1 root root 13 Sep 19 17:26 helloworld.txt
500 OOPS: vsftpd: refusing to run with writable anonymous root 如果我们已经把vsftpd服务器启动好了,但登录测试是会出现类似下面的提示: 500 OOPS: vsftpd: refusing to run with writable anonymous root 这表示ftp用户的根目录的权限不对,应该改过才对: [forrest@host ebooks]$ grep ftp /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
我们发现ftp用户的根目录在/var/ftp,就是这个/var/ftp的权限不对所致,这个目录的权限是不能打开所有权限的(如果没有ftp用户这个家目录,当然您要自己建一个) [forrest@host ebooks]$ sudo chown root:root /var/ftp [forrest@host ebooks]$ sudo chmod 755 /var/ftp 有的弟兄可能会说,那匿名用户的可读、可下载、可上传怎么办呢?这也简单,在/var/ftp下再建一个目录,权限是777的就行了,再改一改vsftpd.conf就OK了。没有什么难的。 vsftpd出于安全考虑,是不准让ftp用户的家目录的权限是完全没有限制的,您可以去读一下vsftpd的文档就明白的了。否则也不能称为最安全的FTP服务器了,对不对? |
使用发行版提供的软件来安装
CentOS下的yum安装
[forrest@host ~]$ sudo yum install vsftpd
Password:
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
addons | 951 B 00:00
base | 2.1 kB 00:00
extras | 2.1 kB 00:00
updates | 1.9 kB 00:00
updates/primary_db | 661 kB 00:00
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package vsftpd.x86_64 0:2.0.5-16.el5_5.1 set to be updated
updates/filelists_db | 2.1 MB 00:00
--> Finished Dependency Resolution
Dependencies Resolved
============================================================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================================================
Installing:
vsftpd x86_64 2.0.5-16.el5_5.1 updates 139 k
Transaction Summary
============================================================================================================================================================================
Install 1 Package(s)
Upgrade 0 Package(s)
ubuntu下的apt-get安装
forrest@ubuntu:/etc$ sudo apt-get install vsftpd sudo: unable to resolve host ubuntu [sudo] password for forrest: Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: libparted0 Use 'apt-get autoremove' to remove them. The following NEW packages will be installed: vsftpd 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 148kB of archives. After this operation, 492kB of additional disk space will be used. Get:1 http://tw.archive.ubuntu.com/ubuntu/ lucid-proposed/main vsftpd 2.2.2-3ubuntu7.1 [148kB] Fetched 148kB in 0s (222kB/s) Preconfiguring packages ... Selecting previously deselected package vsftpd. (Reading database ... 218180 files and directories currently installed.) Unpacking vsftpd (from .../vsftpd_2.2.2-3ubuntu7.1_amd64.deb) ... Processing triggers for man-db ... Processing triggers for ureadahead ... ureadahead will be reprofiled on next reboot Setting up vsftpd (2.2.2-3ubuntu7.1) ... Adding user ftp to group ftp vsftpd start/running, process 15835 可以看到非常方便,自动识别出我们的就是64位环境。不需要我们修改编译脚本。不过就是版本稍微老了些。 |
非常好的参考文章 vsFTPd 服务器初学者指南(欢迎大家参与补充) |