当前位置: 首页 > news >正文

FTP文件服务的搭建----详解

 

目录

一、FTP服务介绍

二、FTP服务的客户端工具

三、FTP的两种工作模式

主动模式

被动模式

四、了解相关文件: 

查看依赖文件

配置文件:man 5 vsftpd.conf

关于禁锢用户的家目录选项

4.1 对象访问控制

 4.2网络访问控制

4.3限制FTP流量

五、Linux下ftp客户端工具使用

☆ ftp工具

☆ lftp工具:批量操作

 六、虚拟用户的配置

1. 创建虚拟用户数据库

生成数据库文件

2. 创建本地映射用户

3. 配置 PAM 认证

创建新PAM文件

4. 修改主配置文件

关键配置修改(其他设置保持默认)

5. 创建虚拟用户独立配置

为每个用户创建配置文件:

6. 防火墙和SELinux设置

7. 启动服务

8. 测试连接

七、 案例应用

㈠ 任务要求

㈡ 服务器端创建账号

㈢ 服务器端搭建FTP服务

① 安装软件

② 根据需求修改配置文件

③ 在服务端启动服务

④ 在客户端测试验证(linux)

1)安装客户端工具

2)客户端访问FTP服务

测试匿名用户是否可以访问

测试客服用户(kefu/123)是否可以登录上传下载文件

 测试kefu账号不能来回跳转


一、FTP服务介绍

首先说一下ftp和nfs的区别:

        NFS实现了多台服务器挂载同一个的文件系统到本地系统目录,以实现文件的读取、修改、删除动作能在多个主机之间传播,保证服务端的数据一致性

        FTP则单纯用来上传和下载文件使用,是无法实现直接对内部文件进行编辑,有点像现在的网盘。

FTP(File Transfer Protocol)是一种应用非常广泛并且古老的一个互联网文件传输协议

  • 主要用于互联网中文件的双向传输(上传/下载)、文件共享。
  • 跨平台 Linux、Windows。
  • FTP是C/S架构,拥有一个客户端和服务端,使用TCP协议作为底层传输协议,提供可靠的数据传输。
  • FTP的默认端口 21号(命令端口), 20号(数据端口,主动模式下) 默认被动模式下。
  • FTP程序(软件)vsftpd。

二、FTP服务的客户端工具

  1. Linux:ftp、lftp(客户端程序)
  2. Windows:FileZilla、IE、Chrome、Firefox......
  3. lftp和ftp工具区别:
  • lftp:默认是以匿名用户访问
  • ftp:默认是以用户名/密码方式访问
  • lftp:可以批量并且下载目录

三、FTP的两种工作模式

  • 主动模式

  1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的的21号端口发起请求。
  2. 服务端的21号命令端口响应客户端的随机命令端口。
  3. 服务端的20号端口主动请求连接客户端的随机数据端口
  4. 客户端的随机数据端口进行确认。
  • 被动模式

  1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的的21号端口发起请求。
  2. 服务端的21号命令端口响应客户端的随机命令端口。
  3. 客户端主动连接服务端打开的大于1023的随机数据端口
  4. 服务端进行确认。

思考:FTP的主动模式好还是被动模式好?

        针对于多内网用户共用公网IP去访问外网中的ftp服务器的时候,采用主动模式,由于公网IP共享造成的结果就是外网ftp服务器会网共享IP对应的端口去连接,内网用户访问不成功。此时采用被动模式就比较适合。

维度主动模式被动模式
安全性客户端需暴露端口⇒⇒ 高风险服务器暴露端口⇒⇒ 需管控范围
配置复杂度客户端配置复杂(防火墙策略)服务器配置复杂(开放端口范围)
NAT穿透能力基本不可行(客户端IP转换问题)良好支持(客户端单向连接)
速度性能无差异无本质差异

1、主动模式适用

  • 服务器位于公网 + 客户端在内网(无防火墙限制)
  • 需要严格限制服务器端口开放的场景
  • 典型场景:企业内部文件服务器(客户端可控)

2、被动模式适用

  • 户端位于公网(如家用宽带)
  • 穿越NAT设备或严格防火墙
  • 典型场景:云服务器FTP服务、跨公网文件传输

