Linux下FTP虚拟帐号环境部署记录 (vsftpd)

 

1、FTP协议的两种工做方式
port方式:主动模式
port(主动)方式的链接过程是:客户端向服务器的FTP端口(默认是21)发送链接请求,服务器接受链接,创建一条命令链路。当须要传送数据时,服务器从20端口向客户端的空闲端口发送链接请求,创建一条数据链路来传送数据。[即当须要传送数据时,客户端在命令链路上用PORT命令告诉服务器"我打开了***X端口,你过来链接我"。因而服务器从20端口向客户端的***X端口发送链接请求,创建一条数据链路来传送数据。]
pasv方式:被动模式
pasv(被动)方式的链接过程是:客户端向服务器的FTP端口(默认是21)发送链接请求,服务器接受链接,创建一条命令链路。当须要传送数据时,客户端向服务器的空闲端口发送链接请求,创建一条数据链路来传送数据。[即当须要传送数据时,服务器在命令链路上用PASV命令告诉客户端"我打开了***X端口,你过来链接我"。因而客户端向服务器的***X端口发送链接请求,创建一条数据链 路来传送数据。]node

FTP是仅基于tcp的服务,不支持udp。FTP使用2个端口,一个数据端口和一个命令端口(也可叫作控制端口)。一般来讲这两个端口是21(命令端口)和20(数据端口)。但FTP工做方式的不一样,数据端口并不老是20,这就是主动与被动FTP的最大不一样之处。mysql

主动模式的FTP工做流程:客户端从一个任意的非特权端口N(N>1024)链接到FTP服务器的命令端口,也就是21端口。而后客户端开始监听端口N+1,并发送FTP命令"portN+1"到FTP服务器。接着服务器会从它本身的数据端口(20)链接到客户端指定的数据端口(N+1)。针对FTP服务器前面的防火墙来讲,必须容许如下通信才能支持主动方式FTP:
1)任何大于1024的端口到FTP服务器的21端口。(客户端初始化的链接)
2)FTP服务器的21端口到大于1024的端口。(服务器响应客户端的控制端口)
3)FTP服务器的20端口到大于1024的端口。(服务器端初始化数据链接到客户端的数据端口)
4)大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)linux

被动模式的FTP工做流程 (有效解决了服务器发起到客户的链接问题) 当客户端通知服务器它处于被动模式时才启用。在被动方式FTP中,命令链接和数据链接都由客户端发起,这样就能够解决从服务器到客户端的数据端口的入方向链接被防火墙过滤掉的问题。当开启一个FTP链接时,客户端打开两个任意的非特权本地端口(N>1024和N+1)。第一个端口链接服务器的21端口,但与主动方式的FTP不一样,客户端不会提交PORT命令并容许服务器来回连它的数据端口,而是提交PASV命令。这样作的结果是服务器会开启一个任意的非特权端口(P>1024),并发送PORTP命令给客户端。而后客户端发起从本地端口N+1到服务器的端口P的链接用来传送数据。对于服务器端的防火墙来讲,必须容许下面的通信才能支持被动方式的FTP:
1)从任何大于1024的端口到服务器的21端口(客户端初始化的链接)
2)服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的链接)
3)从任何大于1024端口到服务器的大于1024端口(客户端初始化数据链接到服务器指定的任意端口)
4)服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)web

主动FTP:
命令链接:客户端>1024端口  --> 服务器 21端口
数据链接:客户端>1024端口 <-- 服务器 20端口sql

被动FTP:
命令链接:客户端>1024端口 --> 服务器 21端口
数据链接:客户端>1024端口 --> 服务器>1023端口shell

主动与被动FTP优缺点:
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。由于FTP服务器企图与客户端的高位随机端口创建链接,而这个端口颇有可能被客户端的防火墙阻塞掉。
被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。由于客户端要与服务器端创建两个链接,其中一个连到一个高位随机端口,而这个端口颇有可能被服务器端的防火墙阻塞掉。数据库

随着WWW的普遍流行,许多人习惯用web浏览器做为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这究竟是好仍是坏取决于服务器和防火墙的配置。一般状况下会选用被动模式的FTP。apache

2、FTP登陆的用户类型
FTP的用户有三种类型:匿名用户、系统用户、虚拟用户
匿名登陆:在登陆FTP时使用默认的用户名,通常是ftp或anonymous。
本地用户登陆:使用系统用户登陆,在/etc/passwd中。
虚拟用户登陆:这是FTP专有用户,有两种方式实现虚拟用户,本地数据文件和数据库服务器。vim

FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户帐号能够提供集中管理的FTP根目录,方便了管理员的管理,同时将用于FTP登陆的用户名、密码与系统用户帐号区别开,进一步加强了FTP服务器的安全性。某种意义上来讲,匿名用户也是系统用户,只是系统用户的一个映射。公开的FTP都不会使用系统用户做为FTP账号,而更多的采用了虚拟用户,这样能保证系统的安全性。windows

使用虚拟用户登陆FTP服务器,能够避免使用操做系统账号做为FTP用户带来的一些安全问题,也便于经过数据库或其它程序来进行管理。虚拟用户的特色是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。因此,若是想让用户对FTP服务器站内具备写权限,但又不容许访问系统其它资源,可使用虚拟用户来提升系统的安全性。

