1. 引言
2. FTP的工作原理
基本工作机制
- 命令连接是FTP客户端和服务器之间建立的第一个连接,主要用于传输FTP命令和响应。
- 客户端通过命令连接向服务器发送FTP命令,如登录、列出目录、更改工作目录等。
- 命令连接通常使用TCP端口21。
- 数据连接是在命令连接的基础上,根据需要动态建立的,用于实际的文件传输。
- 文件的上传和下载都是通过数据连接完成的。
- 数据连接可以在主动模式(PORT命令)或被动模式(PASV命令)下建立。
工作在TCP/IP协议簇中
- FTP协议工作在TCP/IP协议簇的应用层,使用TCP协议作为其传输协议。这是因为TCP提供了可靠的、面向连接的服务,确保了文件传输的完整性和可靠性。
- 与UDP相比,TCP通过三次握手建立连接,使用序列号和确认应答机制来保证数据包的正确顺序和重传机制,从而提高了文件传输的共享性和可靠性。
C/S模式的工作方式
- 在FTP的C/S模式下,服务器负责响应客户端的请求,处理文件的存储和访问。
- 客户端通过发送FTP命令来请求服务,如文件上传、下载、删除等操作。
- 服务器在接收到命令后,通过数据连接执行相应的文件传输或管理任务,并通过命令连接返回执行结果。
3. FTP的传输模式
文本模式(ASCII模式)
- 特点:
- 在传输过程中,FTP客户端和服务器可能会根据操作系统的差异,对行结束符进行转换。例如,将Unix系统的LF转换为Windows系统的CRLF。
- ASCII模式适用于传输纯文本文件,如.txt、.html或。php等。
- 适用场景:
- 当需要在不同操作系统平台之间传输文本文件时,使用ASCII模式可以避免因行结束符差异导致的问题。
- 在传输编码格式为ASCII的源代码文件时,也推荐使用ASCII模式。
二进制模式(Binary模式)
- 特点:
- 二进制模式保证了文件的原始性和完整性,传输过程中不会对文件内容进行任何修改。
- 适用于所有非文本文件的传输,确保文件在源端和目标端完全一致。
- 适用场景:
- 当需要传输图像、音频、视频、可执行文件或任何其他二进制文件时,应选择二进制模式。
- 在进行备份或迁移工作时,为了确保文件的完整性,也应使用二进制模式传输所有文件。
模式选择的重要性
因此,在进行FTP文件传输时,用户和管理员需要根据文件的类型和内容,以及操作系统的特性,明智地选择合适的传输模式。这不仅关系到文件传输的效率,更关系到文件内容的准确性和完整性。
4. FTP的连接模式
主动模式(Active Mode)
- 特点:
- 服务器主动建立数据连接。
- 客户端必须允许入站连接,这在客户端位于防火墙或NAT后时可能会导致问题。
- 适用场景:
- 当客户端可以接受入站连接,且服务器能够直接访问客户端时,主动模式是可行的选择。
- 在没有复杂网络设备阻碍服务器访问客户端的情况下,主动模式通常工作良好。
被动模式(Passive Mode)
- 特点:
- 客户端主动建立数据连接。
- 服务器必须允许入站连接到随机端口,这通常需要在服务器的防火墙上进行配置。
- 适用场景:
- 当客户端位于防火墙或NAT后,无法接受入站连接时,被动模式是首选。
- 在客户端无法预测服务器将使用哪个端口进行连接时,被动模式提供了一种灵活的解决方案。
连接模式的选择
- 网络设备配置:确保FTP服务器的防火墙允许入站连接到适当的端口(被动模式下的随机端口或主动模式下的端口20)。
- 客户端软件:大多数现代FTP客户端软件默认使用被动模式,并提供选项切换到主动模式。
5. 在Linux中配置FTP服务器(以CentOS 7为例)
安装VSFTPD
1. 打开终端,运行以下命令以确保所有系统包都是最新的。
[root@localhost ~]# yum update
已加载插件:fastestmirror
Determining fastest mirrors
c7-media | 3.6 kB 00:00:00
No packages marked for update
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# systemctl enable vsftpd
[root@localhost ~]# firewall-cmd --zone=public --permanent --add-service=ftp
[root@localhost ~]# firewall-cmd --reload
配置VSFTPD
[root@localhost vsftpd]# cd /etc/vsftpd/
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf.bf
在配置文件中,可以设置如下选项:
anonymous_enable=NO
:禁止匿名用户登录。local_enable=YES
:允许本地用户登录。write_enable=YES
:允许用户上传文件。chroot_local_user=YES
:将用户限制在其主目录中。pasv_enable=YES
:启用被动模式。pasv_min_port=40000
:设置被动模式端口范围的最小值。pasv_max_port=50000
:设置被动模式端口范围的最大值。
[root@localhost vsftpd]# systemctl restart vsftpd
6. 用户登录方式
普通本地用户模式
[root@localhost ~]# useradd zhangsan
[root@localhost ~]# passwd zhangsan
[root@localhost ftp]# cd /home/zhangsan/
[root@localhost ftp]# mkdir ftp
[root@localhost ftp]# chown nobody:nobody /home/zhangsan/ftp/
[root@localhost ftp]# chmod a-w /home/zhangsan/ftp/
备注:修改目录的权限,确保所有用户(包括所有者、所属组的成员以及其他用户)都不能写入该目录。
[root@localhost ftp]# cd /home/zhangsan/ftp/
[root@localhost ftp]# mkdir file
[root@localhost ftp]# chown zhangsan:zhangsan /home/zhangsan/ftp/file/
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
[root@localhost vsftpd]# systemctl restart vsftpd
虚拟用户模式
[root@localhost ~]# yum -y install db4-utils db4
[root@localhost vsftpd]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vstpuser.txt
在文件中添加虚拟用户信息,每个用户两行,用户名和密码分开
[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
备注:这个命令是将文本文件 vftpuser.txt转换成Berkeley DB格式的数据库文件
vftpuser.db。这个数据库文件将被 VSFTPD 服务用于虚拟用户的认证。
[root@localhost vsftpd]# chmod 600 /etc/vsftpd/vftpuser.db
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vftpuser
account required pam_userdb.so db=/etc/vsftpd/vftpuser
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES //启用虚拟用户(guest)模式。
guest_username=ftpuser //指定当虚拟用户登录时,实际上是以哪个本地用户(在这个里是ftpuser)的身份运行。这意味着虚拟用户将拥有ftpuser用户的权限。
pam_service_name=vsftpd //指定PAM服务的名称,VSFTPD将使用这个PAM服务来认证虚拟用户。通常这个值与VSFTPD的配置文件名相同。
user_sub_token=$USER //这告诉VSFTPD在 local_root 配置中将 $USER 替换为当前登录的虚拟用户的用户名。
local_root=/home/ftpuser/ftp/$USER //设置虚拟用户的FTP根目录。$USER 会被替换为虚拟用户的用户名,这样每个用户都会有自己的根目录
[root@localhost vsftpd]# systemctl restart vsftpd
匿名用户模式
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_root=/var/ftp/pub
[root@localhost vsftpd]# cd /var/ftp/
[root@localhost vsftpd]# mkdir /var/ftp/pub
[root@localhost ftp]# chown ftp:ftp /var/ftp/pub/
[root@localhost vsftpd]# systemctl restart vsftpd