Centos7配置vsftp匿名用户本地用户PORT、PASV模式设置

  • by

1、yum安装 vsftpd:       yum install vsftpd -y

2、设置vsftpd开机自启动:   systemctl enable vsftpd.service

3、启动vsftpd:  systemctl start vsftpd.service

4、开启iptables防火墙21端口: 

iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT

service iptables save

service iptables restart

5、修改vsftpd配置文件:  /etc/vsftpd/vsftpd.conf

  • a. Vsftpd配置文件:/etc/vsftpd/vsftpd.conf
  • b. 系统用户ftp(默认无密码)已经可以作为vsftp的匿名用户来使用。
  • c. 从/etc/passwd中的值ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin可以看出:根目录 /var/ftp/, 禁止控制台登陆,也就是该用户只能进行ftp访问。
  • d. anon_upload_enable=YES,anon_mkdir_write_enable=YES被注释掉,即默认匿名用户不可上传文件,也不可以在服务器上创建目录。
  • e. port_enable=YES,即默认情况下,FTP  PORT主动模式被启用
  • f. connect_from_port_20=YES,即默认情况下,FTP PORT主动模式进行数据传输时使用20端口(ftp-data)。YES使用,NO不使用。
  • g. ftp_data_port=port number,设定ftp数据传输端口(ftp-data)值。默认值为20。此参数用于PORT FTP模式。
  • h. pasv_enable=YES,即默认情况下,FTP  PASV被动模式被启用。但是由于防火墙设置的原因,默认情况下,FTP PASV被动模式使用FTP会失败。
  • i. listen=YES,即默认情况下,vsftpd以单例模式监听IPv4 socket端口。该命令不能和listen_ipv6同时使用。因此如果要同时启用对IPv4和IPv6的支持的话,必须同时运行2份vsftpd,每份vsftpd包含自己的配置文件(一个监听IPv4,一个监听IPv6)
  • j. windows cmd下使用命令 ftp serverip,然后在弹出的提示画面中输入用户名“ftp”就能正常登录到ftp服务器。执行命令ls,从服务器端返回的如下信息:“200 PORT command successful. Consider using PASV.150 Here comes the directory listing.”中我们就可以看出,这个ftp连接执行在PORT主动模式下
  • k. 使用Winscp、FileZilla连接时,会发现ftp用户能正常登录,但是list命令执行超时。这是因为默认情况下,这些客户端的FTP都运行在PASV被动模式下,而vsftp服务器由于没有对PASV端口范围及相应的iptables防火墙做设置,数据传输的连接被阻塞导致命令执行超时。当客户端强制启用PORT主动模式连接后,就能正常使用ftp功能。
  • l. FileZilla强制启用FTP PORT主动访问方式:Edit->Setting->Connection->Ftp->Transfer Mode->Select “Active” and uncheck “Allow fall back to other transfer mode on failure”
  • m. Winscp强制启用FTP PORT主动访问方式:在Winscp的login登录界面中,选择ftp,然后勾上“Advanced options”,选中左边导航中的Connection栏目,然后在弹出画面上不选中“Passive Mode”。

6、 匿名用户上传下载

  • a. anonymous_enable=YES
  • b. anon_upload_enable=YES
  • c. anon_mkdir_write_enable=YES
  • d. 目录权限设置:修改/var/ftp/pub的目录权限为744,并把目录的owner和group都改成ftp(ftp用户必须有可执行x权限,否则在执行ftp命令CWD pub时,会报错误:Response: 550 Failed to change directory. Error: Failed to retrieve directory listing。匿名用户下载是使用的是nobody这个用户,所以权限相应的other这个位置要有R权限才能被下载。)
  • e. chown ftp.ftp /var/ftp/pub
  • f. chmod 744 /var/ftp/pub
  • g. /var/ftp使用默认的权限755以及默认的owner、group:root
  • h. 如下关闭selinux,否则上传文件时报错误553 Could not create file. Error: Critical file transfer error。也可以不关闭selinux,在selinux中设置ftp例外,参考:
  • i. /etc/selinux/config文件中的SELINUX=enforcing,改成SELINUX=permissive,机器reboot(如果不想重启机器,也可以执行命令setenforce 0;setenforce 1 设置SELinux 成为enforcing模式;setenforce 0 设置SELinux 成为permissive模式。)
  • j. 上传后的文件不能被直接下载,如果需要可以直接被下载,要设置匿名用户上传文件时的掩码anon_umask=073
  • k. 匿名用户重命名,删除权限设置anon_other_write_enable=YES
  • l. no_anon_password=YES   #匿名用户登录时不询问口令