现代互联网环境中,被动模式使用率 >90%,因其适配复杂网络环境的能力。

四、了解相关文件: 

查看依赖文件

#rpm -ql vsftpd
/etc/rc.d/init.d/vsftpd			启动脚本
/etc/vsftpd						配置文件的目录
/etc/vsftpd/ftpusers			用户列表文件,黑名单
/etc/vsftpd/user_list			用户列表文件,可黑可白(默认是黑名单)
/etc/vsftpd/vsftpd.conf			配置文件
/usr/sbin/vsftpd				程序本身(二进制的命令)
/var/ftp						匿名用户的默认数据根目录
/var/ftp/pub					匿名用户的扩展数据目录

配置文件:man 5 vsftpd.conf

# grep -v ^# /etc/vsftpd/vsftpd.conf 
###################################################################################
anonymous_enable=YES			支持匿名用户访问	,生产环境下匿名用户要么关闭,要么只读
anon_upload_enable=YES          允许匿名用户上传文件
anon_mkdir_write_enable=NO      禁止匿名用户创建新的子目录,匿名用户上传功能不受影响但受限
anon_other_write_enable=NO      禁止匿名用户执行删除/重命名等操作
anon_world_readable_only=NO     没有读权限
anon_umask=022                配置上传上来的文件权限为 644。默认不配的话上传上来的文件都是 600
###################################################################################
local_enable=YES				非匿名用户,本地系统用户,登录注意匿名用户和系统登录必须打开一个
guest_enable=YES
guest_username=nebula
# 默认系统用户登录之后,工作目录是用户家目录,guest_username如果指定了另外的系统用户,则上传的
文件会写入到guest_username所指定用户的家目录
write_enable=YES				写总开关(主要针对非匿名用户),允许上传都需要打开这个选项    
####################################################################################
chroot_local_user=YES           FTP用户都会被被限制在其自己的工作目录中,不允许使用cd等方式切换目录,这个一定要加的,为了安全
local_root=path                 FTP虚拟用户的家目录
allow_writeable_chroot=YES      允许用户在目录中写入(允许本地用户在 chroot 隔离环境中写入文件);默认开启chroot_local_user之后,该用户的ftp目录是不可写的;这个要打开,否则ls 都无法执行
#################################################################################
dirmessage_enable=YES			启用消息功能
xferlog_enable=YES				开启或启用xferlog日志
xferlog_std_format=YES			xferlog日志格式
vsftpd_log_file=/var/log/vsftpd.log
connect_from_port_20=YES		支持主动模式(默认被动模式)
listen=YES					    ftp服务独立模式下的监听
local_umask=022					反掩码  file:644  dir:755;
###################################################################################
pam_service_name=vsftpd			指定认证文件
userlist_enable=YES				启用用户列表(user_list黑名单)
tcp_wrappers=YES				支持tcp_wrappers功能(限流),支持tcp_wrapper防火墙,则可以通过/etc/hosts.allow 和 /etc/hosts.deny 来设置vsftpd服务的黑白名单限制(基于来源IP的,和iptables防火墙类似)
listen_address=IP地址            设置ftp服务来监听的地址,客户端可以用哪个地址来连接;
pasv_max_port=15100            指定被动模式下,能开放的随机端口最大值
pasv_min_port=15000            指定被动模式下,能开放的随机端口最小值
#被动模式下,ftp用户需要进行数据传输时,vsftpd会listen随机端口,这个随机端口是需要被客户端连接的,所以防火墙必须开放;这个随机端口,防火墙是实现不了的,所以,这里就必须将vsftpd的数据端口固定到一个范围里,然后防火墙直接开放整个端口范围

关于禁锢用户的家目录选项

1. 禁锢所有人的家
chroot_local_user=YES
############################################################
2. 禁锢大部分人,允许小部分人
chroot_local_user=YES
chroot_list_enable=YES		开启用户列表文件
chroot_list_file=/etc/vsftpd/chroot_list	指定用户列表文件echo stu1 >> /etc/vsftpd/chroot_list
############################################################
3. 允许大部分人,禁锢小部分人
chroot_local_user=NO
chroot_list_enable=YES		开启用户列表文件
chroot_list_file=/etc/vsftpd/chroot_list	指定用户列表文件echo kefu >> /etc/vsftpd/chroot_list

