1、FTP简介
FTP(File Transfer Protocol) :是一种处于应用层的用于文件传输的协议。FTP客户端和FTP服务器之间的通信使用TCP/IP协议族。它规定了客户端和服务器之间的通信格式和命令集,包括用户认证、文件传输、文件名和目录信息等,允许用户在远程计算机上上传和下载文件。FTP协议的客户端可以是任何支持FTP协议的程序,例如Windows系统中的FileZilla、Mac OS系统中的Cyberduck、Linux系统中的vsftpd等。
FTP协议的工作原理:FTP协议的工作原理是客户端向服务器发送命令,服务器响应这些命令,并完成文件传输。
FTP协议的安全性:FTP协议是一种非安全的文件传输协议,因为它不使用加密技术来保护文件传输的安全性。这意味着,如果FTP服务器没有得到适当的保护,那么它的文件可能会被未经授权的用户访问或修改。因此,在使用FTP协议时,应确保FTP服务器和客户端都得到了适当的保护,例如使用防火墙和加密技术等。
FTP协议的服务器通常运行在Unix或Linux系统中,例如Apache的vsftpd、ProFTPD等。
1.1 FTP端口
FTP服务端默认使用的端口号为20和21,其中20是数据端口,21是命令端口。
命令端口:FTP服务端监听21端口号来等待控制连接建立,客户端有一个Socket用来连接FTP服务器的端口,21端口负责FTP命令的发送和接收返回的响应信息,只需要很小的网络带宽。建立控制连接时,服务端会验证客户身份,决定是否建立数据连接;当需要目录列表、传输文件时,建立数据连接,并且每次客户端都是用不同的端口号来建立数据连接;在数据连接存在期间,控制连接必须存在,一旦控制连接断开,数据连接会自动关闭;数据传输完毕,会中断这条临时的数据连接。在FTP连接期间,控制连接始终保持连接状态。
数据端口:FTP服务端监听20端口来等待数据连接,依赖于控制连接(必须先建立控制连接)、连接方式
1.2 连接模式
主动连接:
1、FTP客户端向FTP服务器发送PORT命令:FTP客户端(N端口 >= 1024)向FTP服务器发送一个PORT命令(21),告诉服务器本地的数据端口(N+1)。
2、FTP服务器响应PORT命令:FTP服务器收到PORT命令后,会响应一个端口号(20),将这个端口号告诉FTP客户端,并将其作为数据传输的源端口。
3、FTP服务器打开数据连接:FTP服务器的数据连接端口(20)打开一个连接到FTP客户端使用之前指定的端口号(N+1)。然后,进行数据传输。
被动连接:
1、FTP客户端向FTP服务器发送PASV命令:FTP客户端(N端口 >= 1024)向FTP服务器发送一个PASV命令(21),告诉服务器本地的数据端口(N+1)。
2、FTP服务器响应PASV命令:FTP服务器收到PASV命令后,会响应一个端口号(P>= 1024)。将这个端口号告诉FTP客户端,并将其作为数据传输的目标端口。
3、FTP客户端打开数据连接:FTP客户端使用之前指定的端口号(N+1)打开一个连接到FTP服务器的数据连接(P)。然后,进行数据传输。
主动连接问题在于客户端,FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。在被动连接中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
1、安装vspd
sudo yum install vsftpd # Centos
sudo apt-get install vsftpd # Ubuntu
2、配置服务
服务文件:/usr/lib/systemd/system/vsftpd.service
配置文件: /etc/vsftpd/vsftpd.conf
FTP用户配置文件:
/etc/vsftpd/ftpusers 此文件中的用户禁止登录服务器(需要配置)
/etc/vsftpd/user_list 此文件中的用户允许登录服务器
日志文件:/etc/logrotate.d/vsftpd ( 默认日志文件路径)
服务器配置如下:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
connect_from_port_20=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
chroot_local_user=YES
local_root=/data
userlist_file=/etc/vsftpd/user_list
tcp_wrappers=YES
download_enable=YES
userlist_enable=NO
- anonymous_enable=NO:禁止匿名用户访问FTP服务器。
- local_enable=YES:允许本地用户(linux系统用户)通过其用户名登录FTP服务器。
- write_enable=YES:允许FTP用户在服务器上写入文件。
- local_umask=022:设置新创建文件的权限,通常用于确保文件有适当的权限。
- dirmessage_enable=YES:允许用户在进入新目录时显示目录消息。
- connect_from_port_20=YES:使用端口20作为数据连接的源端口。
- xferlog_enable=YES:启用传输日志记录功能。
- xferlog_file=/var/log/vsftpd.log:设置传输日志的文件路径。
- xferlog_std_format=YES:使用标准的传输日志格式。
- listen=NO:vsftpd将不会作为独立的服务运行,而是作为inetd或xinetd服务的一部分运行。
- listen_ipv6=YES:允许vsftpd监听IPv6连接。
- pam_service_name=vsftpd:使用Pluggable Authentication Modules (PAM)的配置名称。
- chroot_local_user=YES:将本地用户限制在其主目录中。
- local_root=/home:本地用户的根目录设置。
- userlist_file=/etc/vsftpd/user_list:包含允许访问FTP服务器的用户列表的文件路径。
- tcp_wrappers=YES:启用tcp-wrappers,用于网络访问控制。
- download_enable=YES:允许FTP用户下载文件。
3、编辑/etc/vsftpd/user_list文件,加入允许登录的用户:
若没有用户,需要useradd 创建用户(不建议使用root用户)。
useradd test1
userlist_deny和userlist_enable配置:默认情况下userlist_deny的值为YES,userlist_enable的值为NO。ftpusers 文件的优先级高于 user_list。如果一个用户同时出现在 ftpusers 和 user_list 文件中,那么该用户将被视为不允许访问 FTP 服务。
当userlist_enable=YES时,userlist_deny项的配置才有效,此时userlist_deny=YES表示user_list是一个黑名单,即所有出现在名单中的用户都会被拒绝登入;而userlist_deny=NO表示user_list是一个白名单,即只有出现在名单中的用户才会被准许登入。
配置 | 现象 |
---|---|
userlist_enable=YES | ftpusers 中用户允许访问user_list中用户允许访问 |
userlist_enable=NO | ftpusers 中用户禁止访问user_list中用户允许访问 |
userlist_deny=YES | ftpusers 中用户禁止访问(登录时可以看到密码输入提示,但仍无法访问)user_list中用户禁止访问 |
userlist_deny=NO | ftpusers 中用户禁止访问user_list中用户允许访问 |
userlist_enable=YES userlist_deny=YES | ftpusers 中用户禁止访问user_list中用户禁止访问(登录时不会出现密码提示,直接被服务器拒绝) |
userlist_enable=YES userlist_deny=NO | ftpusers 中用户禁止访问user_list中用户允许访问 |
4、匿名访问:
若想让所有人不进行认证也可访问FTP服务器,可配置匿名访问:
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
- anonymous_enable=YES:允许匿名用户登录
- local_enable=YES:也允许本地用户登录
- anon_upload_enable=YES:允许匿名用户上传文件
- anon_mkdir_write_enable=YES:允许匿名用户创建目录
配置文件部分参数:
参数 | 作用 |
---|---|
listen=NO | 是否以独立运行的方式监听服务 |
listen_address=ip地址 | 设置要监听的IP地址 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=YES | 是否允许下载文件 |
userlist_enable=YES | 设置用户列表为"允许" |
userlist_deny=YES | 设置用户列表为"禁止" |
xferlog_enable=YES | 是否记录日志 |
xferlog_file=xferlog_file | 日志路径 |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址的最大连接数,0为不限制 |
anonymous_enable=YES | 是否允许匿名用户访问 |
anon_upload_enable=YES | 是否允许匿名用户上传文件 |
anon_umask | 匿名用户上传文件的umask |
anon_root=/var/ftp | 匿名用户的ftp根目录 |
anon_mkdir_write_enable=YES | 是否允许匿名用户创建目录 |
anon_other_write_enable=YES | 是否开放匿名用户的其他写入权限(重命名、删除等) |
anon_max_rate=0 | 匿名用户的最大传输速率,0为不限制 |
local_enable=yes | 是否允许本地用户登录 |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/vat/ftp | 本地用户的ftp根目录 |
local_max_rate=0 | 本地用户的最大传输速率,0为不限制 |
chroot_local_user=YES | 是否将用户权限禁锢在ftp目录,以确保安全 |
tcp_wrappers=YES | 使用 tcp_wrappers 进行网络访问控制 |