文件传输协议FTP

随着互联网技术的不断发展,数据交换和文件共享变得日益重要。文件传输协议(FTP)作为一种古老但功能强大的工具,至今仍在许多领域发挥着关键作用。在本文中,我们将深入探讨FTP的历史、功能以及它在现代的应用。

FTP的历史
文件传输协议(FTP)最早是在1971年由ARPANET(美国国防部高级研究计划局网络)的研究人员开发的。FTP的初衷是为了在计算机之间安全、可靠地传输文件。经过多年的发展和完善,FTP逐渐成为了互联网上的标准文件传输协议。

一、FTP服务概述

FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一。
FTP连接及传输模式

  • 控制连接:TCP 21,用于发送FTP命令信息
  • 数据连接:TCP 20,用于上传、下载数据
  • 数据连接的建立类型:
    • 主动模式:服务端从20端口主动向客户端发起连接
    • 被动模式:服务端在指定范围内某个端口被动等待客户端连接

FTP传输模式

  • 文本模式:ASCLL 模式,以文本序列传输数据
  • 二进制模式:Binary 模式,以二进制序列传输数据

FTP用户的类型

  • 匿名用户:anonymous 或 ftp
  • 本地用户:
    • 账号名称、密码等信息保存在passwd、shadow 文件中
  • 虚拟用户:
    • 使用独立的账号/密码数据文件

常见的FTP服务器程序

  • LLS、Serv-U
  • wu-ftpd、Proftpd
  • vsftpd(Very Secure FTP Daemon)

二、vsftpd 服务常见配置

命令端口

默认 21/tcp

主动模式端口:

connect_from_port_20=YES        # 主动模式端口为20
ftp_data_port=20                # (默认)指定主动模式的端口

被动模式端口范围:

linux                     #客户端默认使用被动模式(使用passive 切换模式)
Windows                   #CMD客户端默认使用主动模式
pasv_min_port=6000        #0为随机分配
pasv_max_port=6010        #自定义范围需考虑并发数

使用当地时间:

use_localtime=YES    #使用当地时间(默认为NO,使用GMT)    部分客户端会自动调整

匿名用户登录:

anonymous_enable=YES    #支持匿名用户,CentoS8默认不允许匿名
no_anon_password=YES    #匿名用户略过口令检查,默认NO

匿名用户上传:

anon_upload_enable=YES             #匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES        #匿名建目录 注意:还需要开启文件系统访问的权限,不能给FTP根目录写权限, 只能级子目录写权限
anon_world_readable_only           #只能下载全部读的文件,默认YES 
anon_umask=0333                    #指定匿名上传文件的umask,默认077,注意:0333中的0不能省略
anon_other_write_enable=YES        #可删除和修改上传的文件, 默认NO

指定匿名用户的上传文件的默认的所有者和权限

chown_uploads=YES        #默认NO 
chown_username=user1
chown_upload_mode=0644

Linux系统用户

local_enable=YES    #是否允许linux用户登录
write_enable=YES    #允许linux用户上传文件
local_umask=022        #指定系统用户上传文件的默认权限

将系统用户映射为指定的guest用户

guest_enable=YES        #所有系统用户都映射成guest用户
guest_username=ftp        #配合上面选项才生效,指定的guest用户
local_root=/ftproot        #guest用户登录所在目录

禁使用user_list

  • 禁当vsftpd服务器开放了“local_enable”配置以后,默认情况下除root以外都能登陆,若只希望对一小部分系统用户登陆则需要开放相关配置项
userlist_enable=YES            #启用user_list用户列表
userlist_deny=NO          	   #不禁用user_list用户列表中的用户
vi /etc/vsftpd/user_list
zhangsan
# 这样就只有zhangsan用户能登陆了

三、VSFTP 虚拟用户模式

虚拟用户

  • 所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
  • 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

虚拟用户账号的存储方式

  • 文件:编辑文本文件,此文件需要被编码为 hash 格式奇数行为用户名,偶数行为密码
db_load -T -t hash -f vusers.txt    vusers.db
  • 关系型数据库中的表中: 实时查询数据库完成用户认证

四、主配置文件

常用的匿名FTP配置项

anonymous_enable=YES          #启动匿名访问
anon_umask=022                #匿名用户所上传文件的权限掩码
anon_root=/var/ftp            #匿名用户的FTP根目录
anon_upload_enable=YES        #允许上传文件
anon_mkdir_write_enable=YES   #允许创建目录
anon_other_write_enable=YES   #开放其他写入权
anon_max_rate=0               #限制最大传输速率(字节/秒)