注意:

匿名用户配置

  •  默认目录权限就是root,vsftpd进程的默认启动用户为ftp用户,所以工作目录需要ftp用户具有写入权限,这个工作目录ftp用户不能有写入权限,即group,other都不能有写入权限,否则会有以下错误;注意必须创建子目录,在子目录中进行上传。
# Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside 
chroot()
  •  默认为了安全vsftp将不允许工作目录具有写权限,否则就会出现上述错误,可以通过allow_writeable_chroot=YES打开写限制, chown root.root /var/ftp。
  • 默认在/var/ftp下有一个pub的目录,我们一般会将pub作为我们的工作目录,/var/ftp/pub 这个目录下ftp用户是需要有写入权限的,所以我们直接将这个目录的user和group都设置成了ftp , chown ftp.ftp /var/ftp/pub 

4.1 对象访问控制

  • ftpusers :黑名单
  • user_list :默认是黑名单(可以成为白名单)
[root@client ~]# ftp 10.1.1.1
Connected to 10.1.1.1 (10.1.1.1).
220 (vsFTPd 2.2.2)
Name (10.1.1.1:root): root
530 Permission denied.
Login failed.
原因:root用户在黑名单里user_list。[root@client ~]# ftp 10.1.1.1
Connected to 10.1.1.1 (10.1.1.1).
220 (vsFTPd 2.2.2)
Name (10.1.1.1:root): stu1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
原因:stu1用户在黑名单里ftpusers。

为什么两个用户的提示信息不一样?
原因:默认情况下user_list文件也是黑名单,如果在该文件里直接拒绝,不给输入密码的机会。user_list要成为白名单,需要再配置文件里增加:userlist_deny=NO。
注意:如果user_list是白名单,那么必须在该文件里的用户才可以访问ftp服务。

总结:

  1. 用户在ftpusers文件中,那么用户不能访问ftp服务器。
  2. 用户在user_list文件中,如果该文件是白名单,那么在该文件中的用户可以访问ftp服务。
  3. 如果user_list文件是白名单,用户即在ftpusers中又在user_list中,那么ftpusers拒绝优先

 4.2网络访问控制

 如何判断一个服务是否支持tcp_wrappers?

        支持的服务会读取 /etc/hosts.allow( 允许)和 /etc/hosts.deny (拒绝)规则。

        要判断 Linux 服务是否支持 TCP_Wrappers,关键是要检查该服务程序是否链接了 libwrap.so 共享库。以下是详细步骤:

  • 1)./configure --enable-libwrap 表示支持使用源码安装的时候,选择tcp_wrappers访问控制
  • 2)rpm安装
  • 3)进行查看是否支持tcp_wrappers
# ldd /usr/sbin/vsftpd |grep libwrap*libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f7058cff000)

/etc/hosts.allow( 允许)和 /etc/hosts.deny (拒绝)规则写法:

/etc/hosts.deny
服务程序:主机
vsftpd:all                        全部拒绝
vsftpd:all  EXCEPT 192.168.0.2    拒绝所有除了192.168.0.2  
vsftpd:192.168.0.254			  拒绝单个IP地址
vsftpd:192.168.0.0/255.255.255.0   拒绝某个网段
vsftpd:192.168.0.0/255.255.255.0 EXCEPT 192.168.0.254   拒绝某个网段,但是除了某个ip地址
注意:子网掩码不支持192.168.0.0/24这种写法
vsftpd:10.1.1.0/255.255.255.0,192.168.91.0/255.255.255.0 EXCEPT 10.1.1.3
vsftpd,sshd:10.1.1.1vsftpd:192.168.0.254:allow  
//以上是允许192.168.0.254访问,类似/etc/hosts.allow里增加
vsftpd:192.168.0.254

4.3限制FTP流量

# vim /etc/vsftpd/vsftpd.conf
local_max_rate=0
0代表不限速local_max_rate=数值 + 字节

