目录
一、介绍
1.概述
2.FTP的传输模式
PORT 主动模式
PASV 被动模式
3.FTP服务的作用
二、搭建FTP服务器
FTP服务端配置
1.安装vsftpd文件服务
2.启动服务
3.防火墙配置
4.FTP服务相关文件说明
FTP客户端配置
1.安装FTP客户端工具 lftp
2.访问FTP服务器
Linux系统访问FTP服务器
Windows系统访问FTP服务器
三、FTP服务配置文件
1.配置匿名用户
(1)修改配置文件
(2)创建上传目录
(3)客户端进行文件上传
(4)客户端进行目录上传
2.配置系统用户
(1)创建FTP服务专用用户
(2)将用户禁锢在自己的家目录 chroot_local_user=YES
(3)允许指定系统用户可以切换目录
(4)白名单
(5)黑名单 /etc/vsftpd/ftpusers
3.配置虚拟用户
(1)建立FTP虚拟用户的用户数据库文件
(3)创建FTP虚拟用户的映射用户
(4)建立支持虚拟用户的PAM认证文件,添加虚拟用户支持
(5)创建虚拟用户的配置文件
(6)客户端进行验证
4.常用的配置指令
5.PASV 被动模式
四、vsftpd加密传输
1.抓取vsftpd传输内容
(1)在同网段主机进行抓包
(2)客户端登录FTP操作
2.openssl+vsftpd加密传输
(1)检查是否安装了 openssl
(2)查看vsftpd是否支持openssl
(3)生成加密信息的私钥、证书、签字证书
3.修改配置文件/etc/vsftpd/vsftpd.conf
4.客户端验证
(1)同网段主机继续抓包
(2)使用第三方客户端进行登录(支持服务器类型:FTP over TLS)
(3)查看抓包信息
学习是一场马拉松,耐心和坚持是成功的关键。愿你能保持初心,好好学习,天天向上,努力成为最优秀的你。
一、介绍
1.概述
FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议族中应用层的协议之一。是一种基于TCP的协议,采用客户/服务器模式。通过FTP协议,用户可以在FTP服务器中进行文件的上传或下载等操作。
2.FTP的传输模式
控制端口:控制连接在两主机间传送控制命令,如用户身份、口令、改变目录命令等。
数据端口:数据连接只用于数据传输。
PORT 主动模式
- FTP客户端会随机使用一个高位端口N(n > 1024)与FTP服务端21端口进行连接,向服务端发送用户名和密码进行登陆;
- 登录成功后要list列表或者读取数据时,客户端开放一个N+1端口(1024以上)进行监听,发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;
- FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口(N+1)连接,发送数据;
原理如下图:
PASV 被动模式
- FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送用户名和密码进行登陆;
- 登录成功后要list列表或者读取数据时,客户端开放一个N+1端口(1024以上)进行监听,然后向服务器发送PASV命令,通知服务器自己处于被动模式。
- 服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P;
- 客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
原理如下图:
3.FTP服务的作用
FTP服务是一种提供共享文件的服务器,它的主要作用有以下几点:
(1)存储文件:FTP服务器可以存储需要传输的文件,用户可以通过FTP客户端连接到FTP服务器,并上传或下载需要的文件。
(2)管理文件:FTP服务器可以管理文件,例如创建、删除、重命名等操作。
(3)提供文件访问权限控制:FTP服务器可以对文件进行访问权限控制,例如限制用户的访问权限、控制用户的上传和下载权限等。
(4)提供匿名访问:FTP服务器可以提供匿名访问,允许用户通过FTP客户端进行匿名的文件传输。
(5)监控文件传输情况:FTP服务器可以记录和监控文件传输情况,例如记录文件传输的日志信息,以便进行后续的审计和管理。
(6)支持多用户同时传输:FTP服务器可以支持多个用户同时进行文件传输,以提高文件传输的效率。
(7)数据备份:FTP服务器可以作为网络备份的存储服务器,用于备份公司或组织的重要数据。
二、搭建FTP服务器
FTP服务端配置
1.安装vsftpd文件服务
[root@localhost ~]# yum install -y vsftpd
已加载插件:fastestmirror
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
......省略输出
已安装:
vsftpd.x86_64 0:3.0.2-29.el7_9完毕!
[root@localhost ~]#
[root@localhost ~]#
2.启动服务
systemctl start vsftpd # 启动服务
systemctl stop vsftpd # 停止服务
systemctl status vsftpd # 查看服务状态
systemctl enable vsftpd # 开启自启动
3.防火墙配置
systemctl stop firewalld # 停止防火墙
systemctl disable firewalld # 开机不启动防火墙
setenforce 0 # 关闭selinux
4.FTP服务相关文件说明
FTP客户端配置
1.安装FTP客户端工具 lftp
[root@localhost ~]# yum install -y lftp
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
......省略输出
正在安装 : lftp-4.4.8-14.el7_9.x86_64 1/1
验证中 : lftp-4.4.8-14.el7_9.x86_64 1/1已安装:
lftp.x86_64 0:4.4.8-14.el7_9完毕!
[root@localhost ~]#
2.访问FTP服务器
Linux系统访问FTP服务器
(1)客户端工具 lftp
lftp 服务端IP地址
(2)wget 工具
wget ftp://服务器IP/文件名 # 下载文件 wget -m ftp://服务器IP/目录名 # 下载目录
Windows系统访问FTP服务器
(1)浏览器访问
(2)资源管理器访问
三、FTP服务配置文件
1.配置匿名用户
登录账号:ftp和anonymous
登录密码:空
工作目录:/var/ftp
默认权限:允许下载,不允许上传。
(1)修改配置文件
# 修改配置文件之前先进行备份
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
vim /etc/vsftpd/vsftpd.conf
# 是否允许匿名用户访问
anonymous_enable=YES
# 允许上传文件
anon_upload_enable=YES
# 允许创建目录
anon_mkdir_write_enable=YES
# 允许用户进行其它操作(删除文件、覆盖文件、重命名文件)
anon_other_write_enable=YES
# 匿名用户所上传文件的权限掩码
anon_umask=022
# 限制最大传输速率 单位:bytes/秒(0为不限速)
anon_max_rate=0
每次修改完配置文件后都需要重启服务
systemctl restart vsftpd # 重启服务
(2)创建上传目录
mkdir /var/ftp/upload # 创建上传目录
chmod 777 /var/ftp/upload/ # 赋予权限
(3)客户端进行文件上传
(4)客户端进行目录上传
2.配置系统用户
登录账号:/etc/passwd文件的系统用户
登录密码:/etc/shadow文件的用户密码
工作目录:用户家目录
默认权限:drwx — —
将原有内容删除,复制以下内容
# 允许使用系统用户
local_enable=YES
# 系统用户上传的文件的默认权限
local_umask=022
# 禁锢系统用户在自己的家目录
chroot_local_user=YES
# 允许系统用户目录有写入权限
allow_writeable_chroot=YES
write_enable=YES
# 启用进入目录的欢迎信息
dirmessage_enable=YES
# 启用日志功能
xferlog_enable=YES
# 使用20端口进行数据传输
connect_from_port_20=YES
# 记录日志的格式(上传、下载)
xferlog_std_format=YES
# 使用IPv4
listen=YES
pam_service_name=vsftpd
# 限制最大传输速率(0为不限制,单位:bytes/秒)
local_max_rate=0
tcp_wrappers=YES
不删除原文,只添加以下内容即可
local_enable=YES # 是否允许本地系统用户访问 local_umask=022 #本地用户所上传文件的权限掩码 Chroot_local_user=YES # 禁锢用户在自己家目录 allow_writeable_chroot=YES # 允许系统用户目录有写入权限 local_max_rate=0 # 限制最大传输建率(字节/秒) 0为无限制
(1)创建FTP服务专用用户
-s:创建的用户不能登录系统
# 创建两个不能登录系统的用户
useradd -s /sbin/nologin user01 useradd -s /sbin/nologin user02
# 设置密码
passwd user01 passwd user02
(2)将用户禁锢在自己的家目录 chroot_local_user=YES
在vsftpd配置文件中,默认允许系统用户随意切换目录,这个行为是很危险的,需要禁止。
修改配置文件/etc/vsftpd/vsftpd.conf,添加 chroot_local_user=YES 限制系统用户在自己家目录
# 将系统用户禁锢在自己的家目录
chroot_local_user=YES
配置完将用户禁锢在主目录的指令后,再使用普通用户进行登录会出现以下报错:
原因:
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下, 则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报错,并禁止登录。
解决办法:
配置文件/etc/vsftpd/vsftpd.conf中,添加 allow_writeable_chroot=YES # 使系统用户目录有写入权限
(3)允许指定系统用户可以切换目录
# 配置文件中添加以下
# 开启读取chroot列表功能
chroot_list_enable=YES
# 写在/etc/vsftpd/chroot_list文件里面的用户是切换目录的
chroot_list_file=/etc/vsftpd/chroot_list
再创建chroot_list文件
touch /etc/vsftpd/chroot_list # 创建切换目录白名单
echo 'user02' 1>> /etc/vsftpd/chroot_list # 添加用户到白名单中,一行一个用户
验证
(4)白名单
userlist_enable=YES&&userlist_deny=NO # 仅允许/etc/vsftpd/user_list文件中的用户登录FTP
userlist_enable=YES&&userlist_deny=YES # 禁止/etc/vsftpd/user_list文件中的用户登录FTP
配置文件中添加
userlist_enable=YES userlist_deny=NO
添加用户进白名单
echo 'user01' 1>> /etc/vsftpd/user_list
验证
(5)黑名单 /etc/vsftpd/ftpusers
添加进此文件中的用户都禁止登录FTP,立即生效,无需重启服务(权限高于白名单)
验证
3.配置虚拟用户
(1)建立FTP虚拟用户的用户数据库文件
vim vsftpd.user # 文件名字可随便定义 文件内容格式:奇数行为用户名,偶数行为用户密码 user01
123
user02
123
user03
123
(2)将虚拟用户文件转换为DB数据库格式文件
db_load -T -t hash -f vsftpd.user vsftpd.db
-T:允许应用程序能够将文本文件转译载入进数据库文件;
-t:指定转译成什么数据库类型;
-f:包含用户名和密码的文本文件;
修改数据库文件的权限,保证其安全性
chmod 600 vsftpd.db
(3)创建FTP虚拟用户的映射用户
由于虚拟用户不是系统用户,没有自己的家目录,所以需要创建一个系统用户,用它的家目录给虚拟用户当做工作目录(家目录);
useradd -s /sbin/nologin virtual
(4)建立支持虚拟用户的PAM认证文件,添加虚拟用户支持
cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
编辑复制的文件vsftpd.pam(清空所有内容,复制以下两行)
auth required pam_userdb.so db=/etc/vsftpd/vsftpd
account required pam_userdb.so db=/etc/vsftpd/vsftpd
在vsftpd.conf配置文件中修改、添加以下内容
# 修改
pam_service_name=vsftpd.pam
# 添加
guest_enable=YES # 允许使用虚拟用户功能
gue_username=virtual # 指定虚拟用户的映射用户
user_config_dir=/etc/vsftpd/dir # 虚拟用户配置文件的目录(需要自己创建)
(5)创建虚拟用户的配置文件
创建虚拟用户配置文件的目录
mkdir /etc/vsftpd/dir
创建虚拟用户配置文件(虚拟用户的配置指令与匿名用户的配置指令是相同的)
先把主配置文件vsftpd.conf中匿名用户的所有配置指令注释掉
修改虚拟用户配置文件
cd /etc/vsftpd/dir/ vim user01
# 添加以下内容
allow_writeable_chroot=YES # 允许用户的家目录有写入权限 anon_upload_enable=YES # 允许用户上传 vim user02 # 添加以下内容 allow_writeable_chroot=YES # 允许用户的家目录有写入权限 anon_mkdir_write_enable=YES # 允许用户创建文件 vim user03 allow_writeable_chroot=YES # 允许用户的家目录有写入权限 anon_upload_enable=YES # 允许用户上传文件(为了覆盖文件开启的) anon_other_write_enable=YES # 允许用户进行其它操作(删除、覆盖、重命名文件)
注意:请给映射用户家目录添加 o+r 权限,让虚拟用户拥有读取权限;
(6)客户端进行验证
4.常用的配置指令
listen=YES #是否以独立运行的方式监听服务listen_address=192.168.10.112 #设置监听FTP服务的IP地址listen_port=21 #设置监听FTP服务的端口号write_enable=YES #是否启动写入权限(上传、删除文件)download_enable=YES #是否允许下载文件dirmessage_enable=YES #用户切换目录显示.message文件xferlog_enable=YES # 启用日志文件,记录到/var/log/xferlogxferlog_std_format=YES # 启用标准的xferlog日志格式,禁用此项将使用vsftpd自己的格式connect_from _port_20=YES # 允许服务器主动模式 (从20端口建立数据连接)pasv_enabTe=YES # 允许服务器被动模式
pasv_max_port=24600 # 设置被动模式服务器的最大端口号
pasv_min_port=24500 # 设置黄动模式服务的最小端口pam_service_name=vsftpd # 用户认证的PAM文件userlist_enable=YES # 是否启用user_list列表文件
userlist_deny=YES # 是否禁用user_list中的用户max_cIients=0 #限制并发客户端连接数max_per_ip=0 # 限制同一IP地址的井发连接数
tcp_wrappers=YES #是否启用tcp_wrappers主机访问控制chown_username=root #表示匿名用户上传的文件的拥有人是root,默认关闭ascii_upload_enable=YES # 表示是否允许用户可以上传一个二进制文件,默认不允许ascii_download_enable=YES #代表是否允许用户下载个一个二进制文件,默认不允许
nopriv_user=vsftpd #设置支撑vsftpd服务的宿主用户为手动建立的vsftpd用户async_abor_enable=YES # 设定支持异步传输功能
ftpd_banner=welcome to Awei FTP servers # 设定vsftpd的登录标语
guest_enable=YES # 设置启用虚拟用户功能guest_username=ftpuser # 指定虚拟用户的宿主用户virtual_use_local_privs=YES # 设定虚拟用户的权限符合他们的宿主用户user_config_dir=/etc/vsftpd/vconf # 设定虚拟用户个人vsftp的配置文件存放路径
5.PASV 被动模式
在 /etc/vsftpd/vsftpd.conf 配置文件中添加以下内容
pasv_enable=YES # 开启被动模式
pasv_min_port=3000(大于1024) # 数据连接最小端口
pasv_max_port=5000 # 数据传输最大端口
验证
客户端下载文件,进行数据传输
服务端查看端口
四、vsftpd加密传输
1.抓取vsftpd传输内容
因为vsftpd是明文传输,所以使用抓包工具可以抓取vsftpd传输的内容
使用tcpdump抓包工具
tcpdump -i 网卡名 -nn -X -vv tcp port 21(服务器端口) and ip host 来源ip(客户端VMnet8网卡IP)
-i:指定需要监听的网卡;
-n: 对回显的信息以数字方式显式,例如地址回显为192.168.157.1,否则显式为主机名;
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名;
-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出;
-vv:产生更详细的输出;
(1)在同网段主机进行抓包
(2)客户端登录FTP操作
2.openssl+vsftpd加密传输
(1)检查是否安装了 openssl
rpm -q opessl
(2)查看vsftpd是否支持openssl
ldd命令用于打印程序或者库文件所依赖的共享库列表。
[root@localhost virtual]# which vsftpd /usr/sbin/vsftpd
[root@localhost virtual]#
[root@localhost virtual]#
[root@localhost virtual]# ldd /usr/sbin/vsftpd | grep libssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007ff14cf2d000)
[root@localhost virtual]#
(3)生成加密信息的私钥、证书、签字证书
后缀:
- .key:服务器私钥;
- .csr:服务器证书;
- .crt:签字证书;
请注意:服务器所有私钥、证书和签字证书都是存储在/etc/ssl/certs/
a.生成服务器私钥
openssl genrsa -out vsftpd.key 1024
-genrsa:用于生成私钥;
-out:输出文件;
b.通过私钥生成服务器的证书
openssl req -new -key vsftpd.key -out vsftpd.csr
req:生成证书请求;
-new:新的请求;
-key:用于签名待生成的请求证书的私钥文件;
-out:待输出的文件;
c.生成签字证书
openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
-req:签字证书请求;
-days:签字证书生效时间;
-sha256:签字证书加密方式;
-in:输入文件;
-out:输出文件;
d.把/etc/ssl/certs/目录的权限设置为500,这是必须要做的操作!
chmod 500 /etc/ssl/certs
请注意:在实验环境中可以通过命令行生成CA证书,但在生产环境中必须向CA证书厂商申请注册(否则浏览器不识别)。
3.修改配置文件/etc/vsftpd/vsftpd.conf
# 开启ssl证书功能
ssl_enable=YES
# 支持ssl1-3的版本
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
# 允许匿名用户(虚拟用户)使用ssl证书功能
allow_anon_ssl=YES
# 强制匿名用户(虚拟用户)登录时使用ssl证书功能
force_anon_logins_ssl=YES
# 强制匿名用户(虚拟用户)传输数据时使用ssl证书功能
force_anon_data_ssl=YES
# 强制系统用户登录时使用ssl证书功能
force_local_logins_ssl=YES
# 强制系统用户传输数据时使用ssl证书功能
force_local_data_ssl=YES
# 服务器签字证书存储位置
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
# 服务器私钥存储位置
rsa_private_key_file=/etc/ssl/certs/vsftpd.key