常用的本地用户FTP配置项

local_enable=YES        #是否启用本地系统用户
local_umask=022         #本地用户所上传文件的权限掩码
local_root=/var/ftp     #设置本地用户的FTP根目录
chroot_local_user=YES   #是否将用户禁锢在主目录
local_max_rate=0        #限制最大传输速率(字节/秒)

五、黑名单和白名单

/etc/vsftpd/user_list 和 /etc/vsftpd/ftpusers 是 vsftpd FTP 服务器使用的两个重要文件,用于控制用户访问权限。这两个文件的具体作用如下:

/etc/vsftpd/ftpusers:
这个文件包含了一个用户列表,列表中的用户将被拒绝通过 FTP 访问服务器。
默认情况下,这个文件通常包含如 root, bin, daemon, adm, lp, sync, shutdown, halt, mail, news, uucp, operator, games, gopher, ftp, nobody, www-data, backup, list, irc 和 gnats 等系统或服务用户。
这些用户由于具有特殊的系统权限或用于特定的服务,因此不应通过 FTP 访问服务器,以避免安全风险。

/etc/vsftpd/user_list:
这个文件的作用取决于 vsftpd 配置文件中的 userlist_deny 和 userlist_enable 设置。
当 userlist_enable=YES 时,vsftpd 会检查这个文件。
如果 userlist_deny=YES(默认值),则 user_list 文件中的用户将被拒绝访问 FTP 服务器。这类似于 ftpusers 文件,但通常用于定义额外的用户限制。
如果 userlist_deny=NO,则只有列在 user_list 文件中的用户才被允许访问 FTP 服务器,其他所有用户都将被拒绝。这可以用于创建一个只允许特定用户访问的白名单。

总结:
ftpusers 是一个固定的黑名单,列在其中的用户无论如何都不能通过 FTP 访问服务器。
user_list 可以作为黑名单(默认)或白名单(当 userlist_deny=NO 时),具体取决于 vsftpd 的配置。
为了服务器的安全,管理员应定期检查并更新这两个文件,确保只有合适的用户能够访问 FTP 服务。

六、用户类型

安装FTP

[root@bogon ~]# yum -y install vsftpd
# 启动并设置开机自启动
[root@bogon ~]# systemctl start vsftpd
[root@bogon ~]# systemctl enable vsftpd

1.匿名用户

修改vsftpd配置文件并重启服务
安装好以后默认就启用了匿名用户,但是权限是只能查看和下载,如果想要让匿名用户拥有上传文件,创建目录或者移动等其他权限则需要配置。

# 修改vsftpd配置文件
[root@bogon ~]# vi /etc/vsftpd/vsftpd.conf 
# 在anonymous_enable=YES下添加
anon_umask=022
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
# 添加完以后重启服务
[root@bogon ~]# systemctl restart vsftpd
# 把属组修改为 ftp
[root@bogon ~]# chown ftp /var/ftp/pub/

客户端测试
使用匿名用户登录的时候可以使用ftp用户或者anonymous用户登录,密码直接按回车即可

# 安装 ftp
[root@bogon ~]# yum -y install ftp
# 使用 ftp 连接到 192.168.72.154
[root@bogon ~]# ftp 192.168.72.154
Connected to 192.168.72.154 (192.168.72.154).
220 (vsFTPd 3.0.2)
Name (192.168.72.154:root): ftp
331 Please specify the password.
# 匿名用户不需要输入密码,直接按 Enter
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
# 查看
ftp> dir
227 Entering Passive Mode (192,168,72,154,55,212).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0              21 Jun 13 00:47 pub
226 Directory send OK.
# 切换到 pub 目录
ftp> cd pub
250 Directory successfully changed.
# 下载
ftp> get kgc.txt
local: kgc.txt remote: kgc.txt
227 Entering Passive Mode (192,168,72,154,224,241).
150 Opening BINARY mode data connection for kgc.txt (6 bytes).
226 Transfer complete.
6 bytes received in 8.5e-05 secs (70.59 Kbytes/sec)
# 退出 exit quit
ftp> exit
221 Goodbye.
ftp> 
# ls 查看是否下载成功
[root@bogon ~]# ls
anaconda-ks.cfg  kgc.txt
[root@bogon ~]# cat kgc.txt 
hello

2.本地用户

修改vsftpd配置文件并重启服务