在VSFTP中,认证这些虚拟用户使用的是单独的口令库文件(pam_userdb),由可插入认证模块(PAM)认证。使用这种方式更加安全,而且配置更加灵活。基本流程:FTP用户访问->PAM配置文件(由vsftpd.conf中pam_service_name指定)->PAM论证->区别用户读取配置文件(由vsftpd.conf中user_config_dir指定配置文件路径,文件名即用户名)。有两种方式创建FTP的虚拟用户,分别是:本地数据文件方式、数据库服务器(MySQL)方式

3、FTP虚拟用户环境部署记录
下面记录在CentOS6版本下采用本地数据文件方式部署FTP虚拟帐号登录环境的过程及其中遇到的问题:

1)yum安装vsftpd
[root@i-f658wfj6 ~]# yum install -y vsftpd
[root@i-f658wfj6 ~]# yum install -y db4
          
[root@cms_web vsftpd]# pwd
/etc/vsftpd
          
2)配置vsftpd(将vsftpd.conf文件备份,而后将配置内容直接粘贴下面内容)
[root@cms_web vsftpd]# cat vsftpd.conf|grep -v "^#"
anonymous_enable=NO        # 不容许匿名帐号访问
local_enable=YES           # 本地用户能够访问(采用虚拟帐号访问时,这个参数也要开启(虚拟帐号要寄宿本地帐号),虽然开启可是本地帐号是不能够登录的)
write_enable=YES           # 可写可上传。这个参数是全局配置,不然上传和下载都会报错550!
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to FTP service   # 登录FTP时显示的欢迎信息
listen=YES
chroot_local_user=NO           # 限制全部的本地用户在自家目录,即用户登录系统后锁定在自家目录。虚拟主机配置下,在下面两个chroot配置后,这个参数必须为NO,不然登录FTP后还能够访问其余目录!
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list  # 指定不能离开家目录的用户列表文件,一行一个用户。使用此方法时必须chroot_local_user=NO。说明这个列表里面的用户登录ftp后都只能访问其主目录,其余目录都不能访问!
pam_service_name=vsftpd        # 指定PAM配置文件,即下面的/etc/pam.d/vsftpd文件要和这里指定的一致。
userlist_enable=YES
tcp_wrappers=YES
virtual_use_local_privs=YES    # 这个参数必定要加上,虚拟用户和本地用户有相同的权限;不然ftp连上后不能上传,报错550权限拒绝!
guest_enable=YES               # 启用虚拟用户
guest_username=nobody          # 将虚拟用户映射为本地nobody用户(前提是local_enable=YES)
user_config_dir=/etc/vsftpd/vuser_conf      # 指定不一样虚拟用户配置文件的存放路径
          
connect_from_port_20=YES       # 经过20端口传输数据
listen_port=2021               # 监听的ftp端口
pasv_min_port=40001            # 分配给ftp帐号的最小端口。被动模式下的配置
pasv_max_port=40100            # 分配给ftp帐号的最大端口。每一个帐号分配一个端口,即最大容许100个ftp帐号链接。
max_clients=150                # 客户端的最大链接数
accept_timeout=5
connect_timeout=1
max_per_ip=5                   # 每一个ip最大链接数
          
=============================================================================================
舒适提示:
上面的ftp是被动模式下的配置,配置后须要在iptables防火墙开通ftp访问
[root@cms_web vsftpd]# cat /etc/sysconfig/iptables
............
-A INPUT -s 10.68.250.13 -m state --state NEW -m tcp -p tcp --dport 2021 -j ACCEPT
-A INPUT -s 10.68.250.13 -m state --state NEW -m tcp -p tcp --dport 40001:40100 -j ACCEPT
..........
============================================================================================
          
设置登录ftp的虚拟帐号文件(格式依次是:第一行是帐户名,次行是该帐号的密码;即奇数行是帐户名,偶数行是对应上一行的帐户密码)。
这个虚拟帐号是不须要手动建立的,它不是真实存在于系统中的,即/etc/passwd文件里没有的,它是借助于宿主帐号nobody。
[root@cms_web vsftpd]# cat vuser_passwd.txt
hqsbcms
hqsbcms_2016@huanqiu.com
          
