FTP( File Transfer Protocol
,文件传输协议) 是一种在互联网上进行文件传输的协议,用于在因特网上控制文件的双向传输。
FTP 服务简介
FTP 简称“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
FTP
默认使用 TCP
端口 20
和 21
TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。FTP的任务是从一台计算机将文件传送到另一台计算机,不受操作系统的限制。
简而意之:20 端口用于传输命令及参数;21 端口用于传输实际文件数据。
FTP协议的传输拓扑如下:
FTP 客户端 ---- 指令 -->> FTP 服务端
FTP 客户端 <<-- 数据 ---- FTP 服务端
FTP 传输方式【了解】
FTP的传输有两种方式:ASCII、二进制
ASCII传输方式
假定用户正在拷贝的文件包含的简单ASCII
码文本,如果在远程机器上运行的不是UNIX
,当文件传输时会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用 binary
命令告诉ftp
逐字拷贝。
二进制传输模式
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)
FTP 传输模式
FTP 传输模式有两种:
- Standard (PORT,主动方式):服务端通过
20
端口主动向客户端连接,传输数据。 - Passive (PASV,被动方式):服务端启动随机端口,等待客户端发起连接,进行数据传输。
PORT 模式(常用)
FTP 客户端首先和服务器的TCP 21端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。
POSV 模式
建立控制通道和Standard模式类似,但建立连接后发送Pasv命令。服务器收到Pasv命令后,打开一个临时端口(端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口传送数据。
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。
FTP 服务部署
本文选择用 vsFTPd
作为 FTP
服务器,vsFTPd
(Very Secure File Transfer Protocol Daemon
,非常安全的文件传输协议守护程序),vsFTPd
提供 chroot
功能,极大得提升了安全性。
准备工作
本文环境在未特殊声明时默认为 CentOS 7.5
关闭 firewalld
[root@domain ~]# systemctl stop firewalld
[root@domain ~]# systemctl disable firewalld
关闭 SELinux
[root@domain ~]# sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
[root@domain ~]# setenforce 0
[root@domain ~]# getenforce
Disabled
登入失败原因(了解)
若未关闭 SELinux
,但登录时未提示密码错误,但是无法显示文件结构,可能是 SELinux
限制导致的。请按以下内容配置:
[root@domain ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off <== 注意此处的值
[root@domain ~]# setsebool -P ftp_home_dir=1
小贴士:可以将有关ftp
的项目全部设置为on
以防出现问题。
安装 vsftpd
服务
[root@domain ~]# yum install vsftpd libdb-utils -y
注意:vsftpd
包不在base
源中,在epel
源中,配置仓库源在此不再复述。
配置 vsftpd
详解
默认全局配置文件位于 /etc/vsftpd/vsftpd.conf
查看默认配置
[root@domain ~]# grep -v "^#" /etc/vsftpd/vsftpd.conf
# 第一部分,与匿名用户相关的配置(启用)
anonymous_enable=YES
# 第二部分,与实体用户相关的配置(启用,可写,且补码为 002)
local_enable=YES
write_enable=YES
local_umask=022
# 第三部分,服务相关配置
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
注意: 默认使用匿名用户访问时,共享目录为 /var/ftp
且仅拥有浏览及下载权限。
配置欢迎信息
可以配置当登入服务时显示提示信息,修改配置文件:(文件需自行建立,可自定名称)
banner_file=/etc/vsftpd/welcome.txt
例如:
[root@domain ~]# vim /etc/vsftpd/welcome.txt
欢迎光临本站,本站提供免费下载服务!
若发现问题,请联系站长!
主要目录为:
GNU 提供 GNU 相关软件下载
SRC 提供常用软件的源码下载
DOC 提供相关说明文档下载
测试:
[root@test ~]# ftp 10.0.0.7
Connected to 10.0.0.7 (10.0.0.7).
220-欢迎光临本站,本站提供免费下载服务!
220-若发现问题,请联系站长!
220-主要目录为:
220-GNU 提供 GNU 相关软件下载
220-SRC 提供常用软件的源码下载
220-DOC 提供相关说明文档下载
220
Name (10.0.0.7:root):
小贴士:可在此文件中写入每个文件夹中存放的内容或说明分类方法,以便使用者分辨。
限制登入账户
限制相关文件有以下两个(默认情况下两个文件内容一致)
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
小贴士:推荐将虚拟用户及权限过高的用户全部禁用,以保证安全。
限制用户带宽
若不希望用户占用全部带宽进行上传和下载,则可以对带宽占用进行限制。
编辑配置文件以下内容(默认单位 bytes/second
,此值约为 1 Mb/s
):
local_max_rate=1000000
限制在线人数
若服务器的带宽及配置一般,无法承载大量用户同时访问下载,则需要配置此参数。
编辑配置文件以下内容:
max_clients=10
max_per_ip=1
解释:以上配置限制最多 10 个 IP 连接,且每个 IP 最多建立一个 FTP 连接。
用户相关说明
匿名用户部分:
匿名用户为anonymous
此用户为服务内置用户,无需手动建立。对应系统内的ftp
用户。
默认目录为/var/ftp/
实体用户部分:
实体用户则为/etc/passwd
文件内的用户,并需要去除前面提到的禁止使用的用户后剩下的用户。
默认目录为 用户的家目录
允许匿名用户上传/下载/建立文件夹(不推荐的操作)
[root@domain ~]# vim /etc/vsftpd/vsftpd.conf
# 加入以下内容
write_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
[root@domain ~]# mkdir /var/ftp/uploads
[root@domain ~]# chown ftp /var/ftp/uploads
配置安全连接
检查 vsftpd
是否支持 SSL
模块(如无输出内容则不支持,需要手动编译安装)
[root@domain ~]# ldd $(which vsftpd) | grep ssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007f6e73115000)
创建认证证书(若已经有申请的正规证书,则直接使用即可)
[root@domain ~]# cd /etc/pki/tls/certs
[root@domain certs]# make vsftpd.pem
[root@domain certs]# cp -a vsftpd.pem /etc/vsftpd/
[root@domain certs]# ll /etc/vsftpd/vsftpd.pem
注意:证书权限必须为 0600
。
修改配置文件,加入以下内容:
ssl_enable=YES # 实体用户是否使用SSL
allow_anon_ssl=YES # 匿名用户是否使用SSL
force_local_data_ssl=YES # 强制实体用户加密传输数据
force_local_logins_ssl=YES # 强制登入用户加密传输
ssl_tlsv1=YES # 加密类型(根据证书种类选择)
ssl_sslv2=NO # 系统生成的证书不支持以下两种
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem # 证书文件路径
附件:更详细的配置文件说明
listen=<YES/NO> :设置为YES时vsftpd以独立运行方式启动,设置为NO时以xinetd方式启动(xinetd是管理守护进程的,将服务集中管理,可以减少大量服务的资源消耗)
listen_port=<port> :设置控制连接的监听端口号,默认为21
listen_address=<ip address> :将在绑定到指定IP地址运行,适合多网卡
connect_from_port_20=<YES/NO> :若为YES,则强迫FTP-DATA的数据传送使用port 20,默认YES
pasv_enable=<YES/NO> :是否使用被动模式的数据连接,如果客户机在防火墙后,请开启为YES
pasv_min_port=<n>
pasv_max_port=<m> :设置被动模式后的数据连接端口范围在n和m之间,建议为50000-60000端口
message_file=<filename> :设置使用者进入某个目录时显示的文件内容,默认为 .message
dirmessage_enable=<YES/NO> :设置使用者进入某个目录时是否显示由message_file指定的文件内容
ftpd_banner=<message> :设置用户连接服务器后的显示信息,就是欢迎信息
banner_file=<filename> :设置用户连接服务器后的显示信息存放在指定的filename文件中
connect_timeout=<n> :如果客户机连接服务器超过N秒,则强制断线,默认60
accept_timeout=<n> :当使用者以被动模式进行数据传输时,服务器发出passive port指令等待客户机超过N秒,则强制断线,默认60
accept_connection_timeout=<n> :设置空闲的数据连接在N秒后中断,默认120
data_connection_timeout=<n> : 设置空闲的用户会话在N秒后中断,默认300
max_clients=<n> : 在独立启动时限制服务器的连接数,0表示无限制
max_per_ip=<n> :在独立启动时限制客户机每IP的连接数,0表示无限制(不知道是否跟多线程下载有没干系)
local_enable=<YES/NO> :设置是否支持本地用户帐号访问
guest_enable=<YES/NO> :设置是否支持虚拟用户帐号访问
write_enable=<YES/NO> :是否开放本地用户的写权限
local_umask=<nnn> :设置本地用户上传的文件的生成掩码,默认为077
local_max_rate<n> :设置本地用户最大的传输速率,单位为bytes/sec,值为0表示不限制
local_root=<file> :设置本地用户登陆后的目录,默认为本地用户的主目录
chroot_local_user=<YES/NO> :当为YES时,所有本地用户可以执行chroot
chroot_list_enable=<YES/NO>
chroot_list_file=<filename> :当chroot_local_user=NO 且 chroot_list_enable=YES时,只有filename文件指定的用户可以执行chroot
anonymous_enable=<YES/NO> :设置是否支持匿名用户访问
anon_max_rate=<n> :设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制
anon_world_readable_only=<YES/NO> 是否开放匿名用户的浏览权限
anon_upload_enable=<YES/NO> 设置是否允许匿名用户上传
anon_mkdir_write_enable=<YES/NO> :设置是否允许匿名用户创建目录
anon_other_write_enable=<YES/NO> :设置是否允许匿名用户其他的写权限(注意,这个在安全上比较重要,一般不建议开,不过关闭会不支持续传)
anon_umask=<nnn> :设置匿名用户上传的文件的生成掩码,默认为077
anon_root=<file> :设置匿名用户登陆后的目录
guest_enable=<YES/NO> :设置是否启用虚拟用户
guest_username=<user> :虚拟用户对应的系统用户
user_config_dir=<file> :授权虚拟用户所在目录,默认使用/etc/vsftpd/ftplogin
配置及启动服务
设置开机自启动
[root@domain ~]# systemctl enable vsftpd
备份默认配置文件
[root@domain ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
按需修改配置文件
[root@domain ~]# vim /etc/vsftpd/vsftpd.conf
启动服务
[root@domain ~]# systemctl start vsftpd
检查端口
[root@domain ~]# ss -lntup | grep 22
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=901,fd=3))
tcp LISTEN 0 128 :::22 :::* users:(("sshd",pid=901,fd=4))
FTP 应用案例
某公司为了宣传最新的产品信息,计划搭建FTP服务器,为客户提供相关文档的下载。
对所有权互联网开放共享目录,允许下载产品信息,公司的合作单位能够使用FTP服务器进行上传和下载。
需求分析:
根据企业的需求,对于不同用户进行不同的权限限制,FTP服务器需要实现用户的审核。需考虑到服务器的安全性,所以关闭实体用户登录,使用虚拟帐号验证机制,并对不同虚拟帐号设置不同的权限。为了保证服务器的性能,还需要根据用户的等级,限制客户端的连接数及下载速度。
解决方案:
- 匿名用户允许下载我们公司的产品,但需要对其限速 50Kb
- 普通用户可以针对自己的目录进行上传和下载,对其限速 500Kb(虚拟用户)
- 管理用户,可以访问所有目录资源,并可以操作客户的目录,但不允许操作对外
- 根据不同的等级用户做不同的限速,限制客户端连接次数(5)
[root@ftp-server ~]# /data/ftp //manager用户能管理所有目录,但不能管理soft目录
manager
bgx //bgx普通用户仅能查看自己的文件和修改
soft //匿名用户仅能下载共享软件包
01.建立系统账户,供与虚拟账户使用
[root@ftp-server ~]# useradd virftp -s /sbin/nologin
02.创建对应目录,赋予权限
[root@ftp-server ~]#mkdir -p /data/ftp/{manager,bgx,soft}
[root@ftp-server ~]#chown -R virftp.virftp /data/ftp/{manager,bgx}
03.创建虚拟用户账户及密码
[root@ftp-server ~]# cat > /etc/vsftpd/vsftpd_login <<EOF
manager
manager
bgx
bgx
EOF
[root@ftp-server ~]# chmod 600 /etc/vsftpd/vsftpd_login
04.生成对应的库文件
[root@ftp-server ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db
05.修改密钥文件
[root@ftp-server ~]# vim /etc/pam.d/vsftpd
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
06.建立虚拟目录
[root@ftp-server ~]# mkdir /etc/vsftpd/vsftpd_user_conf
07.配置匿名用户权限并限速 100k ,关闭之前修改过的匿名上传和创建权限
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_root=/data/ftp/soft
anon_max_rate=100000
anon_upload_enable=NO
anon_mkdir_write_enable=NO
注意:匿名用户登陆默认目录,必须要和/etc/passwd
中的ftp
用户的默认宿主目录要一样,否则也会出错误!
08.配置管理用户,限速 2MB/s
[root@ftp-server ~]# cat > /etc/vsftpd/vsftpd_user_conf/manager <<'EOF'
local_root=/data/ftp/
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
anonymous_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
max_per_ip=5
local_max_rate=2000000
EOF
09.配置普通用户,限速 1MB/s
[root@ftp-server ~]# cat > /etc/vsftpd/vsftpd_user_conf/bgx <<'EOF'
local_root=/data/ftp/bgx
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
anonymous_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
max_per_ip=5
local_max_rate=1000000
EOF
10.配置文件尾部追加如下内容
[root@ftp-server ~]# cat >> /etc/vsftpd/vsftpd.conf <<'EOF'
chroot_local_user=YES
guest_enable=YES
guest_username=virftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
EOF
11.使用客户端验证权限即可
附录
参考链接
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2018-07-27 13:33 PM