7、 由于默认情况下,匿名ftp用户的PASV模式访问被防火墙阻塞,启用PASV模式访问

  • a. pasv_enable=YES,即默认情况下,FTP  PASV被动模式被启用。
  • b. pasv_min_port=30000 ,设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意(1024 – 65535端口)。默认值为0。把端口范围设在比较高的一段范围内,比如30000-31000。
  • c. pasv_max_port=31000
  • d. 防火墙设置:-A INPUT -m state –state NEW -m tcp -p tcp –dport 30000:31000 -j ACCEPT   ######同时可以用参数-s 192.168.0.0/16来限制客户端IP范围,以这种方式增加安全性。
  • e. netstat -ap | grep ftp 查看服务器端ftp数据传输时使用的端口:

8,禁用匿名用户,启用系统本地用户

  • a. anonymous_enable=NO  禁止匿名用户登录 local_enable=YES 允许本地用户登录
  • b. write_enable=YES  #本地用户可以上传(全局控制) 删除,重命名
  • c. local_umask=022 #本地用户上传文件的umask,上传文件默认权限644(666-022),上传文件夹默认权限755(777-022)
  • d. 关闭selinux,否则上传文件时报错误553 Could not create file. Error: Critical file transfer error。也可以不关闭selinux,在selinux中设置ftp例外,参考:
  • e. userlist_enable=yes    启用/etc/vsftpd/user_list列表
  • f. userlist_deny=no    只允许/etc/vsftpd/user_list列表中的用户登录(ftpusers限制仍然起作用)
  • g. chroot_list_enable=NO,chroot_local_user=YES,所有的用户均不能切换到其他目录。
  • h. useradd –d /ftp –s /bin/false prj  添加本地系统的ftp用户prj,并设置用户home目录,禁止shell登录,设置密码passwd prj。默认创建的/ftp目录owner是prj,权限700。
  • i. 把用户prj加到user_list列表文件中
  • j. user_config_dir=/etc/vsftpd/userconf #设置用户的单独配置文件,用哪个帐户登陆就用哪个帐户命名,实现不同用户不同权限(1,文件格式、属性和主配置文件一致 2,文件名没有.conf后缀  3,这里的属性会覆盖主配置文件相应的属性 4,并不是所有属性放这里都会起作用)
  • k. 建立目录/etc/vsftpd/userconf,并创建ftp用户名想对应的文件prj,在文件中用local_root属性指定prj用户登录后进入的目录。还可以设置属性:cmds_allowed,local_umask=022, local_max_rate限速等
  • l. 编辑/etc/pam.d/vsftp文件,注释掉auth required pam_shells.so(这个语句的意思是只有包含shell的用户才能登录)
  • m. ftpd_banner定制ftp登录时的欢迎信息
  • n. max_clients=100 #FTP的最大连接数
  • o. max_per_ip=5    #每IP的最大连接数
  • p. vsftpd服务器重启

9,禁用匿名用户,启用虚拟FTP用户

  • a. anonymous_enable=NO  禁止匿名用户登录
  • b. local_enable=YES 允许本地用户登录,虽然虚拟用户不是操作系统用户,但是最终还是关联到虚拟宿主用户身上,因此,这里属性还是要设置为yes
  • c. pam_service_name=vsftpd #设置PAM使用的名称,默认值为/etc/pam.d/vsftpd。
  • d. guest_enable=YES  启用虚拟用户登录
  • e. guest_username=ftp #这里设置虚拟用户的宿主用户。默认值为ftp。
  • f. virtual_use_local_privs=YES/NO #当该参数激活(YES)时,虚拟用户与其宿主用户有相同的权限。 当此参数关闭(NO)时,虚拟用户与匿名用户有相同的权限。默认情况下此参数是关闭的(NO)。
  • g. 用db_load生成虚拟用户数据库
  • h. 修改pam.d下的vsftpd文件,修改用户认证方式

