快速入门 FTP 服务
1)介绍 FTP 服务
FTP( File Transfer Protocol,文件传输服务 )提供在 Internet 上的任意两台计算机之间相互进行的文件传输。只要双方主机都支持 FT P协议,就可以利用FTP来进行文件传输。
FTP 是一种在互联网中进行文件传输的协议,基于 C/S 模式,默认服务端口号是 20、21
20 端口 用于数据传输、21 端口 用于接收客户端的 FTP 命令与参数。
FTP 服务器( Server ) 按照 FTP 协议在互联网上提供 文件存储与文件访问的服务FTP 客户端( Client ) 用于 向服务器索要资源
FTP工作模式 主要分为两种
- 主动模式(PORT):FTP 服务器 主动向客户端发起连接请求
- 被动模式(PASV):FTP 服务器 等待客户端发起连接请求。
2)安装 FTP 服务
FTP 是一种文件传输协议,实现这种协议的工具,有一款 Linux 平台上的程序,名为 vsftpd( Ver Secure FTP Daemon,非常安全的 FTP 守护进程 )
基于 CentOS 平台, 可以直接使用 Yum 工具安装
[root@ftp-server ~] yum info vsftpd
[root@ftp-server ~] yum install vsftpd -y
# 注意关闭防火墙规则
[root@ftp-server ~] iptables -F
[root@ftp-server ~] systemctl disable --now firewalld
3)vsftpd 配置文件
注意:配置文件不得有任何莫名其妙的空格!否则会重启失败
# 过滤出非注释行, 非空行
[root@ftp-server ~] grep -vE '^#|^$' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES # 是否开启匿名用户允许访问
local_enable=YES # 是否允许本地用户登录FTP
write_enable=YES # write_enable=YES # 全局设置, 是否容许写入, 开启允许上传的权限
local_umask=022 # 本地用户上传文件的 umask
dirmessage_enable=YES # 允许为目录配置显示信息, 显示每个目录下面的 message_file 文件的内容
xferlog_enable=YES # 开启日志功能, 以及存放路径
xferlog_file=/var/log/vsftpd.log # 日志路径
connect_from_port_20=YES # 使用 20 端口进行连接
xferlog_std_format=YES # 标准日志格式
listen=YES # 绑定到监听端口
listen_ipv6=YES # 开启 ipv6
pam_service_name=vsftpd # 设置 PAM 的名称
userlist_enable=YES # 设置用户已列表, 允许或是禁止
tcp_wrappers=YES # 控制主机访问, 检查 /etc/hosts.allow hosts.deny 的配置达到防火墙作用
4)vsftpd 服务程序
vsftpd 允许用户 三种认证模式 登录到 FTP 服务器。
- 本地用户模式:基于 Linux 本地账号密码进行认证,配置简单,但是一旦被破解,服务器信息就很危险
- 匿名用户模式:任何人无需密码直接登录
- 虚拟用户模式:单独为 FTP 创建用户数据库,基于口令验证账户信息,只适用于 FTP 服务,不会影响其他用户信息,最为安全。
5)安装 FTP 客户端
FTP 客户端有多种形式,图形化、命令行
# Linux 客户端
yum install ftp -y
# Windows 客户端
FileZilla_Pro_3.66.5_64bit_Green
image.png
方案一:匿名用户模式
匿名用户模式是 最不安全的方式,一般用在访问不重要的,允许公开的文件,且放在企业内网环境中,置于防火墙规则下,保证基本的安全性。
vsftpd 默认开启了 匿名用户模式
修改配置文件:定义匿名用户的权限,如下
[root@ftp-server ~] grep '^anon' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES # 允许匿名访问
anon_upload_enable=YES # 允许匿名用户上传
anon_mkdir_write_enable=YES # 允许匿名用户创建目录
anon_other_write_enable=YES # 允许匿名用户修改目录
[root@ftp-server ~] vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES # 取消注释
anon_mkdir_write_enable=YES # 取消注释
anon_other_write_enable=YES # 添加配置
image.png
重启服务,且加载开机自启
[root@ftp-server ~] systemctl restart vsftpd # 重启服务
[root@ftp-server ~] systemctl enable --now vsftpd # 开启自启
此时可以使用 FTP 命令连接到 FTP 服务器了。
匿名用户连接上 FTP 服务端,访问的是目录默认是 /var/ftp( FTP 匿名用户的默认根目录 )
[root@ftp-server ftp] pwd
/var/ftp
[root@ftp-server ftp] ls
pub
使用 FTP 客户端命令,连接 FTP 服务端
C:\Users\WangJ>ftp 192.168.8.8 # 连接 FTP 服务器的 IP 地址
连接到 192.168.8.8
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.8.8:(none)): anonymous# 填入匿名用户默认的账号 ( 也可以使用 ftp 用户名 )
331 Please specify the password.
密码: # 密码为空, 直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
pub
226 Directory send OK.
ftp: 收到 8 字节,用时 0.00秒 8.00千字节/秒。
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir wangj # 注意: 发现在这里创建文件夹报错了
550 Create directory operation failed.
我们使用 FTP 匿名用户 成功登录 FTP SERVER,默认访问的是 /var/ftp 文件夹
现在我们来检查下文件夹权限
[root@ftp-server ftp] pwd
/var/ftp
[root@ftp-server ftp] ll
total 0
drwxr-xr-x 2 root root 6 Jun 10 2021 pub
如上得知,因为 Pub 文件夹,在 Linux 系统层面属于 root 用户。因此系统层面的 ftp 用户无法向其写入内容。
解决方式:授权 FTP 用户针对 Pub 目录拥有 可读可写可执行 的权限
# 检查系统用户 ftp
[root@ftp-server ftp] id ftp
uid=14(ftp) gid=50(ftp) groups=50(ftp)
# 收取 pub 文件夹的目录权限给 ftp 用户
[root@ftp-server ftp] setfacl -m u:ftp:rwx /var/ftp/pub # 递归处理所有的文件及子目录, 去除错误信息
再次使用 匿名用户 登录 FTP SERVER,写入数据( 成功 )
测试基于 匿名用户 FTP 针对 Pub 目录 增删改查
C:\Users\WangJ>ftp 192.168.8.8
连接到 192.168.8.8。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.8.8:(none)): ftp # 基于匿名用户 FTP 登录
331 Please specify the password.
密码: # 密码直接回车即可
230 Login successful.
ftp> cd pub # 切换至 Pub 目录
ftp> mkdir wangj666 # 测试: 创建文件夹
257 "/pub/wangj666" created
ftp> rename wangj666 wangj888 # 测试: 重命名文件夹
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir wangj888 # 测试: 删除文件夹
250 Remove directory operation successful.
此时成功写入了 FTP 文件夹数据,服务器上检查文件信息
[root@ftp-server pub] pwd
/var/ftp/pub
[root@ftp-server pub] ls
wangj666 wangj888
[root@ftp-server pub]
方案二:本地用户模式
使用 Linux 本地用户模式( 基于系统层面的用户 ),比匿名用户模式更安全
修改配置文件:关闭匿名模式,开启本地用户模式
相关配置文件
[root@ftp-server pub] ls /etc/vsftpd/
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
修改配置文件如下 /etc/vsftpd/vsftpd.conf
[root@ftp-server pub] vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO # 关闭匿名用户模式
local_enable=YES # 开启本地用户模式
write_enable=YES # 设置可写权限
local_umask=022 # 文件 umask 值
userlist_enable=YES # 启用【禁止登录的用户名单】文件名是, ftpusers, user_list
userlist_deny=YES # 开启禁止登录名单
重启 vsftpd 服务,加载配置
[root@ftp-server pub] systemctl restart vsftpd
[root@ftp-server pub] systemctl enable --now vsftpd
此时即可以使用 FTP 客户端进行连接了,使用 FTP-SERVER 的 Linux 本地用户 信息登录即可
假设当前服务器上用户管理中存在一个用户 wangj
# 创建系统用户
[root@ftp-server ~] useradd wangj
[root@ftp-server ~] echo 123456 | passwd --stdin wangj
# 验证用户信息
[root@ftp-server ~] grep 'wangj' /etc/passwd
wangj:x:1000:1000::/home/wangj:/bin/bash
此时 FTP 客户端 可以使用此用户 连接 FTP
默认访问的是 该用户的家目录 也就是 /home/wangj 文件夹内容
// 使用 FileZilla 客户端连接 FTP-SERVER
// 并测试使用 Linux 系统用户登录, 成功连接 ( 并实现针对该目录增删改查 )
image.png
注意:有些系统用户可能无法登录 FTP-SERVER( 例如 root 用户 ), 因为 vsftpd 有一个名单,名单内的用户禁止登录( 类似黑名单 )
( 黑名单文件: ftpusers, user_list )
[root@ftp-server vsftpd] pwd
/etc/vsftpd
[root@ftp-server vsftpd] ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
# 文件中写入的名字, 都是禁止登录的
[root@ftp-server vsftpd] cat 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 用户 )
C:\Users\WangJ>ftp 192.168.8.8
连接到 192.168.8.8。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.8.8:(none)): root
530 Permission denied. # Linux 系统的 root 用户不被允许登录 FTP 服务器
登录失败。
image.png
方案三:虚拟用户模式( 推荐 )
了解了有 匿名用户、本地用户、再来了解下 虚拟用户模式
顾名思义是 虚拟创建出的用户,也是最为安全的一种模式。
首先安装 Berkeley DB 工具
yum install db4 db4-utils -y
创建用于进行 FTP 认证的用户数据库,奇数行 账户名、偶数行 密码
[root@ftp-server vsftpd] vim /etc/vsftpd/ftp_user.txt
wangj
123456
wangjun
654321
由于这样的明文信息很不安全,且 vsftpd 也无法加载该格式的数据
因此我们还需要用 db_load 命令对 ftp_user.txt 文件数据加密,并设置权限使得普通用户无权限查阅。
# 创建加密文件 -T 和 -t 参数必须加上
# 用于转化普通文本为 vsftpd 识别的数据库文件
[root@ftp-server vsftpd] db_load -T -t hash -f /etc/vsftpd/ftp_user.txt /etc/vsftpd/ftp_user.db
# 检查文件属性
[root@ftp-server vsftpd] file ftp_user.db
ftp_user.db: Berkeley DB (Hash, version 9, native byte-order)
# 规避安全风险
[root@ftp-server vsftpd] ll ftp_user.db
-rw-r--r-- 1 root root 12288 Apr 8 19:10 ftp_user.db
[root@ftp-server vsftpd] chmod 600 ftp_user.*
[root@ftp-server vsftpd] ll ftp_user.*
-rw------- 1 root root 12288 Apr 8 19:10 ftp_user.db
-rw------- 1 root root 28 Apr 8 19:10 ftp_user.txt
创建一个虚拟用户登录后 默认访问的文件夹路径 且和 Linux 中的一个本地用户做一个映射关系,防止匿名用户登录后 访问到该文件夹,但是系统没有此用户,报错目录权限问题
# 新建一个用户, 指定用户家目录, 且禁止登录
[root@ftp-server vsftpd] useradd -d /var/ftpdir -s /sbin/nologin vuser
# 授权此 ftpdir 的属性
[root@ftp-server vsftpd] setfacl -m u:vuser:rwx /var/ftpdir
# 添加 vuser 用户至 ftpusers 禁止用户登录文件
# 增大系统安全, 但是不会影响虚拟用户的登录
[root@ftp-server vsftpd] echo 'vuser' >> ftpusers
此时需要创建支持虚拟用户的 PAM 文件,PAM 是一组安全机制的模块,编辑认证文件 /etc/pam.d/vsftpd
# 备份原有的 PAM 配置文件
[root@ftp-server pam.d] mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd_bak
# 编写新的 PAM 配置文件
# 注意 db 参数指定的是 db_load 生成的文件路径,无需添加后缀
[root@ftp-server pam.d] vim /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/ftp_user
account required pam_userdb.so db=/etc/vsftpd/ftp_user
最后修改 vsftpd 配置文件
[root@ftp-server pam.d] grep -Ev '^$|^#' /etc/vsftpd/vsftpd.conf
anonymous_enable=NO # 禁止匿名模式
local_enable=YES # 允许本地用户
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd # 指定 PAM 认证文件
userlist_enable=YES
userlist_deny=YES
tcp_wrappers=YES
guest_enable=YES # 开启虚拟用户
guest_username=vuser # 指定虚拟用户账号
allow_writeable_chroot=YES # 如果用户被限制只能在其家目录, 允许用户可以对家目录写入数据
# 重启 FTP 服务
[root@ftp-server pub] systemctl restart vsftpd
【针对不同的虚拟用户设置不同的权限】
用户 FTP 认证的虚拟账号:ftp_user.txt
- wangj,允许上传,新建,修改,查看,删除权限
- wangjun,只读权限
这样的需求可以通过 vsftpd 配置文件实现
定义 user_config_dir参数实现:不同的虚拟用户基于不同的配置文件定义不同的操作权限
# 新建管理虚拟用户权限的文件夹
[root@ftp-server vsftpd] mkdir /etc/vsftpd/virtual_user_dir
# 进入文件夹,创建权限的配置文件
[root@ftp-server vsftpd] cd /etc/vsftpd/virtual_user_dir/
# 允许上传, 新建,修改,查看,删除权限
[root@ftp-server virtual_user_dir] vim wangj
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
# 再创建一个 wangjun 文件, 禁止写入
[root@ftp-server virtual_user_dir] vim wangjun
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
编辑 vsftpd 主配置文件,添加如下一行
[root@ftp-server virtual_user_dir] vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/virtual_user_dir # 指向我们刚创建的用户配置目录
重启 vsftpd 服务,注意:配置文件,不得有任何莫名其妙的空格!否则会重启失败
systemctl restart vsftpd
此时使用 FTP 客户端登录用户 wangj,进行读写
image.png
使用 wangjun 用户登录 FTP 服务端,查看是否能够读写
image.png
如上案例,两个虚拟用户访问的是 同一个 FTP 跟目录,我们也可以在各自虚拟用户的配置文件中定义各自访问的 FTP 跟目录( 使用 local_root=/var/ftpdir/xxx 选项 )
Ubuntu安装VSFTP服务
# Ubuntu 安装vsftpd
sudo apt -y install vsftpd
开机自启动
systemctl enable vsftpd
Ubuntu22.04配置文件:/etc/vsftpd.conf
Ubuntu配置
cp /etc/vsftpd.conf /etc/vsftpd.conf.bak grep -v "^#" /etc/vsftpd.conf.bak >/etc/vsftpd.conf
文件参数说明:
```ini
anonymous_enable=NO #是否开启匿名登录
local_enable=YES #是否允许本地用户登录
write_enable=YES #是否允许上传
local_umask=022 #默认的umask码
# 它将上传文件夹权限更改为777-022 = 755(rwxr-xr-x)
# 并将上传文件权限更改为666-022 = 644(rw-r--r--)
dirmessage_enable=YES #是否显示目录说明文件
xferlog_enable=YES #是否记录ftp传输过程
connect_from_port_20=YES #是否确定端口传输来自20
xferlog_std_format=YES #是否使用标准的ftp xferlog模式
chroot_list_enable=YES #是否将系统用户限制在自己的home目录下
listen=YES #是否开启监听
pam_service_name=vsftpd #服务名称
anon_mkdir_write_enable=NO #是否允许匿名用户创建目录
修改配置文件后需要重启服务
systemctl restart vsftpd
# 创建普通用户,使用ftp进行文件传输
useradd tom
passwd tom
su - tom
cd /home/tom
touch 1.txt
客户端安装ftp
yum -y install ftp
客户端连接ftp服务端
ftp 192.168.8.35 #(服务端ip)
用户名
测试下载文件到客户端
get 1.txt
客户端上传文件到服务端
put a.txt
sftp 安全的ftp
SFTP(SSH File Transfer Protocol)是一种基于SSH(安全外壳)的安全的文件传输协议,使用SFTP协议可以在文件传输过程中提供一种安全的网络的加密算法,从而保证数据的安全传输。
SFTP在Linux操作系统中,默认的端口客是22,传输提供了密码和密钥验证机制,可以有效防止传输过程的威胁和攻击。
只需要安装好ssh的服务端,就可以使用sftp服务,端口是22.
#密码登录
sftp -P 22 test@192.168.8.15
#密钥登录
sftp -P 22 -i ~/.ssh/id_rsa test@192.168.8.15
#当前工作目录:
pwd
#查看当前目录下文件:
ls
ls -la
# 切换目录:
cd
#本地工作目录:
lpwd
#查看本地工作目录下的文件:
lls
#切换本地工作目录:
lcd dirname
#下载服务器文件到本地
get remote_file_name
#重命名
get remote_file_name local_file_name
#递归
get -r some_directory_name
#保持原来文件属性和日期
get -Pr some_directory_name
#上传本地文件到远程服务器
put localFile
#递归
put -r local_directory_name
lrzsz
lrzsz是使用ssh进行sftp传输的一个软件
yum -y install lrzsz
rz 上传
sz 下载
sz 文件名