FTP是什么
是一种文件传输协议是一种用于在网络上进行文件传输的标准协议。它允许用户通过网络从一个计算机向另一个计算机传输文件。FTP 是互联网早期的基本协议之一,提供了一种可靠、简单的方式来共享文件。采用c/s模式
控制端口:21
数据端口:20
FTP协议的工作原理
主动链接
FTP客户端从任意一个非特权端口N(N>1024)发送PORT命令给FTP服务端控制端口21,
其中PORT命令包含客户端接收数据的端口N+1,此时服务器收到了这条PORT命令,
它就会让自己的数据端口20与客户端的数据端口N+1连接。此时如果传输数据的话,
就需要服务端与客户端重新建立一个新的连接来传输数据。
用白话来说就是:客户端给服务端的21控制端口发命令说,我要下载什么什么,并且还会说我已经打开了自己的某个端口,你就从这里把东西给我吧,服务器知道后就会连接客户端已打开的那个数据端口把东西传给客户端,这就是主动模式,可以理解为服务端主动给客户端传输文件
被动连接
FTP客户端从任意一个非特权端口N(N>1024)发送PASV命令给FTP服务端控制端口21,
其中PASV命令包含客户端接收数据的端口N+1,此时服务端会随机开启一个
高端端口P(P>1024),并发送PORT命令给客户端,PORT命令包括服务端的数据端口P,
然后客户端从数据端口N+1发起一个请求连接服务端数据端口P,这时产生了数据连接。
使用被动模式就不需要服务端与客户端重新建立一个新的连接来传输数据。
白话:客户端给服务器端的21端口发命令说,我要下载什么什么,服务端知道后,就打开一个空闲的端口,然后告诉客户端,我已经打开了某某端口,你自己进去拿吧。于是客户端就从那个端口进去拿文件了,这就是被动模式,可以理解为服务端被客户端拿走了东西
配置ftp服务
服务器
安装软件包
[root@node1 ~]# yum -y install vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
匿名用户的主目录:/var/ftp/
匿名用户的下载目录:/var/ftp/pub/
配置文件: /etc/vsftpd/vsftpd.conf
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用户均不受限。
客服端,安装ftp软件包
[root@node2 ~]# yum -y install lftp
示例
匿名用户
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
2
设置允许匿名用户访问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>
3
设置允许匿名用户访问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>
4
设置允许匿名用户访问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
FTP用户
创建三个ftp用户user1,user2,user3
在user1家目录下创建一个file123
测试
1
通过FTP用户访问FTP服务器时,默认访问的主目录为FTP用户家目录
lftp 192.168.100.10:/pub> user user1
Password:
lftp user1@192.168.100.10:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp user1@192.168.100.10:~>
2
设置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 user1@192.168.100.10:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp user1@192.168.100.10:/> cd .. // 此时已经不能退出去了
lftp user1@192.168.100.10:/> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp user1@192.168.100.10:/>
3
设置FTP用户访问FTP服务器时,将部分FTP用户访问的目录限制在自己的主目录中,
其他FTP用户仍然可以访问其他目录
如果限制user1和user2用户访问的目录限制在自己的家目录中,user3可以访问其他目录
修改配置文件
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
更改/etc/vsftpd/chroot_list FTP用户列表文件
user1
user2
测试
lftp 192.168.100.10:~> user user1
Password:
lftp user1@192.168.100.10:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123
lftp user1@192.168.100.10:/> cd ..
lftp user1@192.168.100.10:/> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:22 user123 // user1没有退出
lftp user1@192.168.100.10:/> user user2
Password:
lftp user2@192.168.100.10:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:44 1234
lftp user2@192.168.100.10:/> cd ..
lftp user2@192.168.100.10:/> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:44 1234 // user2没有退出
lftp user2@192.168.100.10:/> user user3
Password:
lftp user3@192.168.100.10:~> ls
-rw-r--r-- 1 0 0 0 Jul 23 01:45 user321
lftp user3@192.168.100.10:~> cd ..
cd ok, cwd=/home // user3可以退出
lftp user3@192.168.100.10:/home>
ps:
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用户均不受限