五、Linux下ftp客户端工具使用

ftp、lftp都是Linux下ftp的客户端管理工具,但是需要独立安装

# yum install ftp lftp -y

☆ ftp工具

# ftp 10.1.1.10
Connected to 10.1.1.10 (10.1.1.10).
220 (vsFTPd 3.0.2)
Name (10.1.1.10:root): 输入FTP的账号
331 Please specify the password.
Password: 输入FTP账号对应的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

求帮助:

ftp> ?或help
  • 第一个命令:ls命令——查看当前连接的FTP目录下有哪些文件
ftp> ls
  • 第二个命令(快捷键):Ctrl + Shift + L代表清屏命令
  • 第三个命令:help命令
ftp> help put
put             send one file
  • 第四个命令:put与get命令
ftp> put 本地文件路径+名称	 上传
ftp> get 远程文件路径+名称	 下载
  • 第五个命令:批量上传或下载多个文件
ftp> mput 文件名称1 文件名称2 文件名称3 ...
ftp> mget 文件名称1 文件名称2 文件名称3 ...
  • 第六个命令:prompt屏蔽批量输出信息
ftp>prompt
Interactive mode on.	=> 开启提示ftp> prompt
Interactive mode off.	=>关闭提示
  • 第七个命令:quit命令
ftp> quit

☆ lftp工具:批量操作

# lftp 用户名称@远程IP地址
Password:用户名称对应的密码
###或者
# lftp -u 用户名,密码 远程IP
  • 求帮助:help
lftp> help
  • 针对某个命令求帮助:help + 命令
lftp> help mirror
  • 案例:批量上传(把shop文件夹上传到FTP服务器端)
lftp> mirror -R 本地文件夹名称
  • 案例:批量下载(把整个FTP下载到本地)
lftp> mirror 远程FTP路径

 六、虚拟用户的配置

以下是完整的配置流程(以 CentOS 7.9为例):

1. 创建虚拟用户数据库

# vim /etc/vsftpd/vusers.txt
#文件内容示例(每两行为一组):
ftpuser1
password1
ftpuser2
password2
  • 生成数据库文件

# db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db 
# chmod 600 /etc/vsftpd/vusers.*

2. 创建本地映射用户

# useradd -d /var/ftproot -s /sbin/nologin vftpuser
# sudo mkdir -p /var/ftproot/{user1,user2}
# chown -R vftpuser:vftpuser /var/ftproot

3. 配置 PAM 认证

  • 创建新PAM文件

#vim /etc/pam.d/ftp.vu
添加以下内容:
auth required pam_userdb.so db=/etc/vsftpd/vusers 
account required pam_userdb.so db=/etc/vsftpd/vusers

4. 修改主配置文件

#cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
####Tip:拷贝一份是为了防止修改出错,或者恢复到原来的配置
#vim /etc/vsftpd/vsftpd.conf
  • 关键配置修改(其他设置保持默认)

5. 创建虚拟用户独立配置

# vim /etc/vsftpd/vsftpd.conf
# 启用虚拟用户
guest_enable=YES
guest_username=vftpuser
pam_service_name=ftp.vu
# 关闭匿名登录 
anonymous_enable=NO
# 启用用户配置目录
user_config_dir=/etc/vsftpd/vuser_conf
# 权限设置
allow_writeable_chroot=YES
local_umask=022
# mkdir /etc/vsftpd/vuser_conf

为每个用户创建配置文件:

  • 用户1配置
# vim /etc/vsftpd/vuser_conf/ftpuser1
local_root=/var/ftproot/user1
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
  •  重复此步骤 为其他用户创建配置文件2

6. 防火墙和SELinux设置

# 防火墙放行
# firewall-cmd --add-service=ftp --permanent
# firewall-cmd --reload
# SELinux设置
# setsebool -P ftpd_full_access=on
# setsebool -P ftpd_anon_write=on

7. 启动服务

# systemctl restart vsftpd
# systemctl enable vsftpd

8. 测试连接

 lftp  -u user1,password1 192.168.17.3
