Linux 使用FTP 服务器


快速入门 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 文件名