CentOS安装FTP服务端(vsftpd)

前言

端口

使用的端口

控制连接端口(可修改):21

主动模式的数据连接端口(可修改):20

被动模式的数据连接端口(可修改):55536-55567

主动模式和被动模式

FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。

主动模式和被动模式都是通过连接端口进行连接,区别在于数据连接的方式

  • 主动模式:服务器主动连接客户端通过20端口。
  • 被动模式:客户端连接服务端通过指定的被动模式数据端口。

大部分情况下我们都是使用的被动模式:

因为大多数防火墙和 NAT 设备默认允许客户端发起的出站连接,因此可以更轻松地穿越网络限制,确保数据传输的正常进行。

主动模式如果客户端处于防火墙或 NAT 设备之后,客户端的防火墙可能会阻止来自服务器 20 端口的数据连接请求,导致数据传输失败。

主动模式:

1
2
命令连接:客户端(>1023端口) -> 服务器 21端口
数据连接:客户端(>1023端口) <- 服务器 20端口

被动模式:

1
2
命令连接:客户端(>1023端口) -> 服务器 21端口
数据连接:客户端(>1023端口) -> 服务器 (>1023端口)

环境部署

关闭SELINUX

打开配置文件

1
vi /etc/selinux/config

修改

1
2
3
4
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

保存

1
:wq! #保存退出

配置立即生效

1
setenforce 0 #使配置立即生效

安装vsftpd

1
2
3
4
5
6
7
8
9
10
11
12
13
#查询vsftpd是否安装
rpm -qc vsftpd

#安装vsftpd虚拟用户配置依赖包
yum install -y psmisc net-tools systemd-devel libdb-devel perl-DBI
#安装vsftpd
yum install -y vsftpd

#启动
systemctl start vsftpd.service

#设置vsftpd开机启动
systemctl enable vsftpd.service

ftp的配置文件主要有三个,位于/etc/vsftpd/目录下,分别是:

  • ftpusers 该文件用来指定那些用户不能访问ftp服务器。

  • user_list 该文件用来指示的默认账户在默认情况下也不能访问ftp

  • vsftpd.conf vsftpd的主配置文件

新建系统用户vsftpd

1
2
3
4
#用户目录为/data/wwwjarapi, 用户登录终端设为/bin/false(即使之不能登录系统)
useradd vsftpd -d /data/wwwjarapi -s /bin/false

chown vsftpd:vsftpd /data/wwwjarapi -R

vsftp配置

1
2
#备份默认配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-bak

修改配置文件

1
vi /etc/vsftpd/vsftpd.conf

内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
anonymous_enable=NO
chroot_list_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=NO
xferlog_std_format=YES

async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to FTP service.
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
use_localtime=YES
listen_port=15875

chroot_local_user=YES
idle_session_timeout=300

data_connection_timeout=1
guest_enable=YES
guest_username=vsftpd

user_config_dir=/etc/vsftpd/vconf
virtual_use_local_privs=YES

accept_timeout=5
connect_timeout=1

allow_writeable_chroot=YES

# pasv
pasv_enable=YES
pasv_min_port=15876
pasv_max_port=15896
pasv_address=117.160.27.55
pasv_addr_resolve=YES

使用IPV4

解决服务器发回了不可路由的地址,使用服务器地址代替的问题。

1
2
listen=YES
listen_ipv6=NO

开启被动模式

1
2
3
4
5
6
7
8
#开启被动模式
pasv_enable=YES
#被动模式端口范围
pasv_min_port=15876
pasv_max_port=15896
#需要加入外部ip,否则被动模式会失败
pasv_address=117.160.27.55
pasv_addr_resolve=YES

说明

pasv_address 是所在服务器的公网IP。

开启被动模式后主动和被动都是支持的。

端口的开放最好是一个范围,假如只有1端口开放,FTP中设置并发传输的数量也只能是1,否则会报错。

修改主动模式数据端口

如果要使用主动模式并且不能用默认的20端口,可以修改主动的数据端口。

修改主动模式数据端口:

1
2
3
connect_from_port_20=NO 
# 指定主动模式的端口
ftp_data_port=15876

配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
anonymous_enable=NO # 设定不允许匿名访问
local_enable=YES # 设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问
chroot_list_enable=YES # 使用户不能离开主目录
ascii_upload_enable=YES
ascii_download_enable=YES # 设定支持ASCII模式的上传和下载功能
pam_service_name=vsftpd # PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证


