vsftpd-3.0.2 x86_64 编译安装

来源:互联网 发布:我知谁掌管明天 背景 编辑:程序博客网 时间:2024/05/02 02:07

一、环境

CentOS 5.6 x86_64
ip:192.168.10.100

二、编译依赖组件

yum -y install gcc gcc-c++ db4-utils pam-devel libcap

三、编译安装配置vsftpd

1、编译

wget https://security.appspot.com/downloads/vsftpd-3.0.2.tar.gztar -zxf vsftpd-3.0.2.tar.gzcd vsftpd-3.0.2#vi builddefs.h    #define VSF_BUILD_TCPWRAPPERS             //允许使用TCP Wrappers(默认是undef)    #define VSF_BUILD_PAM                     //允许使用PAM认证    #define VSF_BUILD_SSL                     //允许使用SSL(默认是undef)make && make installmkdir /etc/vsftpd/cp vsftpd.conf /etc/vsftpd/vsftpd.bakgrep -v '^#' /etc/vsftpd/vsftpd.bak > /etc/vsftpd/vsftpd.conf#为了让vsftpd支持本地用户登录,讲身份认证模块拷贝至系统目录中cp RedHat/vsftpd.pam /etc/pam.d/vsftpd

2、配置vsftpd独立启动

#vi /etc/xinetd.d/vsftpd

将disable中no改成yes

3、服务启动脚本的制作

在standalone 模式中,经常用上面的命令启动服务比较麻烦,我们做一个脚本来启动和停止服务。建立一个新文件/etc/rc.d/init.d/vsftpd,把以下内容复制到文件中:

#!/bin/bash## vsftpd      This Shell script takes care of starting and stopping#             standalone vsftpd.## chkconfig: - 60 50# description: Vsftpd is a ftp daemon, which is the program #              that answers incoming ftp service requests.# processname: vsftpd# config: /etc/vsftpd/vsftpd.conf# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ ${NETWORKING} = "no" ] && exit 0[ -x /usr/local/sbin/vsftpd ] || exit 0RETVAL=0prog="vsftpd"start() {        # Start daemons.        if [ -d /etc/vsftpd ] ; then                for i in `ls /etc/vsftpd/*.conf`; do                        site=`basename $i .conf`                        echo -n $"Starting $prog for $site: "                        /usr/local/sbin/vsftpd $i &                        RETVAL=$?                        [ $RETVAL -eq 0 ] && {                           touch /var/lock/subsys/$prog                           success $"$prog $site"                        }                        echo                done        else                RETVAL=1        fi        return $RETVAL}stop() {        # Stop daemons.        echo -n $"Shutting down $prog: "        killproc $prog        RETVAL=$?        echo        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog        return $RETVAL}# See how we were called.case "$1" in  start)        start        ;;  stop)        stop        ;;  restart|reload)        stop        start        RETVAL=$?        ;;  condrestart)        if [ -f /var/lock/subsys/$prog ]; then            stop            start            RETVAL=$?        fi        ;;  status)        status $prog        RETVAL=$?        ;;  *)        echo $"Usage: $0 {start|stop|restart|condrestart|status}"        exit 1esacexit $RETVAL

保存文件,再给该文件加上执行权限:

# chmod 755 /etc/rc.d/init.d/vsftpd

这样我们就可以通过下面的方法来管理服务了:

# service vsftpd {start|stop|restart|condrestart|status}

例如重新启动服务:

# service vsftpd restartShutting down vsftpd: [OK ]Starting vsftpd for vsftpd: [OK ]

四、创建虚拟用户

1. 创建用户

[root@ftp /]#useradd test -s /sbin/nolog -d /var/opt/test
[root@ftp /]#passwd test

3. 编辑vsftpd的PAM认证文件
[root@CentOS5 /]#vi /etc/pam.d/vsftpd

如果系统是64位,将lib改为lib64

5. 配置vsftpd.conf
[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.confseccomp_sandbox=nolocal_enable=YESwrite_enable=YESlocal_umask=022idle_session_timeout=600data_connection_timeout=120chroot_list_enable=YESchroot_local_user=NOchroot_list_file=/etc/vsftpd/chroot_listpam_service_name=vsftpdhide_ids=YESuser_config_dir=/etc/vsftpd/vsftpd_user_diruserlist_enable=NOuserlist_deny=NOuserlist_file=/etc/vsftpd/user_listallow_writeable_chroot=YESxferlog_file=/var/log/vsftpd.logxferlog_std_format=YES

6. 重启vsftpd服务

[root@CentOS5 /]#service vsftpd restart

7. 用户配置文件

在/etc/vsftpd目录下增加文件和目录
文件chroot_list,user_list,并将用户test添加到文件中
目录vsftpd_user_dir,在目录下创建用户对应的文件test
vi test
local_root=/var/opt/cms_videolocal_umask=022local_max_rate=500000000

 遇到的问题及解决方法:

/lib/libcap.so.1: could not read symbols: file in wrong formatcollect2: ld returned 1 exit statusmake: *** [vsftpd] Error 1

解决方法:

修改vsftpd 源码包的vsf_findlibs.shvi 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";/lib/libcap.so.1: could not read symbols: File in wrong formatcollect2: ld returned 1 exit statusmake: *** [vsftpd] Error 1

解决方法:

同样修改vsf_findlibs.sh将# look for libcap (capabilities)if locate_library /lib/libcap.so.1; then  echo "/lib/libcap.so.1";else  locate_library /usr/lib/libcap.so && echo "-lcap";  locate_library /lib/libcap.so && echo "-lcap";fi修改为# Look for libcap (capabilities)if locate_library /lib64/libcap.so.1; then  echo "/lib64/libcap.so.1";else  locate_library /usr/lib64/libcap.so && echo "-lcap";  locate_library /lib64/libcap.so && echo "-lcap";fi

 3、500 OOPS: vsftpd: refusing to run with writable root inside chroot()

解决方法:

这个错误是在v2.3.5以后才有的,见官方changlog如下(意思是不能使用chroot限制可写的根目录):

Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly turned on chroot_local_user but such is life.

好吧,我们如果启用chroot,必须保证ftp根目录不可写,这样对于ftp根直接为网站根目录的用户不方便,所以建议假如ftp根目录是/data,那么网站结构可以这样分,/data/log为日志目录,/data/web为网站根目录,这样我们就可以去掉/data目录的写入权限而不影响网站的正常运行。

chmod a-w /data
4. 报530 Login incorrect无法登录问题解决
验证/etc/pam.d/vsftpd 文件中lib是否是lib64
0 1