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服务的客户端工具
- Linux:ftp、lftp(客户端程序)
- Windows:FileZilla、IE、Chrome、Firefox......
- lftp和ftp工具区别:
- lftp:默认是以匿名用户访问
- ftp:默认是以用户名/密码方式访问
- lftp:可以批量并且下载目录
三、FTP的两种工作模式
-
主动模式
- 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的的21号端口发起请求。
- 服务端的21号命令端口响应客户端的随机命令端口。
- 服务端的20号端口主动请求连接客户端的随机数据端口。
- 客户端的随机数据端口进行确认。
-
被动模式
- 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的的21号端口发起请求。
- 服务端的21号命令端口响应客户端的随机命令端口。
- 客户端主动连接服务端打开的大于1023的随机数据端口。
- 服务端进行确认。
思考: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服务。总结:
- 用户在ftpusers文件中,那么用户不能访问ftp服务器。
- 用户在user_list文件中,如果该文件是白名单,那么只在该文件中的用户可以访问ftp服务。
- 如果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
七、 案例应用
㈠ 任务要求
- 搭建ftp服务
- 根据需求修改配置文件
- 不允许匿名用户访问
- 指定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)
本 篇 完 结 … …
持 续 更 新 中 … …