Linux 运维手册之 FTP 文件传输协议
后知后觉 暂无评论

FTPFile Transfer Protocol,文件传输协议) 是一种在互联网上进行文件传输的协议,用于在因特网上控制文件的双向传输。

FTP 服务简介

FTP 简称“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

FTP 默认使用 TCP 端口 2021

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 传输模式有两种:

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 服务器,vsFTPdVery 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): 
小贴士:可在此文件中写入每个文件夹中存放的内容或说明分类方法,以便使用者分辨。

限制登入账户

限制相关文件有以下两个(默认情况下两个文件内容一致)

小贴士:推荐将虚拟用户及权限过高的用户全部禁用,以保证安全。

限制用户带宽

若不希望用户占用全部带宽进行上传和下载,则可以对带宽占用进行限制。
编辑配置文件以下内容(默认单位 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服务器需要实现用户的审核。需考虑到服务器的安全性,所以关闭实体用户登录,使用虚拟帐号验证机制,并对不同虚拟帐号设置不同的权限。为了保证服务器的性能,还需要根据用户的等级,限制客户端的连接数及下载速度。

解决方案:

[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.使用客户端验证权限即可


附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。