FTP-文件传输协议
编辑
title: "FTP-文件传输协议"
date: 2025-10-09 00:00:00
updated: 2025-09-28 00:00:00
tags: []
categories: []
draft: true
FTP-文件传输协议
一文彻底搞清楚FTP。
一、介绍
FTP(File Transfer Protocol),文件传输协议,诞生于1971年,用于在网络间交换文件。主要又两种工作模式。
1.1 主动模式
最开始只有主动模式,工作模式如下,
- 客户端随机端口 --->>> 服务器
21
控制端口 - 客户端开启高位随机端口,告诉服务器,并等待服务器连接
- 服务器
20
数据端口 --->>> 客户端高位随机端口,使用此连接进行数据传输
主动模式的 主动
就是指 服务器主动去连接客户端,进行数据传输。
问题
刚开始计算机都有公网IP,这种模式运行良好;但是,随着时代的发展,公网IP越来越少,人们开始使用内网IP、NAT技术、防火墙等,导致服务器无法成功连接客户端,此时添加了一种模式,被动模式。
1.2 被动模式
被动模式的工作模式如下,
- 客户端随机端口 --->>> 服务器
21
控制端口 - 服务器开启高位随机端口,告诉客户端,并等待客户端连接
- 客户端随机端口 --->>> 服务器的高位随机端口,使用此链接进行数据传输
被动模式的 被动
就是指 服务器 被动等待客户端来连接,进行数据传输。
二、服务器端
这里不想搞得太复杂,把SELinux关了,不然权限很繁琐。
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
2.1 vsftpd
vsftpd
(Very Secure),在Linux系统上,一款非常安全的 ftp
服务端软件,用于部署 FTP服务器
。
2.1.1 安装
- 安装
yum install -y vsftpd
- 启动
systemctl enable --now vsftpd
- 验证
ss -tnlp
[root@centos9 ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=819,fd=3))
LISTEN 0 32 *:21 *:* users:(("vsftpd",pid=11092,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=819,fd=4))
[root@centos9 ~]#
- 防火墙放行FTP
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=20/tcp
firewall-cmd --reload
2.1.2 配置
不同版本间默认配置不一样,需要自行查看修改。配置文件在 /etc/vsftpd/vsftpd.conf
中,修改配置后需要重载配置。
2.1.2.1 匿名用户配置
匿名用户 anonymous
会映射成 ftp
。默认用户在
# 全局可写配置
write_enable=YES
# 是否启用匿名用户
anonymous_enable=YES
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
# 需要全局可写激活,需要目录被ftp用户可写,需要selinux 权限通过
# 匿名用户是否可上传文件
anon_upload_enable=YES
# Uncomment this if you want the anonymous FTP user to be able to create new directories.
# 允许匿名用户创建文件夹
# 匿名用户是否可创建文件夹
anon_mkdir_write_enable=YES
[root@centos9 ~]# mkdir /var/ftp/upload
[root@centos9 ~]# chown ftp.ftp /var/ftp/upload/
[root@centos9 ~]#
这样就可以匿名用户上传或者下载文件,在upload
目录下。
默认文件权限为600
,默认文件夹权限为 700
2.1.2.2 本地用户配置
# Uncomment this to allow local users to log in.
# 是否启用本地用户
local_enable=YES
#
# 全局写权限
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
# 默认去掉的权限
local_umask=022
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
# 限制用户只能访问自己的家目录,从2.3.5版本开始,出于安全考虑,默认禁止用户在其 chroot 目录(即 FTP 根目录)拥有写权限。
chroot_local_user=YES
限制用户只能访问自己的家目录,从2.3.5版本开始,出于安全考虑,默认禁止用户在其 chroot 目录(即 FTP 根目录)拥有写权限。
lftp [email protected]:~> ls
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
两种解决方案
方案一,对限制的家目录,u-w,家目录下创建文件夹,作为ftp的上传目录。
注意,ubuntu
新建用户需要 -m
参数才能创建用户家目录
useradd ftptest
mkdir /home/ftptest/dir1
passwd ftptest
chmod u-w /home/ftptest
mkdir /home/ftptest/dir1
chown ftptest.ftptest /home/ftptest/dir1
客户端就可以在 /home/ftptest/dir1
目录下上传文件。
上传的文件夹权限为755,文件权限为644
方案二,直接允许根目录可写,跳过检查,但是这种方式不安全。
allow_writeable_chroot=YES
注:这两种解决方案感觉都不好,方案一、用户失去对家目录的写权限;方案二,不安全。
方案三:
- 在用户目录下创建
ftp
目录作为ftp根目录 ftp
目录所有者改为nobody:nogroup
,去掉ftp
所有者的写权限。- 在
ftp
目录下创建files
目录作为登录ftp后,可写的目录 - 修改配置。
# 启用本地用户
local_enable=YES
# 启用写权限
write_enable=YES
# 限制根目录
chroot_local_user=YES
# 当某个用户登录时,把配置文件里所有出现 $USER 的地方自动替换成该登录用户名。
user_sub_token=$USER
# 设置根目录
local_root=/home/$USER/ftp
2.1.2.3 额外易混淆配置
# vsftpd 用户列表
# 如果 userlist_deny=NO,则仅允许此文件中的用户访问。
# 如果 userlist_deny=YES(默认),则绝不允许此文件中的用户访问,并且
# 甚至不提示输入密码。
# 请注意,默认的 vsftpd pam 配置还会检查 /etc/vsftpd/ftpusers
# 中被拒绝的用户。
/etc/vsftpd/user_list
# Users that are not allowed to login via ftp
# 不允许通过 ftp 登录的用户
/etc/vsftpd/ftpusers
# 启用用户列表
userlist_enable=YES
# 用户列表的位置,ubuntu、centos位置不一样。
userlist_file=/etc/vsftpd.userlist
# 逻辑标识,不拒绝,就是允许,在列表中允许的用户才能连接ftp。
userlist_deny=NO
2.1.3 被动模式
被动模式FTP的数据端口不是20,默认是随机。
为了配合防火墙开放相应的端口,建议限制数据端为一个范围。
pasv_enable=YES # 启用被动模式
pasv_min_port=30000 # 被动模式最小端口
pasv_max_port=31000 # 被动模式最大端口
# 服务器防火墙配置(被动模式)
firewall-cmd --permanent --add-service=ftp # 开放控制端口21
firewall-cmd --permanent --add-port=20/tcp # 开放控制端口20
firewall-cmd --permanent --add-port=30000-31000/tcp # 开放被动模式限定的端口
firewall-cmd --reload
2.1.4 禁用shell登录
这个好玩,简单几行。
vim /bin/ftponly
#!/bin/sh
echo "This account is limited to FTP access only."
chmod a+x /bin/ftponly
echo "/bin/ftponly" >> /etc/shells
usermod ftptest -s /bin/ftponly
2.2 File-Mozilla
这款软件用server版,也有客户端版。之后补充。
三 、客户端
File-Mozilla,跨平台的连接工具,常用于Windows。
lftp,Linux连接工具,
# 连接
lftp 用户名:密码@主机
# 下载
get 文件
# 上传
put 文件 目标名称
# 切换
cd
# 创建文件夹
mkdir
# 列出文件
ls
四、封面图
- 0
- 0
-
分享