生成虚拟用户口令认证的db文件(该文件设定600权限),这是本地数据库文件
[root@cms_web vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
[root@cms_web vsftpd]# chmod 600 /etc/vsftpd/vuser_passwd.db
          
[root@cms_web vsftpd]# cat /etc/vsftpd/chroot_list     # 将虚拟用户放在这个列表文件里,说明这些用户登录后都只能锁定到对应主目录内
hqsbcms
     
[root@cms_web vsftpd]# mkdir vuser_conf                # 此目录名是在vsftpd.conf配置中指定的,里面是虚拟用户配置文件(文件名是虚拟用户名)
[root@cms_web vsftpd]# cat vuser_conf/hqsbcms
local_root=/hqsb/ftp/          # 指定虚拟帐号登录后的主目录,目录权限要是宿主帐号nobody,这样就能够实现帐号映射
write_enable=YES               # 写权限
anon_umask=022
anon_world_readable_only=NO    # 下载权限(当其余四项的YES为NO时,则此帐号登录FTP后只有可读和下载权限了)
anon_upload_enable=YES         # 上传权限
anon_mkdir_write_enable=YES    # 建立目录权限
anon_other_write_enable=YES    # 删除和重命名权限
        
[root@bastion-IDC vsftpd]# ll /lib64/security/pam_userdb.so
-rwxr-xr-x. 1 root root 10280 May 11  2016 /lib64/security/pam_userdb.so
[root@cms_web vsftpd]# cat /etc/pam.d/vsftpd       # 注释掉文件中原来的内容,添加下面两行内容
#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
# 32-bit
#auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
#account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
# 64-bit
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd          # 这个vuser_passwd根据的是vuser_passwd.db
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd       # 这里64bit系统,必须用sufficient,不然上面vuser_conf目录下的虚拟主机配置文件无效!
          
[root@bastion-IDC ~]# cat /etc/passwd|grep nobody          # 宿主帐号nobody的信息不用作任何修改,shell类型是否是/sbin/nologin均可以,不影响ftp登录限制到主目录下,由于vsfprd里配置了三个chroot。
nobody:x:99:99:Nobody:/:/sbin/nologin          

[root@cms_web vsftpd]# chown -R nobody.nobody /hqsb/ftp    # 设置虚拟帐号hqsbcms指定的主目录的权限为nobody,这样就能够映射到宿主帐号nobody
[root@cms_web vsftpd]# chmod -R 700 /hqsb/ftp
          
[root@cms_web vsftpd]# /etc/init.d/vsftpd start
  
[root@bastion-IDC vsftpd]# ll /hqsb/ftp/
total 4
-rwxrwxrwx. 1 nobody nobody    0 Mar 29 12:53 aaa
drwxrwxrwx. 2 nobody nobody 4096 Mar 29 12:53 test

                                                                                                                                                    
vsftpd进程启动报错:
starting vsftpd for vsftpd: 500 OOPS: bad bool value in config file for: anonymous_enable

处理办法:要保证vsftpd.conf文件里每行的配置后面都不要有空格。
解决:vim编辑/etc/vsftpd/vsftpd.conf文件,在尾行模式下输入":%s/\s\+$",而后回车便可。

                                                                                                                                                    
vim删除行首行尾空格和tab的命令以下(非编辑状态下输入):
:%s/^\s\+         删除行首的空格和tab
:%s/\s\+$         删除行尾的空格和tab

上面两条命令的解释:
%s          表示全局搜索
/             为分隔符。
^            表明行首
\s            表明空格和tab
\+           表明匹配一个或多个
$             匹配行尾
                                                                                                                                                   

问题一在ftp客户端(好比FileZilla)进行链接,发现链接失败,没法链接到服务器!以下(例如*.*.186.5为上面ftp服务器外网ip)

缘由及解决:因为上面ftp配置中采用的是被动模式,而客户端链接默认的是主动模式。因此须要手动修改下客户端的默认配置。修改以下:
依次点击FileZilla客户端左上角的"文件"->"站点管理器"->"新建站点"

这样,就能正常链接上FTP服务器了。之后每次链接的时候,就依次打开左上角"文件"->"站点管理器"里以前设置并保存好的站点就行(如上面的185.5-ftp站点)。使用上诉虚拟帐号登录ftp后,只能登录到其设置的主目录/hqsb/ftp下,服务器上的其余目录资源都不能访问!

问题二登录ftp时出现下面报错

500 OOPS: cannot change directory:/hqsb/ftp  
Login failed.  
421 Service not available, remote server has closed connection 

解决办法:一般为Selinux致使,关闭Selinux便可。

                                                                                                                                                  
须要注意
浏览器访问只支持FTP的被动模式,也就是说只有在FTP配置成被动模式时,才能在远程浏览器里经过url访问。好比上面配置后,能够经过web访问ftp://111.111.111.115:2021/

                                                                                                                                                               

ftp命令行登陆(ftp或\ftp):
# ftp ip port
# \ftp 111.111.111.115 2021

若是不使用ftp命令,还能够经过wget命令下载,使用示例以下:
# wget ftp://111.111.111.115:2021/kevin/source_1209-0-1/201801251520-test.tar.gz --ftp-user=kevin --ftp-password=kevin@123

                                                                                                                                                              
FTP数据安全:使用SSL加密传输(再也不使用明文传输)
按照上面的配置后,FTP链接后的数据传输严格来讲是不太安全的,由于是使用明文传输。以下截图,客户端链接过程当中会提示“不安全的服务器,...”

这种状况下,咱们可使用SSL加密传输,配置过程以下:

[root@bastion-IDC ~]# mkdir /etc/vsftpd/sslkey
[root@bastion-IDC ~]# cd /etc/vsftpd/sslkey
[root@bastion-IDC sslkey]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem
Generating a 2048 bit RSA private key
.........................................................................................+++
...................................+++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:huanqiu
Organizational Unit Name (eg, section) []:technology
Common Name (eg, your name or your server's hostname) []:huanqiu
Email Address []:wangshibo@huanqiu.cn

[root@bastion-IDC sslkey]# ls
vsftpd.pem
 
[root@bastion-IDC sslkey]# vim /etc/vsftpd/vsftpd.conf    //在文件最底部添加下面几行
ssl_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
ssl_ciphers=HIGH
require_ssl_reuse=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/vsftpd/sslkey/vsftpd.pem

[root@bastion-IDC sslkey]# /etc/init.d/vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

而后再次在客户端链接FTP(注意FTP客户端配置中的加密类型中要支持"FTP over TLS"),发现就就会创建TLS安装链接了。(链接中,会出现是否信任证书的提示,信任便可)

注意:FTP作了SSL加密传输后,ftp命令将不能再登录,FTP浏览器方式访问也会受阻。需使用支持SSL的客户端来验证vsftp,这里还能够推荐使用flashFXP客户端,以下:

若是flashFXP客户端很差用的话,能够采用lftp工具进行登录:

# yum install -y lftp
# lftp ip -u username -p 2021

注意:lftp命令能够支持ssl加密方式的链接,ftp命令不支持ssl加密方式的链接。
若是远程客户机lftp登陆进去操做报错"Fatal error: Certificate verification: Not trusted"
[root@kevin ~]# lftp 172.16.60.214 -u myftp -p 20021
Password:
lftp myftp@172.16.60.214:~> ls     
ls: Fatal error: Certificate verification: Not trusted
  
[root@kevin ~]# cp /etc/lftp.conf /etc/lftp.conf.bak
[root@kevin ~]# vim /etc/lftp.conf
set ssl:verify-certificate no           #在文本最后添加
  
而后就能够正常登陆并操做了
[root@kevin ~]# lftp 172.16.60.214 -u myftp -p 20021
Password:
lftp myftp@172.16.60.214:~> ls     
drwxr-xr-x    5 500      500          4096 Aug 27 02:54 OPS
drwxr-xr-x    4 500      500          4096 Jun 18 08:19 DEV
drwxr-xr-x    3 500      500          4096 Mar 29 02:24 XDCF

登录后执行ls,若是出现一直请求链接的状况,多数是由于pasv的端口范围在防火墙上没有配置。ftp协议数据传输和命令传输是不一样的端口,这个例子下要开40001~40100端口。

                                                                                                                                                             
添加FTP虚拟帐号

好比添加帐号ops(密码为ops@123),指定目录为/mnt/ops,操做以下:
[root@bastion-IDC vsftpd]# pwd
/etc/vsftpd
[root@bastion-IDC vsftpd]# cat chroot_list
hqsbcms
ops

[root@bastion-IDC vsftpd]# cat vuser_passwd.txt
hqsbcms
hqsbcms_2016@huanqiu.com
ops
ops@123

[root@bastion-IDC vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db

[root@bastion-IDC vsftpd]# cat vuser_conf/ops
local_root=/mnt/ops/
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

[root@bastion-IDC vsftpd]# chown -R nobody.nobody /mnt/ops
[root@bastion-IDC vsftpd]# chmod -R 777 /mnt/ops

照此操做就能够添加FTP虚拟帐号了,每一个虚拟帐号能够对应一个主目录,而且限定到只能ftp访问该主目录
====================================================================================

若是想让虚拟帐号ops权限为只读以及只能下载(没有上传、删除、重命名、建立文件目录等写权限),那么它的配置修改以下:
[root@bastion-IDC vsftpd]# cat vuser_conf/ops
local_root=/mnt/ops/
write_enable=NO
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

                                                                                                                                                              
自动添加FTP虚拟帐号的脚本

下面脚本可用于自动添加vsftp虚拟帐号,脚本中的kevin帐号是已经存在的vsftp虚拟帐号,用这个kevin帐号配置拷贝给新帐号,而后再更新配置。

[root@localhost ~]# vim /opt/scripts/AddVirtualFtpUser.sh
#! /bin/sh
#-----------------------------------------------
# Usage:
#        Add a new virtual user for FTP
# Example:
#        AddVirtualFtpUser.sh Syscode(Capital letter) password
#-----------------------------------------------
 
SysCode=$1
Password=$2
 
FTP_User_DB_TXT="/etc/vsftpd/vuser_passwd.txt"
FTP_User_DB="/etc/vsftpd/vuser_passwd.db"
FTP_User_List="/etc/vsftpd/chroot_list"
Virtual_User_Dir="/etc/vsftpd/vuser_conf"
 
if [ $# -ne 2 ];then
        echo "[Error]: Please input correct parameters."
        echo "[Example]: AddVirtualFtpUser.sh kevin password"
        exit 1
fi
 
SysCode=`echo ${SysCode} | tr '[a-z]' '[A-Z]'`
 
echo ${SysCode} >> ${FTP_User_DB_TXT}
echo ${Password} >> ${FTP_User_DB_TXT}
echo ${SysCode} >> ${FTP_User_List}
 
UpdateDB=`db_load -T -t hash -f ${FTP_User_DB_TXT}  ${FTP_User_DB} 2>&1`
if [ $? -ne 0 ];then
   echo ${UpdateDB}
   exit 1
fi

#用以前的虚拟帐号kevin的配置拷贝到新帐号下,而后替换更新
cp "${Virtual_User_Dir}/kevin" "${Virtual_User_Dir}/${SysCode}"
sed -i "s/kevin/${SysCode}/g" "${Virtual_User_Dir}/${SysCode}"
if [ $? -eq 0 ];then
   echo "Success | 0"
else
   echo "Failed | 1"
fi

授予脚本执行权限
[root@localhost ~]# chmod 755 /opt/scripts/AddVirtualFtpUser.sh

好比相加新ftp帐号rubao,密码为rubao@123,作法:
[root@localhost ~]# sh /opt/scripts/AddVirtualFtpUser.sh rubao rubao@123

                                                                                                                                                              
Haproxy代理层配置上面Ftp虚拟帐号登录环境的访问
下面配置表示本机haproxy的2021端口代理到10.68.250.198(这是后端的ftp服务器)的2021端口(ftp服务端口)。本机的iptables防火墙里开放2021和40001:40100;而10.68.250.198机器的2021和40001:40100端口要对haproxy代理机开放。

Haproxy配置方法一

[root@mysql-master ~]# cat /etc/haproxy/haproxy.cfg
.......

listen ftp_198 0.0.0.0:2021
mode tcp
option tcplog
balance roundrobin
server 10.68.250.198 10.68.250.198 check port 2021 inter 10s rise 1 fall 2

listen ftp_date_198 0.0.0.0:40001-40100
mode tcp
option tcplog
balance roundrobin
server 10.68.250.198 10.68.250.198 check port 2021 inter 10s rise 1 fall 2

Haproxy配置方法二

[root@mysql-master ~]# cat /etc/haproxy/haproxy.cfg
.......
frontend ftp_198 0.0.0.0:2021                       
   mode tcp
   bind *:2021
   default_backend ftp_server
frontend ftp_date_198 0.0.0.0:40001-40100
   mode tcp
   bind *:40001-40100
   default_backend ftp_server_data
backend ftp_server
   mode tcp
   server ftp 10.68.250.198 check port 2021 inter 10s rise 1 fall 2
backend ftp_server_data
   mode tcp
   server ftp 10.68.250.198 check port 2021 inter 10s rise 1 fall 2

                                                                                                                                                         
附上vsftpd配置参数

################################## 基本设定 #########################################
#接受匿名用户
anonymous_enable=YES

#匿名用户login时不询问口令
no_anon_password=YES

#匿名用户主目录
anon_root=(none)

#接受本地用户
local_enable=YES

#本地用户主目录
local_root=(none)

#若是匿名用户须要密码,那么使用banned_email_file里面的电子邮件地址的用户不能登陆
deny_email_enable=YES

#仅在没有pam验证版本时有用,是否检查用户有一个有效的shell来登陆
check_shell=YES

#若启用此选项,userlist_deny选项才被启动
userlist_enable=YES

#若为YES,则userlist_file中的用户将不能登陆,为NO则只有userlist_file的用户能够登陆
userlist_deny=NO

#若是和chroot_local_user一块儿开启,那么用户锁定的目录来自/etc/passwd每一个用户指定的目录(这个不是很清楚,很哪位熟悉的指点一下)
passwd_chroot_enable=NO

#定义匿名登入的使用者名称。默认值为ftp。
ftp_username=FTP

################################### 用户权限控制 ####################################
#能够上传(全局控制).
write_enable=YES

#本地用户上传文件的umask
local_umask=022

#上传文件的权限配合umask使用
#file_open_mode=0666

#匿名用户能够上传
anon_upload_enable=NO

#匿名用户能够建目录
anon_mkdir_write_enable=NO

匿名用户其它的写权利(更改权限?)
anon_other_write_enable=NO

若是设为YES,匿名登入者会被容许下载可阅读的档案。默认值为YES。
anon_world_readable_only=YES

#若是开启,那么全部非匿名登录的用户名都会被切换成guest_username指定的用户名
#guest_enable=NO

全部匿名上传的文件的所属用户将会被更改为chown_username
chown_uploads=YES

匿名上传文件所属用户名
chown_username=lightwiter

#若是启动这项功能,则全部列在chroot_list_file之中的使用者不能更改根目录
chroot_list_enable=YES

#容许使用"async ABOR"命令,通常不用,容易出问题
async_abor_enable=YES

管控是否可用ASCII 模式上传。默认值为NO。
ascii_upload_enable=YES

#管控是否可用ASCII 模式下载。默认值为NO。
ascii_download_enable=YES

#这个选项必须指定一个空的数据夹且任何登入者都不能有写入的权限,当vsftpd 不须要file system 的权限时,就会将使用者限制在此数据夹中。默认值为/usr/share/empty
secure_chroot_dir=/usr/share/empty

############################### 超时设置 ###############################
#空闲链接超时
idle_session_timeout=600

#数据传输超时
data_connection_timeout=120

#P***S请求超时
ACCEPT_TIMEOUT=60

#PROT模式链接超时
connect_timeout=60

############################### 服务器功能选项 #############################
#开启日记功能
xferlog_enable=YES

#使用标准格式
xferlog_std_format=YES

#当xferlog_std_format关闭且本选项开启时,记录全部ftp请求和回复,当调试比较有用.
#log_ftp_protocol=NO

#容许使用pasv模式
pasv_enable=YES

#关闭安全检查,当心呀.
#pasv_promiscuous=NO

#容许使用port模式
#port_enable=YES

#关闭安全检查
#prot_promiscuous

#开启tcp_wrappers支持
tcp_wrappers=YES

#定义PAM 所使用的名称,预设为vsftpd。
pam_service_name=vsftpd

#当服务器运行于最底层时使用的用户名
nopriv_user=nobody

#使vsftpd在pasv命令回复时跳转到指定的IP地址.(服务器联接跳转?)
pasv_address=(none)

########################### 服务器性能选项 ###########################
#是否能使用ls -R命令以防止浪费大量的服务器资源。是否容许递归查询。默认为关闭,以防止远程用户形成过量的I/O
ls_recurse_enable=YES

#是否使用单进程模式。这个设定项目比较危险一点~当设定为YES时,表示每一个创建的连线都会拥有一支process在负责,能够增长vsftpd的效能。
#不过,除非您的系统比较安全,并且硬体配备比较高,不然容易耗尽系统资源喔!通常建议设定为NO的啦!
one_process_model=NO

#绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是那个什么standalone模式
listen=YES

#当使用者登入后使用ls -al 之类的指令查询该档案的管理权时,预设会出现拥有者的UID,而不是该档案拥有者的名称。
#如果但愿出现拥有者的名称,则将此功能开启。
text_userdb_names=NO

#显示目录清单时是用本地时间仍是GMT时间,能够经过mdtm命令来达到同样的效果
use_localtime=NO

#测试平台优化
#use_sendfile=YES 

########################### 信息类设置  ############################
login时显示欢迎信息.若是设置了banner_file则此设置无效
ftpd_banner="欢迎登陆kevin的ftp服务"

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

#显示会话状态信息
#setproctitle_enable=YES

############################ 文件定义 #############################
#定义不能更改用户主目录的文件
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

#定义限制/容许用户登陆的文件
userlist_file=/etc/vsftpd/vsftpd.user_list

#定义登陆信息文件的位置
banner_file=/etc/vsftpd/banner

#禁止使用的匿名用户登录时做为密码的电子邮件地址
#若是deny_email_enable=YES时,能够利用这个设定项目来规定哪一个email address不可登入咱们的vsftpd喔!在上面设定的档案内,一行输入一个email address便可!
banned_email_file=/etc/vsftpd.banned_emails

#日志文件位置
xferlog_file=/var/log/vsftpd.log

#目录信息文件
#当进入一个新目录的时候,会查找这个文件并显示文件里的内容给远程用户。dirmessage_enable需启用。默认值:.message 
message_file=.message

########################### 目录定义 #############################
#定义用户配置文件的目录
user_config_dir=/etc/vsftpd/userconf

#定义本地用户登录的根目录,注意定义根目录能够是相对路径也能够是绝对路径
相对路径是针对用户家目录来讲的
local_root=webdisk

#此项设置每一个用户登录后其根目录为/home/username/webdisk#匿名用户登录后的根目录
anon_root=/var/ftp 

########################## 用户链接选项 ##########################
#可接受的最大client数目
max_clients=100

#每一个ip的最大client数目
max_per_ip=5

#使用标准的20端口来链接ftp
connect_from_port_20=YES

#绑定到某个IP,其它IP不能访问
listen_address=192.168.0.2

#绑定到某个端口
listen_port=2121

#数据传输端口
ftp_data_port=2020

#pasv链接模式时可使用port 范围的上界,0 表示任意。默认值为0。
pasv_max_port=100010

#pasv链接模式时可使用port 范围的下界,0 表示任意。默认值为0。
pasv_min_port=100050

######################### 数据传输选项 ##########################
#匿名用户的传输比率(b/s)
# 这个设定值后面接的数值单位为bytes/秒,限制anonymous的传输速度,若是是0则不限制(由最大频宽所限制),
# 若是您想让anonymous仅有30 KB/s的速度,能够设定『anon_max_rate=30000』
anon_max_rate=51200

#本地用户的传输比率(b/s)
local_max_rate=5120000

#限制anonymous的权限!若是是077则anonymous传送过来的档案权限会是-rw
anon_umask=077


重点注意的细节
=============================================================================================================
1》限制vsftpd最大链接数和传输速率
在FTP服务器的管理中,不管对本地用户仍是匿名用户,对于FTP服务器资源的使用都须要进行控控制,避免因为负担过大形成FTP服务器运行异常,
能够添加如下配置项对FTP客户机使用FTP服务器资源进行控制:

max_client设置项 
用于设置FTP服务器所容许的最大客户端链接数,值为0时表示不限制。
例如max_client=100表示FTP服务器的全部客户端最大链接数不超过100个。

max_per_ip设置项 
用于设置对于同一IP地址容许的最大客户端链接数,值为0时表示不限制。
例如max_per_ip=5表示同一IP地址的FTP客户机与FTP服务器创建的最大链接数不超过5个。

local_max_rate设置项 
用于设置本地用户的最大传输速率,单位为B/s,值为0时表示不限制。
例如local_max_rate=500000表示FTP服务器的本地用户最大传输速率设置为500KB/s.

anon_max_rate设置项 
用于设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制。
例如ano_max_rate=200000,表示FTP服务器的匿名用户最大传输速率设置为200KB/s.

=============================================================================================================
2》指定用户的权限设置

vsftpd.user_list文件须要与vsftpd.conf文件中的配置项结合来实现对于vsftpd.user_list文件中指定用户帐号的访问控制:

a)设置禁止登陆的用户帐号
当vsftpd.conf配置文件中包括如下设置时,vsftpd.user_list文件中的用户帐号被禁止进行FTP登陆:
userlist_enable=YES
userlist_deny=YES 

userlist_enable设置项设置使用vsftpd.user_list文件,userlist_deny设置为YES表示vsftpd.user_list文件用于设置禁止的用户帐号。

b)设置只容许登陆的用户帐号
当vsftpd.conf配置文件中包括如下设置时,只有vsftpd.user_list文件中的用户帐号可以进行FTP登陆:
userlist_enable=YES
userlist_deny=NO 


userlist_enable设置项设置使用vsftpd.user_list文件,
userlist _deny设置为NO表示vsftpd.usre_list文件用于设置只容许登陆的用户帐号,文件中未包括的用户帐号被禁止FTP登陆。

userlist_deny和userlist_enable选项限制用户登陆FTP服务器

注意:使用userlist_deny选项和user_list文件一块儿能有效阻止root,apache,www等系统用户登陆FTP服务器,从而保证FTP服务器的分级安全性。

如下是两个选项的具体表现形式和两种搭配使用方式的效果:
Userlist_enable=YES   表示:Ftpusers中用户容许访问;User_list中用户容许访问
Userlist_enable=NO    表示:Ftpusers中用户禁止访问;User_list中用户容许访问
Userlist_deny=YES     表示:Ftpusers中用户禁止访问(登陆时能够看到密码输入提示,但仍没法访问);User_list 中用户禁止访问
Userlist_deny=NO      表示:Ftpusers中用户禁止访问;User_list中用户容许访问

Userlist_enable=YES 而且 Userlist_deny=YES  表示:Ftpusers中用户禁止访问;User_list中用户禁止访问(登陆时不会出现密码提示,直接被服务器拒绝)
Userlist_enable=YES 而且 Userlist_deny=NO   表示:Ftpusers中用户禁止访问;User_list中用户容许访问

                                                                                                                                                         
FTP/LFTP在Shell脚本中的用法

1)从FTP上批量下载文件到本地
[root@Kevin test]# pwd
/tmp/test
[root@Kevin test]# ls
ftp.sh  test.file
  
[root@Kevin test]# cat ftp.sh
#!/bin/sh
ftp -v -n 192.168.10.10 20021 << EOF       # ip,port
user kevinftp ftp1@3$                      # user后面跟的是ftp链接的用户名和密码
binary                                     # 文件传输类型
cd IFS/Pay/iOS/                            # cd是登陆到远程ftp后的路径(在ftp根目录下的cd切换)
lcd /tmp/test/                             # lcd是在本地主机目录操做的命令
prompt                                     # 取消交互
mget *                                     # mget是批量的下载文件,*表示下载当前ftp目录下的全部文件,能够是一个或多个文件,中间使用空格隔开。
bye
EOF                                      
echo "download from ftp successfully"
  
2)从本地向FTP批量上传文件
[root@Kevin test]# cat ftp.sh
#!/bin/sh
ftp -v -n 192.168.10.10 20021 << EOF  
user kevinftp ftp1@3$
binary
cd IFS/Pay/iOS/             
lcd /tmp/test/                             # 也可使用"lcd ./"表示在本地当前目录下                          
prompt
mput test.file ftp.sh                      # mput是批量上传的文件,能够是一个或多个文件,中间用空格隔开。也可使用*表示上传本地当前目录下的全部文件。
bye
EOF                                      
echo "upload to ftp successfully"
  