10、ssl加密的vsftp(vsftp with OpenSSL)参考:加密ssl vsftp、ftp隐式加密&显式加密
11、vsftp配置用户磁盘配额(磁盘限额参考:Virtualbox下为CentOS增加新硬盘、Linux添加新硬盘、vsftp配置用户磁盘配额(磁盘限额)

// 匿名用户设置
anonymous_enable=YES
no_anon_password=YES
anon_root=/var/ftp
anon_umask=073
anon_max_rate=
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable

chown_uploads
chown_username

// 本地用户设置
anonymous_enable=NO
write_enable=YES
userlist_enable=yes
userlist_deny=no
chroot_list_enable=NO
chroot_local_user=YES
user_config_dir=/etc/vsftpd/userconf

// 本地用户设置 - 各用户独立设置属性
local_root
local_umask=022
local_max_rate

vsftpd日志:默认情况下,vsftp在/var/log/xferlog文件中记录Wu-ftpd格式的日志(它会记录上传和下载的动作)。通过设置dual_log_enable和log_ftp_protocol,可以启用vsftp自己的日志,默认日志文件/var/log/vsftpd.log,其中会记录所有的ftp命令日志,看到的内容和FTP客户端FileZilla中显示的内容一致!所以调试错误的时候,貌似也没有开启的必要。ftp登录或者操作出问题的时候,主要看返回的错误代码是多少,然后找可能的原因。如553 Could not create file. 

  • xferlog_enable=yes/no //是否启用 xferlog 日志格式
  • xferlog_std_format=yes/no //是否采用标准格式记录日志
  • xferlog_file=/path/to/logfile //xferlog 日志文件所在位置,默认为/var/log/xferlog
  • dual_log_enable=yes/no //是否采用VSFTPd自己的日志记录方式
  • log_ftp_protocol=yes/no //是否记录所有的ftp命令日志
  • syslog_enable=yes/no   //是否将日志信息写入系统日志/var/log/messages中

常见ftp错误代码: 

  • Connect 连接被拒绝: 可能原因是vsftpd服务没被启动
  • 530 Permission denied: 可能原因是userlist_enable=YES并且/etc/vsftpd/user_list中包含要登录的ftp用户名   即user_list禁止了该用户的登录、或者可能是没有指定userlist_file=/etc/vsftpd/user_list
  • 530 Login incorrect: 可能原因是登录的ftp用户名被包含在禁止登录列表/etc/vsftpdftpusers中 | 同时要确保用户名、密码是正确的 | 也可能是配置文件中少了一行pam_service_name=vsftpd |  检查/etc/pam.d/vsftpd 文件里面lib的路径 | 编辑/etc/pam.d/vsftp文件,注释掉auth required pam_shells.so(这个语句的意思是只有包含shell的用户才能登录)
  • 530 Non-anonymous sessions must use encryption.:服务器的强制,非匿名用户必须使用加密连接
  • 500 OOPS: cannot open user list file:可能原因是不存在文件“/etc/vsftpd/user_list”或文件中不存在该帐户,解决:解决: cho username >> /etc/vsftpd/user_list
  • 500 OOPS: cannot open chroot() user list file | 500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list:可能原因是不存在文件“/etc/vsftpd/chroot_list”
  • 500 OOPS: missing value in config file: 可能原因是配置文件“=”等号前值有问题,或只有一个空格
  • 500 OOPS: bad bool value in config file: 可能原因是配置文件=”等号后值有问题
  • 500 OOPS: unrecognised variable in config file: 可能原因是参数前有空格
  • 500 OOPS: chdir, 500 OOPS: child died, 500 OOPS: chroot:可能原因是用户主目录没有权限或没有主目录,或者还是selinux影响的
  • 500 OOPS: vsftpd: both local and anonymous access disabled!匿名用户和本地用户登录都被禁用
  • GnuTLS error -12: A TLS fatal alert has been received.:received.:Filezilla最新版本认为vsftpd默认的加密算法”DES-CBC3-SHA”不够安全而拒绝连接导致的。有两种办法解决该问题,一是降级你的Filezilla客户端版本到3.5.3以下,二是更改服务器端vsftpd的配置。增加属性:ssl_ciphers=HIGH
  • ECONNREFUSED – Connection refused by server: 当启用隐式ssl连接,用filezilla、winscp客户端连接时报错,因为vsftpd此时服务器端的端口还是21,但是客户端确以990来连接。修改客户端连接时使用的参数或者服务器的通过参数listen_port设置端口为990,问题解决


发表评论

电子邮件地址不会被公开。 必填项已用*标注

16 − 4 =