上手VPS之编译安装VSftpd

By | 2013年3月8日

之前一直都用yum安装的vsftpd,但是版本太低了。所以这次在自己的VPS中尝试编译安装。

首先下载安装包,我安装的是3.0.2版本。

安装依赖包

我在安装时提示这个包没有:

yum install libcap-devel.x86_64

编译vsftpd

进入 解压后的目录,运行make命令,就可以开始编译了。非常简单。

编译完成后,会在目录下生成一个名为vsftpd的可执行文件,这个就是主程序了。

安装vsftpd

#创建vsftpd的目录
mkdir /opt/ProgramFiles/vsftp
mkdir /opt/ProgramFiles/vsftp/conf

#复制文件,到指定的目录
cp vsftpd /opt/ProgramFiles/vsftp/
cp vsftpd.conf /opt/ProgramFiles/vsftp/conf/
cp vsftpd.conf.5 /usr/share/man/man5
cp vsftpd.8 /usr/share/man/man8
#这个是pam认证相关的文件
cp RedHat/vsftpd.pam /etc/pam.d/ftp

修改/etc/pam.d/ftp文件,因为配置文件目录改变了,默认的为/etc/vsftpd

#%PAM-1.0
auth       required	/lib/security/pam_listfile.so item=user sense=deny file=/opt/ProgramFiles/vsftpd/conf/ftpusers onerr=succeed
auth       required	/lib/security/pam_unix.so shadow nullok
auth       required	/lib/security/pam_shells.so
account    required	/lib/security/pam_unix.so
session    required	/lib/security/pam_unix.so

创建/etc/init.d/vsftpd文件

我修改后的内容如下,主要修改的是路径,改成自己的就行了。

#!/bin/bash
#
### BEGIN INIT INFO
# Provides: vsftpd
# Required-Start: $local_fs $network $named $remote_fs $syslog
# Required-Stop: $local_fs $network $named $remote_fs $syslog
# Short-Description: Very Secure Ftp Daemon
# Description: vsftpd is a Very Secure FTP daemon. It was written completely from
#              scratch
### END INIT INFO

# 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: /opt/ProgramFiles/vsftpd/conf/vsftpd.conf

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

RETVAL=0
prog="vsftpd"

start() {
        # Start daemons.

	# Check that networking is up.
	[ ${NETWORKING} = "no" ] && exit 1

	[ -x /opt/ProgramFiles/vsftpd/vsftpd ] || exit 1

        if [ -d /opt/ProgramFiles/vsftpd/conf ] ; then
                CONFS=`ls /opt/ProgramFiles/vsftpd/conf/*.conf 2>/dev/null`
                [ -z "$CONFS" ] && exit 6
                PROC_FAILED=0
                for i in $CONFS; do
                        site=`basename $i .conf`
                        echo -n $"Starting $prog for $site: "
                        daemon /opt/ProgramFiles/vsftpd/vsftpd $i
                        RETVAL=$?
                        echo
                        if [ $RETVAL -eq 0 ] && [ ! -f /var/lock/subsys/$prog ]; then
                                touch /var/lock/subsys/$prog
                        elif [ $RETVAL -ne 0 ]; then
                                ps -FC vsftpd | grep "$i" > /dev/null
                                RETVAL=$?
                                if [ $PROC_FAILED -eq 0 ] && [ $RETVAL -ne 0 ]; then
                                        PROC_FAILED=1
                                fi
                        fi
                done
                if [ $RETVAL -eq 0 ] && [ $PROC_FAILED -ne 0 ]; then
                        RETVAL=1
                fi
        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|try-restart|force-reload)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
            RETVAL=$?
        fi
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
        exit 1
esac

exit $RETVAL

修改配置文件vsftpd.conf

accept_timeout=30
anonymous_enable=NO
background=YES
connect_from_port_20=YES
connect_timeout=60
chown_uploads=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/opt/ProgramFiles/vsftpd/conf/chroot_list
data_connection_timeout=60
delete_failed_uploads=YES
dirmessage_enable=NO
dual_log_enable=NO
force_dot_files=YES
idle_session_timeout=300
local_enable=YES
local_umask=002
local_max_rate=0
listen=YES
listen_ipv6=NO
listen_port=21
log_ftp_protocol=NO
max_clients=5
max_per_ip=10
one_process_model=NO
pam_service_name=vsftpd
pasv_addr_resolve=YES
pasv_enable=YES
pasv_min_port=65400
pasv_max_port=65410
syslog_enable=NO
tcp_wrappers=NO
userlist_enable=YES
userlist_deny=NO
userlist_file=/opt/ProgramFiles/vsftpd/conf/user_list
use_localtime=YES
write_enable=YES
xferlog_enable=NO
#xferlog_file=/var/log/xferlog
#xferlog_std_format=NO

默认启用了chroot,所登录的用户被固定在自己的主目录下,如果要某个用户不被chroot,将将其登录名写入chroot_list文件中。

user_list文件则定义了,可以连接ftp的账号,默认是谁都不允许,只有在user_list中的用户才能登陆。

我的user_list文件中目前只有一个账号:myftpuser

/etc/pam.d/ftp文件中有用到一个文件ftpusers,这个文件中可以定义不允许登陆ftp的账号,比如各种系统内置账号。

apache
mysql
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
ftp

创建ftp用户

#新建一个用户名为myftpuser的ftp账号,主目录为/var/www/web
useradd -s /sbin/nologin -d /var/www/web -g ftp myftpuser

#修改密码
passwd myftpuser

#修改web文件目录html的权限与用户、组
chown -R myftpuser:ftp /var/www/web/html
chmod -R 775 /var/www/web/html

需要注意的是,此版本的vsftpd,当chroot_local_user=YES时,登录用户的主目录必须是没有写权限的。

比如,新建的用户myftpuser的主目录为/var/www/web,那么就要使用命令chmod a-w /var/www/web来取消web目录的写权限。

而我的web文件,是放在/var/www/web/html目录下,这个目录我设置了775的权限。

SeLinux中开启FTP读写权限

setsebool -P allow_ftpd_full_access=1