=====================================================================================
lftp在shell中的用法(去掉交互) (ftp登陆的用户名是kevinftp,密码是ftp1@3$)
 
[root@Kevin ~]# lftp 192.168.10.10 -u kevinftp -p 20021
Password:
lftp kevinftp@192.168.10.10:~> ls     
drwxr-xr-x    5 500      500          4096 Aug 27 02:54 BOBO
drwxr-xr-x    4 500      500          4096 Jun 18 08:19 GRACE
drwxrwxr-x    4 500      500          4096 Aug 27 03:18 RUBAO
drwxr-xr-x    3 500      500          4096 Mar 29 02:24 XIAOAN
drwxr-xr-x    3 500      500          4096 Mar 28 11:45 HEHUO
  
lftp在命令行里非交互模式直接登陆使用
[root@Kevin ~]# lftp -c "open 192.168.10.10.20021 ;user kevinftp ftp1@3$;ls;"               
drwxr-xr-x    5 500      500          4096 Aug 27 02:54 BOBO
drwxr-xr-x    4 500      500          4096 Jun 18 08:19 GRACE
drwxrwxr-x    4 500      500          4096 Aug 27 03:18 RUBAO
drwxr-xr-x    3 500      500          4096 Mar 29 02:24 XIAOAN
drwxr-xr-x    3 500      500          4096 Mar 28 11:45 HEHUO
  