#以下这些是关于vsftpd虚拟用户支持的重要配置项,默认vsftpd.conf中不包含这些设定项目,需要自己手动添加
guest_enable=YES # 设定启用虚拟用户功能
guest_username=vsftpd # 指定虚拟用户的宿主用户,CentOS中已经有内置的ftp用户了,通过映射到vsftpd
user_config_dir=/etc/vsftpd/vuser_conf # 设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。(配置文件名=虚拟用户名)

虚拟用户

建立虚拟用户名单文件

1
touch /etc/vsftpd/virtusers

编辑虚拟用户名单文件:(单行账号,双行密码,注意:不能使用root做用户名,系统保留)

1
vi /etc/vsftpd/virtusers

输入

1
2
zhangjian
123456

保存退出

1
:wq!

查看

1
cat /etc/vsftpd/virtusers

生成虚拟用户数据文件

1
2
3
4
5
rm -rf /etc/vsftpd/virtusers.db 
db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db

#设定PAM验证文件,并指定对虚拟用户数据库文件进行读取
chmod 600 /etc/vsftpd/virtusers.db

虚拟用户配置

建立虚拟用户个人Vsftp的配置文件和子账号FTP权限

user_config_dir指定的目录下,文件名要和虚拟用户名保持一致

1
2
3
4
5
6
7
8
9
10
mkdir /etc/vsftpd/vconf

cd /etc/vsftpd/vconf

touch zhangjian #这里创建虚拟用户配置文件
#设置FTP上传文件新增权限,最新的vsftpd要求对主目录不能有写的权限所以ftp为755,主目录下面的子目录再设置777权限
chmod -R 755 /data/wwwjarapi/
chmod -R 777 /data/wwwjarapi/schoolfile/
#编辑用户zhangjian配置文件,其他的跟这个配置文件类似
vi /etc/vsftpd/vconf/zhangjian

输入以下内容

1
2
3
4
5
6
local_root=/data/wwwjarapi/schoolfile/
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

保存退出

1
:wq!

认证配置

备份原配置

1
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpdbak

添加新配置

1
vi /etc/pam.d/vsftpd

加入下面部分

1
2
auth    sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers

注意:如果系统为32位,上面改为lib,否则配置失败

重启vsftpd服务器

1
systemctl restart vsftpd.service

日志查看

可通过下面指令,查看服务器安全日志,便于分析错误问题,设置操作效果一定要仔细

1
tail -f /var/log/secure

修改端口

打开配置文件

1
vi /etc/vsftpd/vsftpd.conf

修改

1
listen_port=15875

重启

1
systemctl restart vsftpd.service

开放端口

1
2
firewall-cmd --zone=public --add-port=15875/tcp --permanent
firewall-cmd --reload

检查开放情况

1
firewall-cmd --zone=public --list-ports

开启防火墙ftp端口

默认的ftp服务端口是21。

假如15875端口是ftp服务端口;15876到15896是Vsftpd被动模式需要的端口,可自定义一段大于1024的tcp端口

阿里云服务器记得开放上面的端口

firewall

1
2
3
firewall-cmd --zone=public --add-port=15875/tcp --permanent
firewall-cmd --zone=public --add-port=15876-15896/tcp --permanent
firewall-cmd --reload

检查开放情况

1
firewall-cmd --zone=public --list-ports

如果想移除

1
2
3
firewall-cmd --zone=public --remove-port=15876/tcp --permanent
firewall-cmd --zone=public --remove-port=10060-10090/tcp --permanent
firewall-cmd --reload

iptables

CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙。

关闭firewall:

1
2
3
systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

编辑防火墙配置文件

vi /etc/sysconfig/iptables

1
2
-A INPUT -m state --state NEW -m tcp -p tcp --dport 15875 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 15876:15896 -j ACCEPT

重启防火墙使配置生效

1
2
3
systemctl restart iptables.service #最后重启防火墙使配置生效

systemctl enable iptables.service #设置防火墙开机启动

客户端

FileZilla

https://filezilla-project.org/index.php

个人最推荐,能设置并发传输的数量,进度会以进度条显示。

WinSCP

https://winscp.net/eng/index.php

能设置并发传输的数量,进度会以百分比显示。

XFTP

https://www.xshell.com/zh/free-for-home-school/

不能设置并发传输的数量,进度会以进度条显示。