# 修改vsftpd配置文件
[root@bogon ~]# vi /etc/vsftpd/vsftpd.conf 
# 在local_enable=YES下添加
chroot_local_user=yes
allow_writeable_chroot=yes
# 添加完以后重启服务
[root@bogon ~]# systemctl restart vsftpd

创建用户

# 添加用户lisi
[root@bogon ~]# useradd lisi
# 给lisi设置密码
[root@bogon ~]# passwd lisi

客户端测试

# ftp 连接
[root@bogon ~]# ftp 192.168.72.154
Connected to 192.168.72.154 (192.168.72.154).
220 (vsFTPd 3.0.2)
# 输入 lisi 用户
Name (192.168.72.154:root): lisi
331 Please specify the password.
# 密码输入 lisi 用户的密码
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
# 上传 anaconda-ks.cfg 文件
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,72,154,100,255).
150 Ok to send data.
226 Transfer complete.
1257 bytes sent in 0.000205 secs (6131.71 Kbytes/sec)
# 查看
ftp> ls
227 Entering Passive Mode (192,168,72,154,220,183).
150 Here comes the directory listing.
-rw-r--r--    1 1000     1000         1257 Jun 13 01:56 anaconda-ks.cfg
226 Directory send OK.
# 下载,用哪个用户登录就下载到哪个用户的家目录
ftp> get anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,72,154,54,128).
150 Opening BINARY mode data connection for anaconda-ks.cfg (1257 bytes).
226 Transfer complete.
1257 bytes received in 0.000188 secs (6686.17 Kbytes/sec)
ftp> 

3.虚拟用户

添加虚拟用户账号密码文件
一行是账号一行是密码,如下账号是wangwu密码是123,账号是pp密码是123

[root@bogon ~]# vi /etc/vsftpd/vusers.list
[root@bogon ~]# cat /etc/vsftpd/vusers.list
wangwu
123
pp
123

账号密码文件加密

# cd切换到 /etc/vsftpd/
[root@bogon ~]# cd /etc/vsftpd/
# 加密
[root@bogon vsftpd]# db_load -T -t hash -f vusers.list  vusers.db
# 为匹配 /etc/vsftpd/vusers.* 的所有文件设置所有者有读写权限,禁止所属组和其他用户对这些文件的任何访问权限
[root@bogon vsftpd]# chmod 600 /etc/vsftpd/vusers.*

添加虚拟用户的映射账号

# 创建一个真实的用户 wxx ,-d 指定目录为 /var/ftproot -s指定了新用户的默认shell为 /sbin/nologin wxx是创建的用户名
[root@bogon vsftpd]# useradd -d /var/ftproot -s /sbin/nologin wxx 
# 设置权限 755
[root@bogon vsftpd]# chmod 755 /var/ftproot/

进行 pam 认证

[root@bogon vsftpd]# vi /etc/pam.d/vsftpd.vu
[root@bogon vsftpd]# cat /etc/pam.d/vsftpd.vu
auth    required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

修改vsftpd配置文件并重启服务

# 修改vsftpd配置文件
[root@bogon ~]# vi /etc/vsftpd/vsftpd.conf 
# 把 pam_service_name=vsftpd 这行注释,在这一行下面添加
pam_service_name=vsftpd.vu
guest_enable=yes
guest_username=myftp
# 添加完以后重启服务
[root@bogon ~]# systemctl restart vsftpd

客户端测试

# 安装 ftp
[root@bogon ~]# yum -y install ftp
# 测试虚拟用户能否登录成功
[root@bogon ~]# ftp 192.168.72.154
Connected to 192.168.72.154 (192.168.72.154).
220 (vsFTPd 3.0.2)
# 测试 wangwu 虚拟用户
Name (192.168.72.154:root): wangwu
331 Please specify the password.
# 输入 wangwu 虚拟用户的密码 123
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.
# 测试虚拟用户能否登录成功
[root@bogon ~]# ftp 192.168.72.154
Connected to 192.168.72.154 (192.168.72.154).
220 (vsFTPd 3.0.2)
# 测试 pp 虚拟用户
Name (192.168.72.154:root): pp
331 Please specify the password.
# 输入 pp 虚拟用户的密码 123
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

七、总结

文件传输协议(FTP)是一种强大而灵活的工具,它允许我们在计算机之间安全、可靠地传输文件。虽然FTP的历史悠久,但它仍然在许多领域发挥着重要作用。通过了解FTP的功能和现代应用,我们可以更好地利用它来满足我们的数据交换和文件共享需求。

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值