上传a.log和a.txt文件(put)
[root@Kevin ~]# lftp -c "open 192.168.10.10.20021 ;user kevinftp ftp1@3$;put a.log;put a.txt;" >/dev/null 2>&1
[root@Kevin ~]# lftp -c "open 192.168.10.10.20021 ;user kevinftp ftp1@3$;ls;"
drwxr-xr-x    5 500      500          4096 Aug 27 02:54 BOBO
drwxr-xr-x    4 500      500          4096 Jun 18 08:19 GRACE
drwxrwxr-x    4 500      500          4096 Aug 27 03:18 RUBAO
-rw-r--r--    1 500      500        231498 Aug 30 10:28 a.log
-rw-r--r--    1 500      500           906 Aug 30 10:28 a.txt
drwxr-xr-x    3 500      500          4096 Mar 29 02:24 XIAOAN
drwxr-xr-x    3 500      500          4096 Mar 28 11:45 HEHUO
  
删除(rm)(注意:ftp登陆后的删除命令是delete,lftp登陆后的删除命令是rm)
[root@Kevin ~]# lftp -c "open 192.168.10.10.20021 ;user kevinftp ftp1@3$;rm -f a.log;rm -f a.txt;" >/dev/null 2>&1            
[root@Kevin ~]# lftp -c "open 192.168.10.10.20021 ;user kevinftp ftp1@3$;ls;"
drwxr-xr-x    5 500      500          4096 Aug 27 02:54 BOBO
drwxr-xr-x    4 500      500          4096 Jun 18 08:19 GRACE
drwxrwxr-x    4 500      500          4096 Aug 27 03:18 RUBAO
drwxr-xr-x    3 500      500          4096 Mar 29 02:24 XIAOAN
drwxr-xr-x    3 500      500          4096 Mar 28 11:45 HEHUO
  