lftp user1@192.168.17.3:~> ls
lftp user1@192.168.17.3:/> put file.c
lftp user1@192.168.17.3:/> ls
-rw-r--r--    1 1003     1003            0 Jun 06 12:05 file.c
lftp user1@192.168.17.3:/> rm file.c
rm ok, `file.c' removed

七、 案例应用

㈠ 任务要求

  1. 搭建ftp服务
  2. 根据需求修改配置文件
  • 不允许匿名用户访问
  • 指定xiaofeng人员目录为自己的家目录,并且只能在指定目录活动

注:在防火墙中添加规则或者关闭防火墙进行测试验证!!! 

㈡ 服务器端创建账号

# useradd kefu
# echo 123|passwd --stdin kefu

㈢ 服务器端搭建FTP服务

① 安装软件

# yum -y install vsftpd
# rpm -q vsftpd
vsftpd-2.2.2-24.el6.x86_64

② 根据需求修改配置文件

# vim /etc/vsftpd/vsftpd.conf
修改以下配置,没有需要自己增加:
anonymous_enable=NO		禁止匿名用户访问
chroot_local_user=YES	禁锢本地用户的默认数据目录
在ftp服务器上创建指定的数据目录
# mkdir /data/kefu -p 

③ 在服务端启动服务

# service vsftpd restart

④ 在客户端测试验证(linux)

1)安装客户端工具
# yum -y install ftp lftp
2)客户端访问FTP服务
  • 测试匿名用户是否可以访问
# lftp 192.168.17.3
lftp 10.1.1.2:~> ls
`ls' at 0 [Sending commands...]
或者
# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): ftp                ftp代表匿名用户
331 Please specify the password.
Password:不输密码直接回车
530 Login incorrect.
Login failed.

注意:以上说明已经禁止匿名用户访问

  • 测试客服用户(xiaofeng/123)是否可以登录上传下载文件
lftp xiaofeng@192.168.17.3:/> put file.c
lftp xiaofeng@192.168.17.3:/> ls
-rw-r--r--    1 1004     1004            0 Jun 06 14:27 file.c

常见问题:

###注意:若出现
227 Entering Passive Mode (192,168,17,3,94,41).
553 Could not create file.
原因分析:要么是ftp服务器端不允许本地用户上传,要么是上传文件的目录对kefu用户没有写权限
排查文件:查看配置文件,write_enable=YES说明ftp是允许本地用户写的。查看目录权限,发现该目录没有权限让kefu写
  •  测试xiaofeng账号不能来回跳转
lftp xiaofeng@192.168.17.3:/> cd /home
cd: Access failed: 550 Failed to change directory. (/home)

 本   篇   完   结   …  …


持     续     更     新     中   …    … 

相关文章:

  • [Go]context上下文--使用要点--源码分析--Go核心--并发编程
  • IEC 61347-1:2015 灯控制装置安全通用要求详解
  • win32相关(IAT HOOK)
  • STM32什么是寄存器
  • HTML 面试题错题总结与解析
  • 锁的艺术:深入浅出讲解乐观锁与悲观锁
  • python asyncio的作用
  • 安卓基础(aar)
  • FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍
  • PySide6 GUI 学习笔记——常用类及控件使用方法(单行文本控件QLineEdit)
  • 冰箱智能化升级方案:WT3000A离在线AI语音模组赋能AI在线对话功能
  • 10.Linux进程信号
  • C++11新增重要标准(下)
  • Java应用Flink CDC监听MySQL数据变动内容输出到控制台
  • 【Go核心编程】第十三章:接口与多态——灵活性的艺术
  • 计算机考研408真题解析(2024-15 整数乘法运算的四种实现方式)
  • Java 反射机制详解及示例
  • Java 中 synchronized 和 ReentrantLock 的全面对比解析
  • LeetCode hot100---152.乘机最大子数组
  • Protobuf 中的类型查找规则
  • 中小企业做网站贷款/网络营销的方式有哪些
  • 建设部网站首页督办案件/郑州seo培训
  • 腾龙时时彩做号软件官方网站/网站结构优化
  • 各大电商购物网站转化率报表/关键词歌曲
  • 用net语言做网站平台好不好/百度竞价冷门产品
  • 平湖网站建设/网络运营怎么学