概述
目录
一、FTP 连接及传输模式
二、FTP 用户类型
1.匿名用户:
2.本地用户:
3.虚拟用户:
三、FTP 服务器软件的种类
1.Windows 系统:
2.Linux/Unix 系统:
四、FTP 客户端工具的种类
1.Windows 系统:
2.Linux/Unix 系统:
五、搭建匿名访问的 FTP 服务
1.安装 FTP 服务软件
2.准备匿名 FTP 访问的目录
3.开放匿名用户配置并启动 vsftpd 服务
4.测试匿名 FTP 服务器
六、搭建本地用户验证的 FTP 服务
1.创建本地用户
2.修改配置文件,重启 FTP 服务(注意把后面解释内容删掉)
3.ftpusers 与 user_list 用户列表的使用
七、搭建虚拟用户验证的 FTP 服务
1.建立虚拟用户账号数据库
2.添加虚拟映射账号,为 FTP 根目录修改权限
3.增加 PAM 认证
4.修改 vsftpd.conf 配置文件,重启服务
5.客户端测试
6.实现每个虚拟用户不同根目录、不同权限的管控
一、FTP 连接及传输模式
1.控制连接:TCP 21,用于发送 FTP 命令信息
2.数据连接:TCP 20,用于上传、下载数据
3.数据连接的建立类型:
(1)主动模式:服务器主动发起数据连接
首先由客户端向服务端的 21 端口建立 FTP 控制连接。当需要传输数据时,客户端以 PORT 命令告知服务器“我打开了某端口,你过来连接我”,预算服务器从 20 端口向客户端的该端 口发送请求并建立数据连接。
(2)被动模式:服务器被动等待数据连接
如果客户端所在网络的防火墙禁止主动模式连接,通常会使用被动模式。 首先由客户端想服务器的 21 端口建立 FTP 控制连接。当需要传输数据时,服务器以 PASV命令告知客户端“我打开了某端口,你过来连接我”,于是客户端向服务器的该端口(非 20) 发送请求并建立数据连接。
4.传输模式
在传输文件时,根据是否进行字符转换,分为文本模式和二进制模式。
(1)文本模式:
又称 ASCII(American Standard Code for Information Intechange)美国 信息交换标准码模式,这种模式在传输文件时使用 ASCII 标准字符序列,一般只用于纯文本 文件的传输。
(2)二进制模式:
又称 Binary 模式,这种模式不会转换文件中的字符序列,更适合传 输程序、图片等非纯文本字符的文件。使用二进制模式比文本模式更有效率,大多数 FTP 客户端工具可以根据文件类型自动选 择文件传输模式。
二、FTP 用户类型
1.匿名用户:
用户名为 ftp 或 anonymous,提供任意密码(包括空密码)都可以通过服务 器的验证。一般用于公共文件的下载,如提供一些免费的软件、学习资料下载的站点。
2.本地用户:
直接使用本地的系统用户账号进行验证。
3.虚拟用户:
通过一份独立的用户数据库文件进行登录验证,将 FTP 账户与 Linux 系统账 户的关联性将至最低,为系统提供更好的安全性。
三、FTP 服务器软件的种类
1.Windows 系统:
FileZilla Server、Serv-U 等
2.Linux/Unix 系统:
vsftpd(Very Secure FTP Daemon)
四、FTP 客户端工具的种类
1.Windows 系统:
ftp 命令、CuteFTP、FlashFXP、LeapFTP、Filezilla 等。还有一些下载工具 软件,如 FlashGet、Wget 等,但不具备上传功能,通常不称为 FTP 客户端工具。
2.Linux/Unix 系统:
ftp 命令
五、搭建匿名访问的 FTP 服务
1.安装 FTP 服务软件
[root@ftp ~]# rpm -qa |grep vsftpd
[root@ftp ~]# yum -y install vsftpd
2.准备匿名 FTP 访问的目录
[root@ftp ~]# cd /var/ftp/
[root@ftp ftp]# ll
总用量 0
drwxr-xr-x 2 root root 6 8月 3 2017 pub
[root@ftp ftp]# chmod o+w pub/
[root@ftp ftp]# ll
总用量 0
drwxr-xrwx 2 root root 6 8月 3 2017 pub
3.开放匿名用户配置并启动 vsftpd 服务
[root@ftp ftp]# cd /etc/vsftpd/
[root@ftp vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@ftp vsftpd]# cp vsftpd.conf vsftpd.conf.$(date +%Y%m%d%H%M)
[root@client vsftpd]# cat vsftpd.conf.201812240103 |egrep -v "^#|^$" >vsftpd.conf
[root@client vsftpd]# vim vsftpd.conf
1 anonymous_enable=YES //允许匿名用户
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 anon_upload_enable=YES //开启匿名用户上传权限
6 anon_umask=022 //手动添加匿名用户的权限掩码
7 anon_mkdir_write_enable=YES //开启匿名用户新建用户的权限
8 anon_other_write_enable=YES //手动添加匿名用户的其他写入权限(删除,重命名等)
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15 pam_service_name=vsftpd
16 userlist_enable=YES
17 tcp_wrappers=YES
[root@client vsftpd]# systemctl restart vsftpd
4.测试匿名 FTP 服务器
在客户端安装 FTP 客户端
[root@client ~]# yum -y install ftp
[root@client ~]# echo ceshiwenjian >anon_ftptest.txt
[root@client ~]# ftp 192.168.1.40
Connected to 192.168.1.40 (192.168.1.40).
220 (vsFTPd 3.0.2)
Name (192.168.1.40:root): 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,1,40,227,251).
150 Here comes the directory listing.
drwxr-xr-x 2 14 0 6 Aug 03 2017 pub
226 Directory send OK.
ftp> cd pub/
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,1,40,126,224).
150 Here comes the directory listing.
226 Directory send OK.
ftp> mkdir anon_ftptest.dir
257 "/pub/anon_ftptest.dir" created
ftp> put anon_ftptest.txt
local: anon_ftptest.txt remote: anon_ftptest.txt
227 Entering Passive Mode (192,168,1,40,36,70).
150 Ok to send data.
226 Transfer complete.
13 bytes sent in 0.000127 secs (102.36 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,1,40,92,235).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 6 Dec 23 09:19 anon_ftptest.dir
-rw-r--r-- 1 14 50 13 Dec 23 09:19 anon_ftptest.txt
226 Directory send OK.
ftp> delete anon_ftptest.txt
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (192,168,1,40,63,163).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 6 Dec 23 09:19 anon_ftptest.dir
226 Directory send OK.
ftp> bye
221 Goodbye.
测试小结:匿名用户具有新建目录、上传文件、删除文件的权限,新建目录默认权限 755,上传文件默认权限 644。
六、搭建本地用户验证的 FTP 服务
1.创建本地用户
[root@ftp vsftpd]# useradd test1
[root@ftp vsftpd]# useradd test2
[root@ftp vsftpd]# echo "123" |passwd --stdin test1 &>/dev/null
[root@ftp vsftpd]# echo "123" |passwd --stdin test2 &>/dev/null
2.修改配置文件,重启 FTP 服务(注意把后面解释内容删掉)
[root@ftp vsftpd]# cat vsftpd.conf.201812240103 |egrep -v "^#|^$" >vsftpd.conf
[root@ftp vsftpd]# vim vsftpd.conf
1 anonymous_enable=NO //禁止匿名用户登录
2 local_enable=YES //允许本地用户登录
3 write_enable=YES //设置可写权限
4 local_umask=022 //本地用户上传文件的umask值
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES
13 tcp_wrappers=YES
14 local_root=/var/ftp //设置本地用户登录ftp的根目录
15 chroot_local_user=YES //将本地用户锁定在ftp目录,不可cd出去
16 allow_writeable_chroot=YES //允许用户具有主目录写权限
[root@ftp vsftpd]# systemctl restart vsftpd
客户端测试:
[root@client ~]# echo ceshiwenjian >local_ftptest.txt
[root@client ~]# ls
anaconda-ks.cfg anon_ftptest.txt local_ftptest.txt local_test.txt
[root@client ~]# ftp 192.168.1.40
Connected to 192.168.1.40 (192.168.1.40).
220 (vsFTPd 3.0.2)
Name (192.168.1.40:root): test1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir local_ftptest.dir
257 "/pub/local_ftptest.dir" created
ftp> put local_ftptest.txt
local: local_ftptest.txt remote: local_ftptest.txt
227 Entering Passive Mode (192,168,1,40,247,92).
150 Ok to send data.
226 Transfer complete.
13 bytes sent in 0.000197 secs (65.99 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,1,40,102,148).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 6 Dec 23 09:19 anon_ftptest.dir
drwx------ 2 1000 1000 6 Dec 23 10:15 local_ftptest.dir
-rw------- 1 1000 1000 13 Dec 23 10:16 local_ftptest.txt
226 Directory send OK.
ftp>bye
测试小结:本地用户具有新建目录、上传文件的权限,
3.ftpusers 与 user_list 用户列表的使用
(1).ftpusers 文件:
FTP 服务器中的黑名单,优先级高于 user_list 文件
(2).user_list 文件:
此用户列表默认情况下也是黑名单,即在此用户列表中的用户不可访问 FTP 服务器,但可以通过 vsftpd.conf 主配置文件的修改将此名单改为白名单,且仅此名单中的用户可以访问。
(3).示例:
A.将 test1 用户放入 ftpusers 文件中,其他配置文件不修改,尝试用 test1 用户登录
[root@ftp ]# cd /etc/vsftpd
[root@ftp vsftpd]# vim ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
test1
客户端测试:
[root@client ~]# ftp 192.168.1.40
Connected to 192.168.1.40 (192.168.1.40).
220 (vsFTPd 3.0.2)
Name (192.168.1.40:root): test1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
B.将 test1 移除出 ftpusers 文件,将 test2 放入 user_list 用户列表中,先用默认的配 置文件,在客户端尝试用 test2 访问 FTP 服务器。在修改配置文件,将 user_list 改为白 名单,再在客户端分别用 test1、test2 尝试访问。
[root@ftp ]# cd /etc/vsftpd
[root@ftp vsftpd]# cat vsftpd.conf.201812240103 |egrep -v "^#|^$" >vsftpd.conf
[root@ftp vsftpd]# systemctl restart vsftpd
[root@ftp vsftpd]# vim ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@ftp vsftpd]# vim user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
test2
客户端测试:
[root@client ~]# ftp 192.168.1.40
Connected to 192.168.1.40 (192.168.1.40).
220 (vsFTPd 3.0.2)
Name (192.168.1.40:root): test1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye
221 Goodbye.
[root@client ~]# ftp 192.168.1.40
Connected to 192.168.1.40 (192.168.1.40).
220 (vsFTPd 3.0.2)
Name (192.168.1.40:root): test2
530 Permission denied.
Login failed.
ftp> bye
221 Goodbye.
服务器修改主配置文件,重启服务:
[root@ftp vsftpd]# vim vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=NO
tcp_wrappers=YES
##保存退出
[root@ftp vsftpd]# systemctl restart vsftpd
客户端再次测试:
[root@client ~]# ftp 192.168.1.40
Connected to 192.168.1.40 (192.168.1.40).
220 (vsFTPd 3.0.2)
Name (192.168.1.40:root): test1
530 Permission denied.
Login failed.
ftp> bye
221 Goodbye.
[root@client ~]# ftp 192.168.1.40
Connected to 192.168.1.40 (192.168.1.40).
220 (vsFTPd 3.0.2)
Name (192.168.1.40:root): test2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye
221 Goodbye.
测试小结:配置文件中默认 user_list 用户列表为黑名单即默认为 userlist_deny=YES,当增加 userlist_deny=NO 时,user_list 用户列表为白名单,此时仅此名单内用户可访问FTP服务器。
七、搭建虚拟用户验证的 FTP 服务
1.建立虚拟用户账号数据库
vsftpd 服务使用 Berkeley DB 格式的数据库文件来存放虚拟用户账号,使用 db_load 工具 生成数据库文件。(若未安装,安装包在安装光盘 1 中,软件名为 db4-utils)
[root@ftp ]# cd /etc/vsftpd
[root@ftp vsftpd]# vim ./vusers.list
zhangsan
123
lisi
123
wangwu
456
[root@ftp vsftpd]# db_load -T -t hash -f vusers.list vusers.db
[root@ftp vsftpd]# ls
ftpusers vsftpd.conf vsftpd_conf_migrate.sh vusers.list
user_list vsftpd.conf.201812240103 vusers.db
[root@ftp vsftpd]# file vusers.db
vusers.db: Berkeley DB (Hash, version 9, native byte-order)
注:db_load 命令
-T:允许非 Berkeley 的程序使用该数据库
-t:指定算法 (hash:哈希,散列)
-f:指定源文件
注意:生成的数据库文件必须为“.db”格式
[root@ftp vsftpd]# chmod 600 vusers.* //修改有关文件的权限,增强安全性
[root@ftp vsftpd]# ll vusers.*
-rw------- 1 root root 12288 12月 23 18:49 vusers.db
-rw------- 1 root root 33 12月 23 18:48 vusers.list
2.添加虚拟映射账号,为 FTP 根目录修改权限
[root@ftp vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@ftp vsftpd]# ll -d /var/ftproot/
drwx------ 2 virtual virtual 62 12月 23 18:53 /var/ftproot/
[root@ftp vsftpd]# chmod 755 /var/ftproot/
[root@ftp vsftpd]# ll -d /var/ftproot/
drwxr-xr-x 2 virtual virtual 62 12月 23 18:53 /var/ftproot/
3.增加 PAM 认证
[root@ftp 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@ftp vsftpd]# cat vsftpd.conf.201812240103 |egrep -v "^#|^$" >vsftpd.conf
[root@ftp vsftpd]# vim vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
guest_enable=YES
guest_username=virtual
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
[root@ftp vsftpd]# systemctl restart vsftpd
5.客户端测试
[root@client ~]# ftp 192.168.60.34
Connected to 192.168.60.34 (192.168.60.34).
220 (vsFTPd 3.0.2)
Name (192.168.60.34:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye
221 Goodbye.
6.实现每个虚拟用户不同根目录、不同权限的管控
(1).创建用户控制目录,并创建虚拟所对应的同名配置文件
[root@client vsftpd]# mkdir vuser.dir
[root@client vsftpd]# cd vuser.dir/
[root@client vuser.dir]# touch zhangsan lisi wangwu
[root@client vuser.dir]# ls
lisi wangwu zhangsan
修改 zhangsan 的配置文件,使其可以上传、建立目录、删除文件、重命名文件、最大 传输速率 1 字节/秒、根目录为/var/zhangsan
[root@ftp vuser.dir]# mkdir /var/zhangsan
[root@ftp vuser.dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_max_rate=1
local_root=/var/zhangsan
修改 lisi 的配置文件,使其仅可以下载上传,不开放其他权限,不限制传输速率,根目 录为/var/lisi
[root@ftp vuser.dir]# mkdir /var/lisi
[root@ftp vuser.dir]# vim lisi
anon_upload_enable=YES
anon_max_rate=0
local_root=/var/lisi
wangwu 的配置文件不做修改,其权限为配置文件中的默认权限,根目录为/var/ftproot, 仅可以下载,无法上传。
[root@ftp vuser.dir]# chown virtual /var/zhangsan/
[root@ftp vuser.dir]# chown virtual /var/lisi/
(2).修改 vsftpd.conf 主配置文件,重启服务
[root@ftp vsftpd]# vim vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vuser.dir
[root@ftp vsftpd]# systemctl restart vsftpd
(3)客户端测试
验证 zhangsan
[root@client ~]# echo ceshiwenjian >virtual_ftptest.txt
[root@client ~]# ls
anaconda-ks.cfg anon_ftptest.txt local_ftptest.txt virtual_ftptest.txt
[root@client ~]# ftp 192.168.60.34
Connected to 192.168.60.34 (192.168.60.34).
220 (vsFTPd 3.0.2)
Name (192.168.60.34:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put virtual_ftptest.txt
local: virtual_ftptest.txt remote: virtual_ftptest.txt
227 Entering Passive Mode (192,168,60,34,148,78).
150 Ok to send data.
226 Transfer complete.
13 bytes sent in 0.000251 secs (51.79 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,60,34,86,136).
150 Here comes the directory listing.
-rw-r--r-- 1 1002 1002 13 Dec 24 03:56 virtual_ftptest.txt
226 Directory send OK.
ftp> mkdir zhangsan.dir
257 "/zhangsan.dir" created
ftp> ls
227 Entering Passive Mode (192,168,60,34,232,226).
150 Here comes the directory listing.
-rw-r--r-- 1 1002 1002 13 Dec 24 03:56 virtual_ftptest.txt
drwxr-xr-x 2 1002 1002 6 Dec 24 03:57 zhangsan.dir
226 Directory send OK.
ftp> delete virtual_ftptest.txt
250 Delete operation successful.
ftp> rmdir zhangsan.dir
250 Remove directory operation successful.
ftp> bye
221 Goodbye.
验证 lisi:
[root@client ~]# ftp 192.168.60.34
Connected to 192.168.60.34 (192.168.60.34).
220 (vsFTPd 3.0.2)
Name (192.168.60.34:root): lisi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put virtual_ftptest.txt
local: virtual_ftptest.txt remote: virtual_ftptest.txt
227 Entering Passive Mode (192,168,60,34,185,14).
150 Ok to send data.
226 Transfer complete.
13 bytes sent in 0.000308 secs (42.21 Kbytes/sec)
ftp> delete virtual_ftptest.txt
550 Permission denied.
ftp> mkdir lisi.dir
550 Permission denied.
ftp> bye
221 Goodbye.
验证 wangwu:
[root@client ~]# ftp 192.168.60.34
Connected to 192.168.60.34 (192.168.60.34).
220 (vsFTPd 3.0.2)
Name (192.168.60.34:root): wangwu
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put virtual_ftptest.txt
local: virtual_ftptest.txt remote: virtual_ftptest.txt
227 Entering Passive Mode (192,168,60,34,200,211).
550 Permission denied.
ftp> ls
227 Entering Passive Mode (192,168,60,34,216,205).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Dec 24 04:01 test.txt
226 Directory send OK.
ftp> get test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (192,168,60,34,23,4).
150 Opening BINARY mode data connection for test.txt (0 bytes).
226 Transfer complete.
ftp> bye
221 Goodbye.
[root@client ~]# ls
anaconda-ks.cfg anon_ftptest.txt local_ftptest.txt test.txt virtual_ftptest.txt
最后
以上就是忧心抽屉为你收集整理的Linux-网络服务03-FTP_文件传输服务的全部内容,希望文章能够帮你解决Linux-网络服务03-FTP_文件传输服务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复