下载(get)
[root@Kevin ~]# lftp -c "open 192.168.10.10.20021 ;user kevinftp ftp1@3$;get a.log;get a.txt;" >/dev/null 2>&1

                                                                                                                                                                         
FTP登陆后操做出现227错误

部署了FTP的PASV的被动模式,远程客户机链接ftp后进行操做,一直出现227错误,以下:

[root@Kevin ~]# ftp 192.168.10.10 20021
Connected to 192.168.10.10 (192.168.10.10).
220 Welcome to aiops FTPs service.PLS use Passive mode.
Name (192.168.10.10:root): mpsftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). 
就一直卡在这里了.......

这里就要分析下FTP的两种工做模式,PORT主动模式和PASV被动模式 (文章开头已经详细介绍了)
参考并尝试网上解决办法都很差使,最后无奈将被动模式改成主动模式,并将ftp端口给位默认的21端口,问题得已解决。

须要修改的配置以下:
[root@Kevin ~]# cat /etc/vsftpd/vsftpd.conf
........
#修改FTP监听端口
#listen_port=20021
listen_port=21

#使用被动模式,指定数据端口及安全检查(被动模式配置都注释了)
#pasv_enable=YES
#pasv_min_port=40001
#pasv_max_port=40100
#pasv_promiscuous=NO
#max_clients=150
#accept_timeout=5
#connect_timeout=1
#max_per_ip=5

最后重启ftp服务
[root@Kevin ~]# /etc/init.d/vsftpd restart

再次链接ftp进行操做就能够了(默认链接的就是21端口)
[root@Kevin ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 Welcome to aiops FTPs service.PLS use Passive mode.
Name (192.168.10.10:root): mpsftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode   (10,4,87,254,216,234).
150 Here comes the directory listing.
drwxr-xr-x    5 500      500          4096 Aug 27 02:54 BOBO
drwxr-xr-x    4 500      500          4096 Jun 18 08:19 GRACE
drwxrwxr-x    4 500      500          4096 Aug 27 03:18 RUBAO
drwxr-xr-x    3 500      500          4096 Mar 29 02:24 XIAOAN
drwxr-xr-x    3 500      500          4096 Mar 28 11:45 HEHUO
226 Directory send OK.
ftp>

                                                                                                                                            
FTP上传文件先后大小改变
1)对比文件上传先后的MD5值("md5sum filename"),MD5值不同,则文件确定是有变化的了。
2) "\ftp ip port"登陆ftp后,在使用put/get命令进行上传/下载操做前,先输入"binary",即将传输模式设为二进制(默认是ASCII方式传输),这样能够防止windows下的文件传到linux上出现文件损坏的状况。

相关文章
相关标签/搜索