`
arganzheng
  • 浏览: 101614 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

vsftpd搭建日志

阅读更多

1. 下载

ftp://vsftpd.beasts.org/users/cevans/下载。

2. 编译和安装

进入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配置。

# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=YES

同样如果你要支持本地用户登录,那么需要copy源码目录下的vsftpd.pam文件

复制pam验证文件:(多数使用vsftpd的用户在用源代码安装后都会遇到这样的问题:匿名用户可以登录,而本地用户无论怎样设置都无法登录,原因就在于vsftpd采用了PAM验证的方式,需要复制一个验证文件本地用户才能访问。)

[forrest@host vsftpd-2.3.2]$ find . | grep vsftpd.pam
./EXAMPLE/VIRTUAL_USERS/vsftpd.pam
./RedHat/vsftpd.pam
[forrest@host vsftpd-2.3.2]$ sudo cp RedHat/vsftpd.pam /etc/pam.d/ftp

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方式。

3. 配置

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

4. 体验一下吧

现在让我们上传一些文件,然后登录看看能不能浏览和下载吧。
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位环境。不需要我们修改编译脚本。不过就是版本稍微老了些。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics