一键安装ftp服务器

1 概述

工作中,需要搭建ftp服务器来实现资源的共享。本文将通过脚本实现自动化安装ftp服务器,并进行相关配置,同时创建ftp登录账户,以及创建两个文件夹,作为公共的文件夹,为所有用户提供共同的访问路径

2 概念解释和注意事项

2.1 chroot_list说明

chroot_list_file=/etc/vsftpd/chroot_list

如果设置为

chroot_local_user=YES

chroot_list_enable=YES(这行可以没有, 也可以有)

chroot_list_file=/etc/vsftpd.chroot_list

那么, 凡是加在文件vsftpd.chroot_list中的用户都是不受限止的用户

即可以浏览其主目录的上级目录。

所以, 如果不希望某用户能够浏览其主目录上级目录中的内容,可以如上设置, 然后在文件vsftpd.chroot_list中不添加该用户即可(此时, 在该文件中的用户都是可以浏览其主目录之外的目录的).

或者, 设置如下

chroot_local_user=NO

chroot_list_enable=YES(这行必须要有, 否则文件vsftpd.chroot_list不会起作用)

chroot_list_file=/etc/vsftpd.chroot_list

然后把所有不希望有这种浏览其主目录之上的各目录权限的用户添加到文件vsftpd.chroot_list(此时, 在该文件中的用户都是不可以浏览其主目录之外的目录的)中即可(一行一个用户名).

2.2 selinux

如果服务已经安装,防火墙端口21已经打开,但是还是不能访问,可能是selinux的影响,建议打开如下的选项

getsebool -a | grep ftp

setsebool -P tftp_home_dir=1

2.3 监听端口问题

如果出现在服务器上可以用ftp localhost登录,但是在window电脑上不能通过资源管理器来访问,即ftp ip的方式访问不了。但是centOS7上服务正常。配置文件有问题导致,可能是同时监听了ipv4和ipv6端口,导致服务异常建议配置文件里只写如监听ipv4端口,不要写ipv6端口,在配置文件里同时监听ipv4和ipv6是上不支持

#listen_ipv6=YES这个语句不要配置

同时配置监听ipv4和ipv6的重启服务报错如下

[root@localhost ~]#service vsftpd restart

Shutting down vsftpd:                                      [  OK  ]

Starting vsftpd for vsftpd: 500 OOPS: run two copies of vsftpd for IPv4 and IPv6

[FAILED]

2.4 vsftpd的配置文件说明

vsftpd.ftpusers:位于/etc目录下。它指定了哪些用户账户不能访问FTP服务器,例如root等。

vsftpd.user_list:位于/etc目录下。该文件里的用户账户在默认情况下也不能访问FTP服务器,仅当vsftpd .conf配置文件里启用userlist_enable=NO选项时才允许访问。

vsftpd.conf:位于/etc/vsftpd目录下。来自定义用户登录控制、用户权限控制、超时设置、服务器功能选项、服务器性能选项、服务器响应消息等FTP服务器的配置。

(1)用户登录控制

anonymous_enable=YES,允许匿名用户登录。

no_anon_password=YES,匿名用户登录时不需要输入密码。

local_enable=YES,允许本地用户登录。

deny_email_enable=YES,可以创建一个文件保存某些匿名电子邮件的黑名单,以防止这些人使用Dos攻击。

banned_email_file=/etc/vsftpd.banned_emails,当启用deny_email_enable功能时,所需的电子邮件黑名单保存路径(默认为/etc/vsftpd.banned_emails)。

(2)用户权限控制

write_enable=YES,开启全局上传权限。

local_umask=022,本地用户的上传文件的umask设为022(系统默认是077,一般都可以改为022)。

anon_upload_enable=YES,允许匿名用户具有上传权限,很明显,必须启用write_enable=YES,才可以使用此项。同时我们还必须建立一个允许ftp用户可以读写的目录(前面说过,ftp是匿名用户的映射用户账号)。

anon_mkdir_write_enable=YES,允许匿名用户有创建目录的权利。

chown_uploads=YES,启用此项,匿名上传文件的属主用户将改为别的用户账户,注意,这里建议不要指定root账号为匿名上传文件的属主用户!

chown_username=whoever,当启用chown_uploads=YES时,所指定的属主用户账号,此处的whoever自然要用合适的用户账号来代替。

chroot_list_enable=YES,可以用一个列表限定哪些本地用户只能在自己目录下活动,如果chroot_local_user=YES,那么这个列表里指定的用户是不受限制的。

chroot_list_file=/etc/vsftpd.chroot_list,如果chroot_local_user=YES,则指定该列表(chroot_local_user)的保存路径(默认是/etc/vsftpd.chroot_list)。

nopriv_user=ftpsecure,指定一个安全用户账号,让FTP服务器用作完全隔离和没有特权的独立用户。这是vsftpd系统推荐选项。

async_abor_enable=YES,强烈建议不要启用该选项,否则将可能导致出错!

ascii_upload_enable=YES;ascii_download_enable=YES,默认情况下服务器会假装接受ASCⅡ模式请求但实际上是忽略这样的请求,启用上述的两个选项可以让服务器真正实现ASCⅡ模式的传输。

注意:启用ascii_download_enable选项会让恶意远程用户们在ASCⅡ模式下用“SIZE/big/file”这样的指令大量消耗FTP服务器的I/O资源。

这些ASCⅡ模式的设置选项分成上传和下载两个,这样我们就可以允许ASCⅡ模式的上传(可以防止上传脚本等恶意文件而导致崩溃),而不会遭受拒绝服务攻击的危险。

(3)用户连接和超时选项

idle_session_timeout=600,可以设定默认的空闲超时时间,用户超过这段时间不动作将被服务器踢出。

data_connection_timeout=120,设定默认的数据连接超时时间。

(4)服务器日志和欢迎信息

dirmessage_enable=YES,允许为目录配置显示信息,显示每个目录下面的message_file文件的内容。

ftpd_banner=Welcome to blah FTP service,可以自定义FTP用户登录到服务器所看到的欢迎信息。

xferlog_enable=YES,启用记录上传/下载活动日志功能。

xferlog_file=/var/log/vsftpd.log,可以自定义日志文件的保存路径和文件名,默认是/var/log/vsftpd.log。

anonymous_enable=YES 允许匿名登录local_enable=YES 允许本地用户登录

write_enable=YES 开放本地用户写权限

local_umask=022 设置本地用户生成文件的掩码为022

#anon_upload_enable=YES 此项设置允许匿名用户上传文件

#anon_mkdir_write_enable=YES 开启匿名用户的写和创建目录的权限

dirmessage_enable=YES 当切换到目录时,显示该目录下的.message隐藏文件的内容

xferlog_enable=YES 激活上传和下载日志

connect_from_port_20=YES 启用FTP数据端口的连接请求

#chown_uploads=YES 是否具有上传权限. 用户由chown_username参数指定。

#chown_username=whoever 指定拥有上传文件权限的用户。此参数与chown_uploads联用。

#xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES 使用标准的ftpd xferlog日志格式

#idle_session_timeout=600 此设置将在用户会话空闲10分钟后被中断

#data_connection_timeout=120 将在数据连接空闲2分钟后被中断

#ascii_upload_enable=YES 启用上传的ASCII传输方式

#ascii_download_enable=YES 启用下载的ASCII传输方式

#ftpd_banner=Welcome to blah FTP service 设置用户连接服务器后显示消息

#deny_email_enable=NO 此参数默认值为NO。当值为YES时,拒绝使用banned_email_file参数指定文件中所列出的e-mail地址用户登录。

#banned_email_file=/etc/vsftpd.banned_emails 指定包含拒绝的e-mail地址的文件.

#chroot_list_enable=YES 设置本地用户登录后不能切换到自家目录以外的别的目录

#chroot_list_file=/etc/vsftpd.chroot_list

#ls_recurse_enable=YES

pam_service_name=vsftpd 设置PAM认证服务的配置文件名称,该文件存放在/etc/pam.d/

userlist_enable=YES 此项配置/etc/vsftpd.user_list中指定的用户也不能访问服务器,若添加userlist_deny=No,则仅仅/etc/vsftpd.user_list文件中的用户可以访问,其他用户都不可以访问服务器。如过userlist_enable=NO,userlist_deny=YES,则指定使文件/etc/vsftpd.user_list中指定的用户不可以访问服务器,其他本地用户可以访问服务器。

listen=YES 指明VSFTPD以独立运行方式启动

tcp_wrappers=YES 在VSFTPD中使用TCP_Wrappers远程访问控制机制,默认值为YES

3 一键化安装脚本

​#!/bin/bash

#

#******************************************************************************

#Author:              Sunny

#Date:                2017-09-11

#FileName:            install_ftp.sh

#version:              1.0

#Your change info:

#Description:          For auto install ftp

#Copyright(C):        2017  All rihts reserved

#*****************************************************************************

#ftp service dir is relative to system dir attribute.for example,if you are use anonmous to login ftp,if you upload some file to ftp,it use defaults user ftp to upload new file,and the new file permisson is 600,so other people could not download the file unless you change the file attribute about  other with r permission

time=`date +%Y%m%d%H%M`

#the function is used to install vsftpd  generate a new config file and create chroot_list and welcome.txt  file

#install ftp server

rpm -q  vsftpd &>/dev/null || yum -y install vsftpd &>/dev/null;

#install ftp  client,not necessary,but suggest

rpm -q ftp &>/dev/null || yum -y install ftp &>/dev/null;

[ -e /etc/vsftpd/vsftpd.conf ] && mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf."$time".bak

[ -e /etc/vsftpd/welcome.txt ] && mv  /etc/vsftpd/welcome.txt  /etc/vsftpd/welcome.txt."$time".bak

cat >>/etc/vsftpd/vsftpd.conf<

#should not listen both ipv4 and ipv6 port.suggest just only listen ipv4,so listen_ipv6 does not need to config.

#about anonymous

anonymous_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

anon_upload_enable=YES

#about entity user

local_enable=YES

write_enable=YES

local_umask=022

userlist_enable=YES

userlist_deny=YES

userlist_file=/etc/vsftpd/user_list

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

#about server env

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

listen=YES

pam_service_name=vsftpd

tcp_wrappers=YES

use_localtime=yes

#/etc/vsftpd/welcom.txt  need be created by manual

banner_file=/etc/vsftpd/welcome.txt

eof

[ -e /etc/vsftpd/chroot_list ] || touch /etc/vsftpd/chroot_list

cat >>/etc/vsftpd/welcome.txt<

Welcome to sunny ftp

eof

#create ftp users without login system pemission

echo "If you don't want to create user ,you can enter number 0 to skip create new ftp user"

read -p "how many ftp users would you want to create(eg:3,means create 3 users total): " usernu

[[ "$usernu" =~ ^[0-9]+$  ]] || { echo your input is no num,user does not create,please check;$usernu=0; }

if [ -z ${usernu:-} ];then

usernu=0

fi

read -p "enter passwd for all new users(default:ftp123): " pass

if [ -z ${pass:-} ];then

pass=ftp123

fi

while [ "$usernu" -gt 0 ];do

read -p "pleas input new username you want to create: " user

if $(id "$user" &>/dev/null);then

echo "$user" is already exist,$user will not be create again

continue

else

useradd -s /sbin/nologin -d /var/ftp/"$user" "$user"

echo "$pass"| passwd --stdin "$user"

echo "$user" >> /etc/vsftpd/chroot_list

let usernu--

fi

done

echo "You will create two dir under /var/ftp for project"

echo "dir share : everyone can do create,delete,upload,download files after one minute once file is upload under share"

echo "dir share_project : it  is similar to dir share,but one can delete file under it"

read -p "If you want to make two share dir,enter yes,it will not create if your enter other: " answer

if [ "$answer" = "yes" ];then

[ -e /var/ftp/share ] || mkdir /var/ftp/share

[ -e /var/ftp/share_project ] || mkdir /var/ftp/share_project

grep "/ftp/share1" /etc/crontab &>/dev/null || echo "* * * * * root chmod -R 777 /var/ftp/share">>/etc/crontab

chattr +a /var/ftp/share_project

else

echo "no share dir was created"

fi

#both cent 6 and 7

chkconfig vsftpd on

service vsftpd restart &>/dev/null

#centOS7 can run below cmd to restart and enble service when start system as well

#systemctl restart vsftpd.service

#systemctl enable vsftpd

setenforce 0  &>/dev/null

#if you want to use selinux,your run cmd below to make ftp work normal

#getsebool -a | grep ftp

#setsebool -P tftp_home_dir=1

#setsebool -P tftp_anon_write=1

#setsebool -P ftpd_anon_write=1

netstat -netlp | grep vsftpd &>/dev/null && echo "Your ftp is working,your can use it now" || echo "Your ftp service does not start,Please check"

unset usernu

unset pass

unset time

4 总结

本文的一键安装,用户可以根据自己的需要决定是否创建新的ftp用户,以及是否创建共享文件夹

推荐阅读更多精彩内容