CentOS7使用vsftpd搭建ftp

时间:2024-03-11 08:02:21

1、下载安装vsftpd的rpm安装包

下载地址:http://rpmfind.net/linux/rpm2html/search.php?query=vsftpd(x86-64)

2.检查是否已经安装了vsftp

# 如果没有提示则说明没有安装,如果提示版本号则说明已经安装
rpm -qa | grep vsftpd

3、安装vsftpd-3.0.2-28.el7.x86_64.rpm

# 离线安装
rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm
# 在线安装
yum install -y vsftp

# 安装过程可能会报错:
[root@localhost mysoftware]# rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm  warning: vsftpd-3.0.2-22.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY error: Failed dependencies: libc.so.6(GLIBC_2.14)(64bit) is needed by vsftpd-3.0.2-22.el7.x86_64 libc.so.6(GLIBC_2.15)(64bit) is needed by vsftpd-3.0.2-22.el7.x86_64

# 解决办法:安装相关依赖
rpm -ivh libcap-2.16-5.5.el6.x86_64.rpm
rpm -ivh libcap-devel-2.16-5.5.el6.x86_64.rpm

4、检查是否安装成功

[root@localhost mysoftware]# rpm -qa | grep vsftpd
# 出现版本号,说明安装成功
vsftpd-2.2.2-24.el6.x86_64 

# vsftpd安装主要目录说明
/etc/vsftpd #ftp服务主目录
/etc/vsftpd/ftpusers #ftp用户目录
/etc/vsftpd/user_list #ftp用户列表
/etc/vsftpd/vsftpd.conf #配置文件
/usr/sbin/vsftpd # 系统目录
/usr/lib/systemd/system/vsftpd.service
/var/ftp #匿名用户的默认数据目录
/var/ftp/pub #匿名用户的数据目录的扩展目录

5、防火墙开启21端口

# 因为ftp默认的端口为21,而centos默认是没有开启的。
# centos7中的防火墙改成了firewall,使用iptables无作用,开放端口的方法如下:

# 开启80端口,此处只需要开启21端口即可
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 返回success为成功,命令含义: 
#    --zone #作用域 
#    --add-port=80/tcp #添加端口,格式为:端口/通讯协议 
#    --permanent #永久生效
 
# 开启21端口
firewall-cmd --zone=public --add-port=21/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload
# 查看已开放的端口
firewall-cmd --list-ports

6、修改selinux

# 执行以下命令查看状态:
getsebool -a | grep ftp

[root@localhost vsftpd]# getsebool -a | grep ftp 
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off #改为on
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off # 改为on

# 使用一下命令进行修改
[root@localhost vsftpd]# setsebool -P allow_ftpd_full_access on
[root@localhost vsftpd]# setsebool -P tftp_home_dir on

7、使用xftp进行测试

匿名登录默认访问目录:/var/ftp/pub

8、创建用户并关闭匿名访问

# 创建用户
useradd ftpuser
# 设置密码
passwd ftpuser
# 此用户就是用来登录ftp服务器用的,登录后默认的路径为 /home/ftpuser

# 设置FTP用户的账号,例如账号为“ftpuser”,目录为/home/ftpuser,且设置不允许通过ssh登录,不允许ssh会导致登录失败,可参考下面的解决方案配置
useradd -d /home/ftpuser -s /sbin/nologin ftpuser

# 切换目录
cd /etc/vsftpd
# 备份配置文件
cp vsftpd.conf vsftpd.conf.copy
# 编辑
vim /etc/vsftpd/vsftpd.conf
# 在配置文件中找到“anonymous_enable=YES”,将"YES"改为"No",将匿名登录禁用
anonymous_enable=No

9、开启被动模式

# 默认是开启的,但是要指定一个端口范围,打开vsftpd.conf文件,在后面加上
pasv_min_port=30000
pasv_max_port=30999
表示端口范围为30000~30999,这个可以随意改。改完重启一下vsftpd。

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
[root@localhost ~]# service vsftpd restart

#由于指定这段端口范围,firewall也要把相应的端口打开
[root@localhost ~]# firewall-cmd --zone=public --add-port=30000-30999/tcp --permanent
[root@localhost ~]# firewall-cmd --reload

查看:
[root@localhost ~]# firewall-cmd --list-ports
80/tcp 21/tcp 30000-30999/tcp

Centos7中vsftpd--530 Login incorrect. Login failed的一个解决办法

# 查看对应的ftp用户所对应的主目录和登陆shell
cat /etc/passwd
# 发现ftpuser对应为/sbin/nologin
ftpuser:x:1001:1001::/home/ftpuser:/sbin/nologin

# 修改
vim /etc/shells
# 在末尾处添加/sbin/nologin
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
/sbin/nologin

# 之后再登陆可能会报
vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot
# 在vsftpd.conf中新增allow_writeable_chroot=YES配置
vim /etc/vsftpd/vsftpd.conf
allow_writeable_chroot=YES
# 重新启动服务
systemctl restart vsftpd.service

代码测试:

package com.startest;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTP;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class test {
    public static void main(String[] args) throws IOException {
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect("192.168.64.128");
        boolean res = ftpClient.login("username", "password");
        FileInputStream inputStream = new FileInputStream(new File("F:\\cat.jpeg"));
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.storeFile("cat.jpeg", inputStream);
        inputStream.close();
        if (ftpClient.logout()) {
            System.out.println("成功!");
        } else {
            System.out.println("失败!");
        }
    }
}

注意:如果使用工具连接或代码访问时连接很慢,读目录也很慢,则可以修改配置:reverse_lookup_enable=NO ,表示不查找dns服务器

附录一:vsdftp相关命令

# 启动
service vsftpd start
# 查看启动端口
netstat -nltp|grep vsftpd
# 重新启动vsftpd服务
service vsftpd restart

# 设置开机启动
systemctl enable vsftpd.service
# 查看开机启动项命令
systemctl list-unit-files
# 启动vsftpd服务
systemctl start vsftpd.service
# 停止vsftpd服务
systemctl stop vsftpd.service
# 查看状态
systemctl status vsftpd.service
# 重启vsftpd服务
systemctl restart vsftpd.service

附录二:防火墙相关命令

# 查看防火墙状态:
firewall-cmd --state 
# 启动防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 检查防火墙开放的端口
firewall-cmd --permanent --zone=public --list-ports
# 开放一个新的端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重启防火墙
firewall-cmd --reload
# 验证新增加端口是否生效
firewall-cmd --zone=public --query-port=8080/tcp
# 防火墙开机自启动
systemctl enable firewalld.service
# 防火墙取消某一开放端口
firewall-cmd --zone=public --remove-port=9200/tcp --permanent
# 查看开放的端口号
firewall-cmd --list-all