FTP服务
FTP(File Transfer Protocol,文件传输协议)是一种网络协议,用于在计算机系统之间传输文件。它支持在客户端和服务器之间进行文件的上传和下载操作,实现远程文件共享和统一管理。FTP协议工作在TCP/IP协议簇之上,使用TCP协议进行数据传输,以保证传输的可靠性和共享性
FTP连接及传输模式
- 控制连接:TCP协议21端口,用于发送FTP命令信息
- 数据连接:TCP协议20端口,用于上传、下载数据
- 数据连接的建立类型
- 主动模式:服务端从20端口主动向客户端发起连接
- 被动模式:服务端在指定范围内的某个端口被动等待客户端连接
FTP传输模式
- 文本模式:ASCII模式,以文本序列传输数据
- 二进制模式:Binary模式,以二进制序列传输数据
FTP用户认证
- 匿名用户: ftp,anonymous, 对应Linux用户ftp
- 系统用户: Linux用户,用户/etc/passwd,密码/etc/shadow
- 虚拟用户: 特定服务的专用用户,独立的用户/密码文件
vsftpd配置文件
/etc/vsftpd/vsftpd.conf
常用匿名用户FTP配置项
- anonymous_enable=YES:启用匿名访问
- anon_umask=022:匿名用户所上传问价的权限掩码
- anon_root=/var/ftp:/匿名用户的FTP根目录
- anon_upload_enable=YES:允许上传文件
- anon_mkdir_write_enable=YES:允许创建目录
- anon_other_write_enable=YES:开放其他写入权
- anon_max_rate=0:限制最大传输速率(字节/秒)
常用的本地用户FTP配置项
- local_enable=YES:是否启用本地系统用户
- local_umask=022:本地用户所上传文件的权限掩码
- local_root=/var/ftp:设置本地用户的FTP根目录
- chroot_local_user=YES:是否将用户禁锢在主目录
- allow_writeable_chroot=YES:允许写入根
- local_max_rate=0:限制最大传输速率(字节/秒)
搭建FTP服务实验
基础设备
设备 | 系统 | IP |
虚拟机 | CentOS7 | 192.168.78.129 |
虚拟机 | / | / |
基础环境(服务端)
静态IP
vi /etc/sysconfig/neteork-scripts/ifcfg-ens33 //ens33网卡的配置文件
#内容如下
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" //将获取IP方式改为静态static获取
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2ce64331-c359-4e02-8297-4b279599dd47"
DEVICE="ens33"
ONBOOT="yes"
#添加网络信息
IPADDR="192.168.78.129" //IP地址
NETMASK="255.255.255.0" //子网掩码
GATEWAY="192.168.78.2" //网关
DNS1="192.168.78.2" //dns
DNS2="114.114.114.114" //dns
#重启服务
systemctl restart network
关闭防火墙
systemctl stop firewalld //关闭防火墙
systemctl disable firewalld //禁止开机自启动
关闭selinux
修改配置文件内的SELINUX=disabled
vi /etc/selinux/config //selinux的配置文件
#内容如下
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled //将SELINUX改为disabled
下载安装vsftpd服务
yum -y install vsftpd
匿名用户认证
修改配置文件配置
#编辑vsftpd配置文件
vi /etc/vsftpd/vsftpd.conf
#添加以下内容,也可以在配置文件中找到并取消注释修改,配置内容的意思在本文章上面有解释
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#启动服务
systemctl start vsftpd
systemctl enable vsftpd
修改共享文件夹权限
#修改文件夹属主,使匿名用户拥有读写权限
chown ftp /var/ftp/pub
[root@localhost ftp]#ls -l
总用量 0
drwxr-xr-x 2 ftp root 22 6月 13 23:22 pub
客户端测试匿名认证
CentOS7客户端
下载ftp服务
yum -y install ftp
连接ftp服务器
[root@localhost ~]# ftp 192.168.78.129 #连接服务器端,表示连接ftp服务器,192.168.78.129是ftp服务器地址
Connected to 192.168.78.129 (192.168.78.129).
220 (vsFTPd 3.0.2)
Name (192.168.78.129:root): ftp #匿名用户使用ftp或anonymous登录
331 Please specify the password.
Password: #匿名用户没有密码,直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
#ls可以看到存在一个共享文件夹pub
ftp> ls
227 Entering Passive Mode (192,168,78,129,173,236).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 22 Jun 13 15:22 pub
226 Directory send OK.
进入共享文件夹下载文件
下载到客户端的文件将会保存在进入连接ftp时的目录下
#get下载文件
ftp> get test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (192,168,78,129,220,177).
150 Opening BINARY mode data connection for test.txt (7 bytes).
226 Transfer complete.
7 bytes received in 4.8e-05 secs (145.83 Kbytes/sec)
ftp> quit
221 Goodbye.
[root@localhost ~]# ls
anaconda-ks.cfg test.txt
上传文件,文件会被上传到/var/ftp/pub目录下
#上传文件使用put,当前是客户端root用户家目录下文件anaconda-kc.cfg
ftp> cd pub #进入pub共享文件夹
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,78,129,243,187).
150 Ok to send data.
226 Transfer complete.
1257 bytes sent in 0.00629 secs (199.78 Kbytes/sec)
win客户端
在win文件资源管理器路径上输入ftp://ftp服务器ip 便可以访问到ftp共享文件夹,ftp://表示使用ftp协议访问
本地用户认证
本地用户登录也就是使用服务端用户登录
在服务端创建一个测试本地用户认证的用户
useradd zhangsan #创建用户
passwd zhangsan #设置密码
修改vsftpd配置文件
#编辑vsftpd配置文件
vi /etc/vsftpd/vsftpd.conf
#添加以下内容,也可以在配置文件中找到并取消注释修改,配置内容的意思在本文章常见匿名用户配置项有解释
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
#启动服务
systemctl start vsftpd
systemctl enable vsftpd
控制用户访问权限
/etc/vsftpd/user_list 和 /etc/vsftpd/ftpusers是 vsftpd FTP 服务器使用的两个重要文件,用于控制用户访问权限
/etc/vsftpd/ftpusers:
这个文件包含了一个用户列表,列表中的用户将被拒绝通过 FTP 访问服务器。
默认情况下,这个文件通常包含如 root, bin, daemon, adm, lp, sync, shutdown, halt, mail, news, uucp, operator, games, gopher, ftp, nobody, www-data, backup, list, irc 和 gnats 等系统或服务用户。这些用户由于具有特殊的系统权限或用于特定的服务,因此不应通过 FTP 访问服务器,以避免安全风险
/etc/vsftpd/user_list:
这个文件的作用取决于 vsftpd 配置文件中的 userlist_deny 和 userlist_enable 设置。
当配置文件中 userlist_enable=YES 时,vsftpd 会检查这个文件,
如果配置文件 userlist_deny=YES(默认值),则 user_list 文件中的用户将被拒绝访问 FTP 服务器。这类似于 ftpusers 文件,但通常用于定义额外的用户限制。
如果配置文件 userlist_deny=NO,则只有列在 user_list 文件中的用户才被允许访问 FTP 服务器,其他所有用户都将被拒绝。这可以用于创建一个只允许特定用户访问的白名单
#编辑服务器端配置文件
vi /etc/vsftpd/vsftpd.conf
#加入如下配置,表示启用user_list白名单
userlist_deny=NO
#编辑白名单文件
vi /etc/vsftpd/user_list
#在里面加入我们测试的用户
zhangsan
#重新启动服务
systemctl restart vsftpd
CentOS7客户端本地用户认证测试
客户端连接ftp服务器
ftp 192.168.78.129
Connected to 192.168.78.129 (192.168.78.129).
220 (vsFTPd 3.0.2)
Name (192.168.78.129:root): zhangsan #这里使用服务端创建的测试用户登录
331 Please specify the password.
Password: #输入密码
230 Login successful. #连接成功
Remote system type is UNIX.
Using binary mode to transfer files.
上传文件
本地用户认证上传的文件将会保存在服务器端用户的家目录下
ftp> put anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,78,129,111,27).
150 Ok to send data.
226 Transfer complete.
1257 bytes sent in 4.5e-05 secs (27933.33 Kbytes/sec)
#服务器端查看
ls /home/zhangsan/
anaconda-ks.cfg
下载文件
本地用户认证下载是从服务器端用户的家目录下载,下载到客户端的文件将会保存在进入连接ftp时的目录下
ftp> ls
227 Entering Passive Mode (192,168,78,129,252,64).
150 Here comes the directory listing.
-rw-r--r-- 1 1000 1000 1257 Jun 13 15:52 anaconda-ks.cfg
-rw-r--r-- 1 0 0 6 Jun 13 15:53 dd.txt
226 Directory send OK.
ftp> get dd.txt
local: dd.txt remote: dd.txt
227 Entering Passive Mode (192,168,78,129,98,255).
150 Opening BINARY mode data connection for dd.txt (6 bytes).
226 Transfer complete.
6 bytes received in 2.3e-05 secs (260.87 Kbytes/sec)
虚拟用户认证
- 虚拟用户
- 所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
- 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
- 虚拟用户账号的存储方式
- 文件:编辑文本文件,此文件需要被编码为 hash 格式奇数行为用户名,偶数行为密码
创建虚拟映射的宿主用户、ftp根目录
#创建用户virtual_user 家目录为/var/ftproot,不允许登录系统
useradd -d /var/ftproot -s /sbin/nologin virtual_user
#权限设置为用户可读写,其他的只读
chmod 755 /var/ftproot
建立虚拟用户账号数据库
创建文件
vi /etc/vsftpd/vusers.list
#内容如下
lisi
123
zhaoliu
123
#进入csftpd目录
cd /etc/vsftpd/
#使用db_load工具生成数据库文件
db_load -T -t hash -f vusers.list vusers.db
#设置数据库文件权限,用户读写(所有vusers.开头的文件都设置为用户读写权限)
chmod 600 /etc/vsftpd/vusers.*
为虚拟用户创建PAM认证文件
vi /etc/pam.d/vsftpd.vu
#内容如下
#在进行身份验证时,vsftpd服务将使用pam_userdb.so模块来验证用户凭据。db=/etc/vsftpd/vusers指定了用户数据库文件的路径,这个文件包含了用户的用户名和密码信息
auth required pam_userdb.so db=/etc/vsftpd/vusers
#在进行账户检查时,vsftpd服务将再次使用pam_userdb.so模块来检查用户的账户状态,例如是否被禁用或过期。同样,db=/etc/vsftpd/vusers指定了用户数据库文件的路径
account required pam_userdb.so db=/etc/vsftpd/vusers
修改vsftpd配置文件
vi /etc/vsftpd/vsftpd.conf
#内容如下
anonymous_enable=YES //匿名用户
anon_umask=022
#anon_upload_enable=yes
#anon_mkdir_write_enable=yes
#anon_other_write_enable=yes
local_enable=YES //本地用户
write_enable=YES
local_umask=022
chroot_local_user=yes
allow_writeable_chroot=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.vu //指定虚拟用户使用的pam文件(虚拟用户,在文件中添加这三行便可以及本地用户便可)
guest_enable=yes
guest_username=virtual_user //虚拟用户的宿主用户
userlist_enable=YES
#userlist_deny=no
tcp_wrappers=YES
为每个虚拟账户建立独立的权限
#为每个用户创建独立的配置文件
#编辑vsftpd配置文件
vi /etc/vsftpd/vsftpd.conf
#添加以下配置
user_config_dir=/etc/vsftpd/vusers_dir //虚拟用户配置文件目录
#创建目录
mkdir /etc/vsftpd/vusers_dir
#创建与虚拟用户名称对应的配置文件
vi /etc/vsftpd/vusers_dir/lisi
#内容如下
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
虚拟用户上传下载的文件会在映射宿主用户家目录下