FTP连接及传输模式
1. 控制连接:TCP21,用于发送FTP命令信息
2. 数据连接:TCP20,用于上传、下载数据
3. 数据连接的建立类型:
(1)主动模式:服务器制动发起数据连接
首先由客户端向服务端的21端口建立FTP控制连接。当需要传输数据时,客户端以PORT 命令告知服务区“我打开了某端口,你过来连接我”,预算服务器从20端口向客户端的该端口发送请求并建立数据连接。
(2)被动模式:服务器被动等待数据连接
如果客户端所在网络的防火墙禁止主动模式连接,通常回 使用被动模式。
首先由客户端向服务器的21端口建立FTP控制连接。当需要传输数据时,服务器以PASV命令告知客户端“我打开了某端口,你过来连接我”,于是客户端向服务器的该端口(非20)发送请求并建立数据连接。
4. 传输模式
在传输文件时,根据是否进行字符转换,分文文本模式和二进制模式。
(1)文本模式:又称ASCII(美国信息交换标准码模式)这种模式在传输文件时使用ASCII标准字符序列,一般只用于纯文本文件的传输。
(2)二进制模式:又称Binary模式,这种模式不会转换文件中的字符序列,更适合传输程序、图片等非纯文本字符的文件。
使用二进制模式比文本模式更有效率,大多数FTP客户端工具可以根据文件类型自动选择文件传输模式。
FTP用户类型
1. 匿名用户:用户名为ftp或anonymous,提供任意密码(包括空密码)都可以通过服务器的验证。一般用于公共文件的下载,如提供一些免费的软件、学习资料下载的站点。
2. 本地用户:直接使用本地的系统用户账号进行验证。
3. 虚拟用户:通过一份独立的用户数据库文件进行登录验证,将FTP账户与Linux系统账户的关联性降至最低,为系统提供更好的安全性。
搭建匿名访问的FTP服务
1. 安装FTP服务软件
```
[root@localhost ~]# rpm -qa | grep vsftpd
[root@localhost ~]# mount /dev/sr0 /media/cdrom
[root@localhost ~]# yum -y install vsftpd
```
2. 准备匿名FTP 访问的目录
```
[root@localhost ~]# cd /var/ftp/
[root@localhost ftp]# ll
total 4
drwxr-xr-x. 2 root root 4096 Jul 24 2015 pub
[root@localhost ftp]# chown ftp pub/
[root@localhost ftp]# ll
total 4
drwxr-xr-x. 2 ftp root 4096 Jul 24 2015 pub
```
3. 开放用户配置并启动vsftpd服务
```
[root@localhost ftp]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf.$(date +%F)
[root@localhost vsftpd]# ls
ftpusers vsftpd.conf vsftpd.conf.bak
user_list vsftpd.conf.2018-11-23 vsftpd_conf_migrate.sh
[root@localhost vsftpd]# vim vsftpd.conf
#全局配置
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_umask=022 #手动添加
anon_mkdir_write_enable=YES
anon_other_write_enable=YES #手动添加
[root@localhost vsftpd]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@localhost vsftpd]# ss -antup | grep vsftpd
tcp LISTEN 0 32 *:21 *:* users:(("vsftpd",1460,3))
```
4. 测试匿名FTP服务端
```
# ftp_server端
[root@localhost vsftpd]# cd /var/ftp/pub/
[root@localhost pub]# touch yyyy
# ftp_client端
[root@localhost ~]# which ftp
/usr/bin/which: no ftp in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
[root@localhost ~]# mount /dev/sr0 /media/cdrom
[root@localhost ~]# yum -y install ftp
[root@localhost ~]# which ftp
/usr/bin/ftp
[root@localhost ~]# ftp 192.168.214.157
Connected to 192.168.214.157 (192.168.214.157).
220 (vsFTPd 2.2.2)
Name (192.168.214.157:root): ftp #匿名用户账号为ftp
331 Please specify the password.
Password: #密码为空(回车)
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,214,157,245,215).
150 Here comes the directory listing.
drwxr-xr-x 2 14 0 4096 Nov 23 02:06 pub
226 Directory send OK.
ftp> ls pub
227 Entering Passive Mode (192,168,214,157,28,41).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 23 02:06 yyyy
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,214,157,21,129).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 23 02:06 yyyy
226 Directory send OK.
ftp> get yyyy # 下载文件
local: yyyy remote: yyyy
227 Entering Passive Mode (192,168,214,157,94,67).
150 Opening BINARY mode data connection for yyyy (0 bytes).
226 Transfer complete.
ftp> put anaconda-ks.cfg #上传文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,214,157,62,254).
150 Ok to send data.
226 Transfer complete.
1118 bytes sent in 0.000697 secs (1604.02 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,214,157,91,58).
150 Here comes the directory listing.
-rw-r--r-- 1 14 50 1118 Nov 23 02:13 anaconda-ks.cfg
-rw-r--r-- 1 0 0 0 Nov 23 02:06 yyyy
226 Directory send OK.
```
搭建本地用户验证的FTP服务
1. 创建本地用户
```
[root@localhost vsftpd]# useradd yunjisuan
[root@localhost vsftpd]# passwd yunjisuan
Changing password for user yunjisuan.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
```
2. 修改配置文件,重启FTP服务
```
[root@localhost pub]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers vsftpd.conf vsftpd_conf_migrate.sh
user_list vsftpd.conf.2018-11-23
[root@localhost vsftpd]# mv vsftpd.conf vsftpd.conf.anon
[root@localhost vsftpd]# cp vsftpd.conf.2018-11-23 vsftpd.conf
[root@localhost vsftpd]# vim vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
[root@localhost vsftpd]# /etc/init.d/vsftpd reload
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
```
3. 客户端测试
```
# ftp_server端
[root@localhost ~]# cd /home/yunjisuan/
[root@localhost yunjisuan]# touch 123
# ftp_client端
[root@localhost ~]# ftp 192.168.214.157
Connected to 192.168.214.157 (192.168.214.157).
220 (vsFTPd 2.2.2)
Name (192.168.214.157:root): yunjisuan
331 Please specify the password.
Password: # 密码为123456
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,214,157,75,75).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 23 02:45 123
226 Directory send OK.
```
ftpusers与user_list用户列表的使用
1. ftpusers问价:FTP服务器中的给名单,优先级高于user_list文件
2. user_list文件:此用户列表默认情况也是黑名单,即在此用户列表中的用户不可访问FTP服务器,但可以通过vsftpd.conf主配置文件的修改将次名单改为白名单,且仅此名单中的用户可以访问。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181123105547629.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181123105558986.)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181123105611603.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181123105624785.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181123105633938.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181123105644182.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
搭建虚拟用户验证的FTP服务
1. 建立虚拟用户账号数据库
vsftpd服务使用Berkeley DB 格式的数据库文件来存放虚拟用户账号,使用db_load工具(安装包db4-utils)生成数据库文件。
```
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers vsftpd.conf vsftpd.conf.anon
user_list vsftpd.conf.2018-11-23 vsftpd_conf_migrate.sh
[root@localhost vsftpd]# mv vsftpd.conf vsftpd.conf.local
[root@localhost vsftpd]# cp vsftpd.conf.2018-11-23 vsftpd.conf
[root@localhost vsftpd]# which db_load
/usr/bin/db_load
[root@localhost vsftpd]# vim ./vusers.list
daisy #账户名
123456 #密码
helen
123456
dave
123123
[root@localhost vsftpd]# db_load -T -t hash -f vusers.list vusers.db 将vusers.list进行加密,加密后文件命名为vusers.db
[root@localhost vsftpd]# chmod 600 vusers.*
```
2. 添加虚拟映射账号,为FTP根目录修改权限
```
[root@localhost vsftpd]# useradd -d /var/ftproot/ -s /sbin/nologin virtual
[root@localhost vsftpd]# chmod 755 /var/ftproot/
```
3. 添加PAM认证
```
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
```
4. 修改vsftpd.conf配置文件,重启服务
```
[root@localhost vsftpd]# vim vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
pam_service_name=vsftpd.vu
guest_enable=YES
guest_username=virtual
userlist_enable=YES
[root@localhost vsftpd]# /etc/init.d/vsftpd reload
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
```
5. 客户端测试
```
# ftp_client端
[root@localhost ~]# ftp 192.168.214.157
Connected to 192.168.214.157 (192.168.214.157).
220 (vsFTPd 2.2.2)
Name (192.168.214.157:root): daisy
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,214,157,203,139).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 23 04:13 111
226 Directory send OK.
```
6. 实现每个虚拟用户不同根目录、不同权限的管控
(1)创建用户控制目录,并创建虚拟所对应的同名配置文件
```
[root@localhost ftproot]# cd /etc/vsftpd/
[root@localhost vsftpd]# mkdir ./vusers.dir
[root@localhost vsftpd]# cd ./vusers.dir/
[root@localhost vusers.dir]# touch daisy helen dave
[root@localhost vusers.dir]# ls
daisy dave helen
[root@localhost vusers.dir]# mkdir -p /var/daisy
[root@localhost vusers.dir]# mkdir -p /var/helen
[root@localhost vusers.dir]# mkdir -p /var/dave
[root@localhost vusers.dir]# vim daisy
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_max_rate=1
local_root=/var/daisy
[root@localhost vusers.dir]# vim helen
anon_upload_enable=YES
anon_max_rate=0
local_root=/var/helen
[root@localhost vusers.dir]# /etc/init.d/vsftpd reload
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost vusers.dir]# chown virtual /var/daisy/
[root@localhost vusers.dir]# chown virtual /var/helen/
[root@localhost vusers.dir]# chown virtual /var/dave/
```
(2)修改vsftpd.conf主配置文件,重启服务
```
[root@localhost vsftpd]# vim vsftpd.conf
anon_umask=022
pam_service_name=vsftpd.vu
guest_enable=YES
guest_username=virtual
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers.dir
[root@localhost vsftpd]# /etc/init.d/vsftpd reload
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
```
(3)客户端测试
验证daisy
```
# ftp_server端
[root@localhost vsftpd]# cd /var/daisy
[root@localhost daisy]# touch daisy
[root@localhost daisy]# cd /var/helen
[root@localhost helen]# touch helen
[root@localhost helen]# cd /var/dave
[root@localhost dave]# touch dave
# ftp_client端
[root@localhost ~]# ftp 192.168.214.157
Connected to 192.168.214.157 (192.168.214.157).
220 (vsFTPd 2.2.2)
Name (192.168.214.157:root): daisy
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,214,157,29,234).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 23 04:52 daisy
226 Directory send OK.
```