一、简介
FTP:文件传输协议(File Transfer Protocol 简称FTP),采用c/s模式工作。
控制端口:21
数据端口:20
FTP工作原理:
1、主动模式 standard
FTP客户端从任意一个非特权端口N(N>1024)发送PORT命令给FTP服务端控制端口21,
其中PORT命令包含客户端接收数据的端口N+1,此时服务器收到了这条PORT命令,
它就会让自己的数据端口20与客户端的数据端口N+1连接。此时如果传输数据的话,
就需要服务端与客户端重新建立一个新的连接来传输数据。
2、被动模式 passive
FTP客户端从任意一个非特权端口N(N>1024)发送PASV命令给FTP服务端控制端口21,
其中PASV命令包含客户端接收数据的端口N+1,此时服务端会随机开启一个
高端端口P(P>1024),并发送PORT命令给客户端,PORT命令包括服务端的数据端口P,
然后客户端从数据端口N+1发起一个请求连接服务端数据端口P,这时产生了数据连接。
使用被动模式就不需要服务端与客户端重新建立一个新的连接来传输数据。
不同点:
传输数据的连接方式不同:主动模式是服务端向客户端发起数据连接,
而被动模式是客户端向服务端发起数据连接。
相同点:
都是使用21号控制端口进行用户验证和管理。
特点:
客户端-服务器架构:FTP服务通常由一个服务器端和一个或多个客户端组成。服务器端负责存储文件,而客户端则用于请求和接收这些文件。
两个端口:FTP协议使用两个端口,一个用于命令传输(通常是端口21),另一个用于数据传输(通常是端口20)。命令端口用于发送和接收FTP命令,而数据端口用于实际的数据传输。
匿名访问:FTP允许匿名访问,这意味着用户可以不提供任何身份验证信息即可访问FTP服务器上的某些公共文件。
文件传输模式:FTP支持两种文件传输模式:ASCII模式和二进制模式。ASCII模式用于文本文件,而二进制模式用于非文本文件,如图像和程序文件。
目录列表:FTP服务器可以提供一个目录列表,显示服务器上可用的文件和目录,方便用户浏览和选择要下载的文件。
多线程支持:一些FTP客户端支持多线程下载,这意味着可以同时从服务器下载多个文件,提高了下载效率。
安全性:FTP协议本身不提供加密,因此传输的数据可能被截获。为了提高安全性,可以使用SFTP(SSH File Transfer Protocol)或FTPS(FTP Secure),它们在FTP的基础上增加了加密功能。
跨平台:FTP是一个跨平台的协议,可以在不同的操作系统之间传输文件,如Windows、Linux、macOS等。
简单易用:FTP协议的使用相对简单,用户可以通过图形界面的FTP客户端或命令行工具来访问FTP服务器。
广泛的支持:几乎所有的网络操作系统都支持FTP协议,使得FTP成为文件传输的通用标准。
二、FTP服务的配置文件和部署
1、安装FTP服务所需的软件包
[root@node1 ~]# yum -y install vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
匿名用户的主目录:/var/ftp/
匿名用户的下载目录:/var/ftp/pub/
2、主配置文件/etc/vsftpd/vsftpd.conf解释
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO ------控制匿名用户访问权限,YES表示允许匿名访问FTP服务器。
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dirlocal_enable=YES ---控制FTP用户是否可以访问FTP服务器,YES表示允许FTP用户访问FTP服务,同时当selinux处于enforcing状态时,需要调整ftp_home_dir的bool值。(但是从RHEL7上安装vsftpd3.0版本后,就是没有ftp_home_dir这个bool值了,所以就不需要修改此bool值)
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES ----控制FTP用户对FTP服务器的可写权限,YES表示可写。
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022 ----FTP用户创建目录或文件时的umask值
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
#anon_upload_enable=YES ----控制匿名用户上传文件的权限,YES表示允许匿名用户上传文件。当selinux处于enforcing状态时,需要调整ftpd_anon_write和ftpd_full_access的bool值。
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES ---控制匿名用户创建目录的权限,YES表示允许匿名用户创建目录
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES ---显示说明性文件
#
# Activate logging of uploads/downloads.
xferlog_enable=YES ---控制文件在传输过程中是否被日志记录,YES表示记录
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES ----强制使用20端口进行数据传输
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES --设置为YES时,默认匿名用户上传文件的所有者为FTP
#chown_username=whoever ---whoever修改为ftp用户,匿名用户上传文件的所有者将变成该FTP用户。
#
# You may override where the log file goes if you like. The default is shown
# below.
#xferlog_file=/var/log/xferlog ---设置FTP服务日志文件位置
#
# If you want, you can have your log file in standard ftpd xferlog format
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=YES ---设置标准的FTP Xferlog模式
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600 ---控制连接超过600秒空闲时,自动断开连接
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120 ---控制数据连接建立后120秒内无交互时,自动断开连接。
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure ---非特权状态下使用ftpsecure用户
You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service. ---成功连接FTP服务器时的提示语
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES ---禁止下载文件到指定的邮箱地址中
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails ---设置电子邮箱地址
# the user does not have write access to the top level directory within the
# chroot)
#chroot_local_user=YES ---控制FTP用户能否离开自己的FTP主目录,
YES表示禁止FTP用户离开自己的FTP主目录。
#chroot_list_enable=YES ---控制列表中的FTP用户能否离开自己的FTP主目录,
YES表示禁止列表中的FTP用户离开自己的FTP主目录。默认是允许
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list ---FTP用户列表文件,每一行一个用户名
#ls_recurse_enable=YES ---控制FTP用户是否能使用类似 ls -R命令,
默认是禁止的,YES表示允许使用
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=NO ---控制是否侦听ipv4套接字,NO表示不侦听ipv4套接字,
不能同时设置侦听ipv4和ipv6套接字
listen_ipv6=YES --控制是否侦听ipv6套接字,YES表示侦听ipv6套接字,
默认情况下侦听ipv6的任意地址,此时能够接受来自客户端ipv6的连接和ipv4的连接
pam_service_name=vsftpd ---设置PAM认证文件的名称
userlist_enable=YES ---控制是否启动/etc/vsftpd/user_list文件,YES表示启动
tcp_wrappers=YES ---控制是否启用/etc/hosts.allow和/etc/hosts.deny配置文件
管理网络主机对FTP服务的访问,YES表示启用。
3、配置文件主要功能解释:
anonymous_enable=NO # 禁止匿名用户访问FTP服务器。
local_enable=YES # 允许本地用户(linux系统用户)通过其用户名登录FTP服务器。
write_enable=YES # 允许FTP用户在服务器上写入文件。
local_umask=022 # 设置新创建文件的权限,通常用于确保文件有适当的权限。
anon_upload_enable=YES # 控制匿名用户上传文件的权限,YES表示允许匿名用户上传文件
dirmessage_enable=YES # 允许用户在进入新目录时显示目录消息
connect_from_port_20=YES:使用端口20作为数据连接的源端口。
#chroot_local_user=YES # 控制FTP用户能否离开自己的FTP主目录,
YES表示禁止FTP用户离开自己的FTP主目录。
#chroot_list_enable=YES # 控制列表中的FTP用户能否离开自己的FTP主目录,
YES表示禁止列表中的FTP用户离开自己的FTP主目录。默认是允许
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list # FTP用户列表文件,每一行一个用户名
chroot_local_enable=YES时:
chroot_list_enable=YES 代表/etc/vsftpd/chroot_list文件中定义的FTP用户不受限,
其他的ftp用户受限
chroot_list_enable=NO 代表所有的FTP用户受限
chroot_local_enable=NO时:
chroot_list_enable=YES 代表只限制/etc/vsftpd/chroot_list文件中定义的FTP用户
chroot_list_enable=NO 所有的FTP用户均不受限。
三、示例
1、匿名用户
先打开服务端配置文件中的匿名访问,启动ftp服务
anonymous_enable=YES
使用客服端匿名访问服务端,此时只能下载,不能上传
[root@node2 ~]# lftp 192.168.100.10
lftp 192.168.100.10:~> ls
drwxr-xr-x 2 0 0 19 Jul 22 11:04 pub
lftp 192.168.100.10:/> cd pub/
lftp 192.168.100.10:/pub> ls
-rw-r--r-- 1 0 0 0 Jul 22 11:04 file1
lftp 192.168.100.10:/pub> get file1 // 默认只允许下载
lftp 192.168.100.10:/pub> exit
[root@node2 ~]# ls
anaconda-ks.cfg file1
设置允许匿名用户访问FTP服务器时能够在/var/ftp/pub目录下进行文件上传
打开服务端的配置文件修改
anon_upload_enable=YES # 匿名上传
修改/var/ftp/pub目录权限
setfacl -m u:ftp:rwx /var/ftp/pub/
重启服务
客服端上传文件
[root@node2 ~]# lftp 192.168.100.10
lftp 192.168.100.10:~> cd pub/
lftp 192.168.100.10:/pub> ls
-rw-r--r-- 1 0 0 0 Jul 22 11:04 file1
lftp 192.168.100.10:/pub> put file2
lftp 192.168.100.10:/pub> ls
-rw-r--r-- 1 0 0 0 Jul 22 11:04 file1
-rw------- 1 14 50 0 Jul 22 11:20 file2
lftp 192.168.100.10:/pub>
设置允许匿名用户访问FTP服务器时能够在/var/ftp/pub目录下创建目录
修改配置文件,重启服务
write_enable=YES
anon_mkdir_write_enable=YES
测试
[root@node2 ~]# lftp 192.168.100.10
lftp 192.168.100.10:~> cd pub/
lftp 192.168.100.10:/pub> mkdir file3
mkdir ok, `file3' created
lftp 192.168.100.10:/pub> ls
-rw-r--r-- 1 0 0 0 Jul 22 11:04 file1
-rw------- 1 14 50 0 Jul 22 11:20 file2
drwx------ 2 14 50 6 Jul 22 11:24 file3
lftp 192.168.100.10:/pub>
设置允许匿名用户访问FTP服务器时能够对/var/ftp/pub目录中的文件或目录进行重命名或删除操作
修改配置文件
anon_other_write_enable=YES
测试
[root@node2 ~]# lftp 192.168.100.10
lftp 192.168.100.10:~> cd pub/
lftp 192.168.100.10:/pub> ls
-rw-r--r-- 1 0 0 0 Jul 22 11:04 file1
-rw------- 1 14 50 0 Jul 22 11:20 file2
drwx------ 2 14 50 6 Jul 22 11:24 file3
lftp 192.168.100.10:/pub> rm -rf file1
rm ok, `file1' removed
lftp 192.168.100.10:/pub> ls
-rw------- 1 14 50 0 Jul 22 11:20 file2
drwx------ 2 14 50 6 Jul 22 11:24 file3
2、FTP用户
创建三个ftp用户user1,user2,user3,在user1家目录下创建一个file123
通过FTP用户访问FTP服务器时,默认访问的主目录为FTP用户家目录
lftp 192.168.100.10:/pub> user user1
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp [email protected]:~>
设置FTP用户访问FTP服务器时,将所有FTP用户访问的目录限制在自己的主目录中,不允许FTP用户访问其他目录( FTP用户对自己的家目录不能有写入的权限)
更改配置文件
chroot_local_user=YES
allow_writeable_chroot=YES # 插入在配置文件任何地方都可以
测试
[root@node2 ~]# lftp 192.168.100.10
lftp 192.168.100.10:~> user user1
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp [email protected]:/> cd .. // 此时已经不能退出去了
lftp [email protected]:/> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp [email protected]:/>
设置FTP用户访问FTP服务器时,将部分FTP用户访问的目录限制在自己的主目录中,其他FTP用户仍然可以访问其他目录。
如果限制user1和user2用户访问的目录限制在自己的家目录中,user3可以访问其他目录
修改配置文件
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
更改/etc/vsftpd/chroot_list FTP用户列表文件
[root@node1 ~]# cat /etc/vsftpd/chroot_list
user1
user2
测试
lftp 192.168.100.10:~> user user1
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp [email protected]:/> cd ..
lftp [email protected]:/> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123 # user1没有退出
lftp [email protected]:/> user user2
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:44 1234
lftp [email protected]:/> cd ..
lftp [email protected]:/> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:44 1234 # user2没有退出
lftp [email protected]:/> user user3
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:45 user321
lftp [email protected]:~> cd ..
cd ok, cwd=/home # user3可以退出
lftp [email protected]:/home>
3、需要注意的是
chroot_local_enable=YES时:
chroot_list_enable=YES 代表/etc/vsftpd/chroot_list文件中定义的FTP用户不受限,其他的ftp用户受限
chroot_list_enable=NO 代表所有的FTP用户受限
chroot_local_enable=NO时:
chroot_list_enable=YES 代表只限制/etc/vsftpd/chroot_list文件中定义的FTP用户
chroot_list_enable=NO 所有的FTP用户均不受限