一、FTP基础解释
FTP(File Transfer Protocol,文件传输协议)是一种用于通过网络在不同计算机之间传输文件的尺度协议。它基于客户端-服务器架构,允许用户通过网络将文件上传到服务器或从服务器下载文件。
二、FTP工作原理
2.1 客户端-服务器模子
FTP接纳客户端-服务器架构(c/s)。用户使用FTP客户端软件(如FileZilla、WinSCP等)来与FTP服务器进行交互。客户端可以通过FTP命令访问和操作服务器上的文件。
2.2 两种通信通道
FTP使用两个不同的通道进行通信:
- 控制通道(Command Channel):用于传输控制命令,如用户身份验证、命令哀求等。这个通道通常使用21端口。
- 数据通道(Data Channel):用于传输现实的数据(文件传输)。该通道的端口是动态的,通常由FTP服务器在控制毗连中与客户端协商确定。
2.3 工作模式
FTP有两种主要的工作模式:
- 自动模式(Active Mode):客户端向服务器的21端口发送命令,服务器再通过客户端指定的端口(通常为20端口)回传数据。该模式下,客户端需要对外网开放端口。
- 被动模式(Passive Mode):客户端向服务器的21端口发送命令,服务器向客户端提供一个数据端口,客户端通过该端口进行数据传输。在防火墙环境下,被动模式更为常用。
2.4 数据传输方式
FTP支持不同的传输模式:
- ASCII模式:用于传输文本文件,文件内容颠末转换以顺应不同操作体系之间的换行符差异。
- 二进制模式:用于传输二进制文件,如图像、压缩文件等,文件不会被修改。
2.5 身份验证
在使用FTP时,通常需要提供用户名和暗码进行身份验证。部分FTP服务器也支持匿名登录,使用户能够无需身份验证即可下载文件,但无法上传文件。
2.6 常见命令
FTP提供了多种命令来进行文件操作。
常用的命令包括:
命令备注USER发送用户名PASS发送暗码LIST列出目次内容GET或RETR下载文件PUT或STOR上传文件QUIT退出FTP会话 2.7 使用场景
简单的过程如下:
- 启动FTP客户端,输入服务器的IP地址和端口(默认是21端口)。
- 输入用户名和暗码进行身份验证。
- 客户端与服务器创建控制通道,获取服务器上的文件列表。
- 选择你想要下载的文件,客户端通过数据通道与服务器传输文件。
- 下载完成后,客户端发送退出命令(QUIT),关闭会话。
三、项目准备
主机名称操作体系IP地址脚色FTP服务端Centos810.0.0.8FTP服务器端FTP客户端Centos810.0.0.18FTP客户端Windows客户端Windows192.168.10.100FTP客户端 四、项目执行
4.1 IP网卡设置
见centos8之网卡设置详解
4.2 开始设置
- [root@ftp-server ~]# yum makecache // 清除缓存
- Rocky Linux 8 - AppStream 14 kB/s | 4.8 kB 00:00
- Rocky Linux 8 - BaseOS 8.5 kB/s | 4.3 kB 00:00
- Rocky Linux 8 - Extras 8.8 kB/s | 3.1 kB 00:00
- Extra Packages for Enterprise Linux 8 - x86_64 13 kB/s | 4.4 kB 00:00
- Metadata cache created.
- [root@ftp-server ~]# yum repolist //查看仓库列表
- repo id repo name
- appstream Rocky Linux 8 - AppStream
- baseos Rocky Linux 8 - BaseOS
- epel Extra Packages for Enterprise Linux 8 - x86_64
- extras Rocky Linux 8 - Extras
复制代码- [root@localhost ~]# yum install -y vsftpd* ftp
- Last metadata expiration check: 0:01:09 ago on Sun 01 Dec 2024 11:14:05 PM CST.
- Dependencies resolved.
- =====================================================================================
- Package Architecture Version Repository Size
- =====================================================================================
- Installing:
- ftp x86_64 0.17-78.el8 appstream 69 k
- vsftpd x86_64 3.0.3-36.el8 appstream 180 k
- Transaction Summary
- =====================================================================================
- Install 2 Packages
- Total download size: 249 k
- Installed size: 457 k
- Downloading Packages:
- (1/2): ftp-0.17-78.el8.x86_64.rpm 91 kB/s | 69 kB 00:00
- (2/2): vsftpd-3.0.3-36.el8.x86_64.rpm 118 kB/s | 180 kB 00:01
- -------------------------------------------------------------------------------------
- Total 162 kB/s | 249 kB 00:01
- Running transaction check
- Transaction check succeeded.
- Running transaction test
- Transaction test succeeded.
- Running transaction
- Preparing : 1/1
- Installing : vsftpd-3.0.3-36.el8.x86_64 1/2
- Running scriptlet: vsftpd-3.0.3-36.el8.x86_64 1/2
- Installing : ftp-0.17-78.el8.x86_64 2/2
- Running scriptlet: ftp-0.17-78.el8.x86_64 2/2
- Verifying : ftp-0.17-78.el8.x86_64 1/2
- Verifying : vsftpd-3.0.3-36.el8.x86_64 2/2
- Installed:
- ftp-0.17-78.el8.x86_64 vsftpd-3.0.3-36.el8.x86_64
- Complete!
复制代码- [root@ftp-server ~]# systemctl stop firewalld
- [root@ftp-server ~]# systemctl status firewalld
- ● firewalld.service - firewalld - dynamic firewall daemon
- Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor prese>
- Active: inactive (dead)
- Docs: man:firewalld(1)
- [root@ftp-server ~]# systemctl start vsftpd
- [root@ftp-server ~]# systemctl status vsftpd
- ● vsftpd.service - Vsftpd ftp daemon
- Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: >
- Active: active (running) since Sun 2024-12-01 23:17:42 CST; 5s ago
- Process: 1779 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, sta>
- Main PID: 1780 (vsftpd)
- Tasks: 1 (limit: 12166)
- Memory: 584.0K
- CGroup: /system.slice/vsftpd.service
- └─1780 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
- Dec 01 23:17:42 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
- Dec 01 23:17:42 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
复制代码 五、vsftpd的设置文件解释
5.1 vsftpd服务程序的主设置文件(/etc/vsftpd/vsftpd.conf)
- [root@ftp-server ~]# cat /etc/vsftpd/vsftpd.conf | grep -v "#" // grep -v "#" 过滤掉包含注释的行(含有“#”的行)
- anonymous_enable=NO // 禁止匿名用户登录FTP服务器
- local_enable=YES // 允许本地用户(即系统用户)登录FTP服务器
- write_enable=YES // 允许用户在FTP服务器上进行写操作(如上传文件)
- local_umask=022 // 设置本地用户上传文件的默认权限掩码,022 表示上传的文件对其他用户可读,但不可写
- dirmessage_enable=YES // 启用目录消息功能,登录时显示目录的欢迎信息
- xferlog_enable=YES // 启用FTP传输日志记录,记录文件传输的详细信息
- connect_from_port_20=YES // 启用使用端口20进行数据传输的模式
- xferlog_std_format=YES // 使用标准格式记录传输日志
- listen=NO // 禁止vsftpd监听IPv4地址(改为使用IPv6)
- listen_ipv6=YES // 启用vsftpd监听IPv6地址
- pam_service_name=vsftpd // 配置PAM(Pluggable Authentication Module)服务名称,用于身份验证
- userlist_enable=YES // 启用用户列表功能,只允许在用户列表中的用户登录FTP服务器
复制代码 5.2 FTP数据库文件说明
/etc/pam.d/vsftpd
这是 vsftpd 服务的PAM(可插拔认证模块)设置文件,主要用于加强用户认证。当用户登录时,PAM会查抄用户的身份是否有效。这个设置文件可以用来设置额外的安全措施,比如强暗码计谋、多因素认证等。
5.2 FTP用户列表文件说明
/etc/vsftpd/ftpusers
这个文件包含了不允许登录 vsftpd 服务的用户。默认情况下,这个文件中会列出一些体系用户,如 root、bin、daemon 等,防止这些体系账户通过FTP进行访问。
5.2 FTP拒绝访问列表说明
/etc/vsftpd/user_list
这个文件包含了一个用户列表,根据 vsftpd.conf 设置文件中的 userlist_deny 设置,用户列表中的用户大概被拒绝访问FTP服务,也大概被允许访问。
如果 userlist_deny=NO,则只有文件中的用户可以访问FTP服务。
如果 userlist_deny=YES,则文件中的用户被拒绝访问FTP服务,其他用户可以访问。
5.2 FTP默认目次说明
/var/ftp
这个目次是 vsftpd 服务的默认文件存放位置,里面通常包含一个名为 pub 的子目次,供用户上传或下载文件。默认情况下,全部目次内容都是只读的,用户只能下载文件,不能进行修改或上传。
六、设置匿名用户FTP服务器
6.1 认证方式
vsftpd允许用户通过三种认证方式登录到FTP服务器,分别是匿名用户、当地用户和虚拟用户。每种方式的登录方式不同
- 匿名用户:
匿名用户是指任何人都可以不输入用户名和暗码,直接登录FTP服务器。这种方式通常用于公共FTP服务器,允许任何人访问服务器上的公开资源。
- 当地用户:
当地用户是指服务器上已经存在的用户账户,通过输入用户名和暗码进行登录。这种方式实用于需要更高安全性和权限控制的情况。
- 虚拟用户:
虚拟用户是指并不直接对应体系中的用户账户,而是通过一个虚拟的认证体系进行登录。纵然黑客破解了虚拟用户的登录信息,也无法直接访问体系中的真实账户,进步了安全性。
6.2 匿名用户登录
参数作用anonymous_enable=YES允许匿名用户访问FTP服务器anon_umask=022设置匿名用户上传文件时的默认权限掩码,022 表示上传的文件对其他用户可读,但不可写anon_upload_enable=YES允许匿名用户上传文件到FTP服务器anon_mkdir_write_enable=YES允许匿名用户在FTP服务器上创建新目次anon_other_write_enable=YES允许匿名用户修改目次名称或删除目次 6.3 匿名用户登录FTP服务器设置示例
要求:搭建FTP服务器,允许匿名用户上传和下载文件,设置匿名用户根目次为/var/ftp
- [root@ftp-server ~]# touch /var/ftp/pub/sample.tar
- [root@ftp-server ~]# ll /var/ftp/pub
- total 0
- -rw-r--r--. 1 root root 0 Dec 1 23:41 sample.tar
复制代码
- 在 /etc/vsftpd/vsftpd.conf 修改以下四行(数字表示行号)
- 12 anonymous_enable=YES
- 28 anon_upload_enable=YES # 允许上传文件 如果前面有# 删除最前面的 “#”
- 32 anon_mkdir_write_enable=YES # 允许创建文件
复制代码- [root@ftp-server ~]# chmod 777 /var/ftp/pub // 给目录所属设置为ftp
- [root@ftp-server ~]# systemctl restart vsftpd
- [root@ftp-server ~]# systemctl status vsftpd
- ● vsftpd.service - Vsftpd ftp daemon
- Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: >
- Active: active (running) since Sun 2024-12-01 23:49:27 CST; 11s ago
- Process: 1872 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, sta>
- Main PID: 1873 (vsftpd)
- Tasks: 1 (limit: 12166)
- Memory: 572.0K
- CGroup: /system.slice/vsftpd.service
- lines 1-8
复制代码
- 在windows客户端上输入ftp://10.0.0.8打开pub目次
七、企业级设置当地用户FTP服务器
7.1 FTP服务器设置要求
公司新增了一台FTP服务器和Web服务器,主要用于维护公司网站的内容,例如上传文件、创建目次和更新网页等。公司有两个部门负责这些任务,分别使用 team1 和 team2 账号来管理。这两个部门将只允许 team1 和 team2 账号登录FTP服务器。
7.2 要求
将FTP服务器和Web服务器放在一起是常见的做法,因为这样有助于网站的维护。为了进步安全性,服务器设置需要满意以下要求:
- 仅允许当地用户访问:禁止匿名用户登录FTP服务器。
- 限制 team1 和 team2 的访问目次:这两个账号只能访问并管理 /web/www/html 目次,确保他们无法访问服务器上的其他文件和目次。
7.3 解决方案
- 创建维护网站内容的FTP账号 并 禁止当地登录 为其设置暗码
- [root@ftp-server ~]# mkdir -p /web/www/html // 创建team1和team2的所属目录
- [root@ftp-server ~]# useradd team1 -d /web/www/html // 禁止登录本地并指定家录
- useradd: warning: the home directory already exists.
- Not copying any file from skel directory into it.
- [root@ftp-server ~]# useradd team2 -d /web/www/html
- useradd: warning: the home directory already exists.
- Not copying any file from skel directory into it.
- [root@ftp-server ~]# useradd user1 -d /web/www/html
- useradd: warning: the home directory already exists.
- Not copying any file from skel directory into it.
- [root@ftp-server ~]# eacho "12345" | passwd --stdin user1 // 设置密码
- -bash: eacho: command not found
- Changing password for user user1.
- passwd: Authentication token manipulation error
- [root@ftp-server ~]# echo "12345" | passwd --stdin user1
- Changing password for user user1.
- passwd: all authentication tokens updated successfully.
- [root@ftp-server ~]# echo "12345" | passwd --stdin team1
- Changing password for user team1.
- passwd: all authentication tokens updated successfully.
- [root@ftp-server ~]# echo "12345" | passwd --stdin team2
- Changing password for user team2.
- passwd: all authentication tokens updated successfully.
复制代码
- 设置vsftpd.conf主设置文件增加或修改相应内容
- [root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
- 12 anonymous_enable=NO # 不允许匿名用户访问
- 13 local_root=/web/www/html # 添加这一行
- 102 chroot_list_enable=YES # 取消注释 激活chroot功能
- 104 chroot_list_file=/etc/vsftpd/chroot_list # 取消注释 锁定用户在根目录种的列表文件
- 105 allow_writeable_chroot=YES # 启用chroot就一定加入这条:允许chroot限制
- 106 write_enable=yes
复制代码
- 创建/etc/vsftpd/chroot_list文件、添加team1、team2账号
- [root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
- [root@ftp-server ~]# vim /etc/vsftpd/chroot_list
- team1
- team2
复制代码- [root@ftp-server ~]# touch /web/www/html/test.tar
- [root@ftp-server ~]# chmod -R 777 /web/www/html/test.tar
- [root@ftp-server ~]# ll /web/www/html/test.tar
- -rwxrwxrwx. 1 root root 0 Dec 2 00:15 /web/www/html/test.tar
复制代码- [root@ftp-server ~]# systemctl status vsftpd
- ● vsftpd.service - Vsftpd ftp daemon
- Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: >
- Active: active (running) since Mon 2024-12-02 00:16:35 CST; 15s ago
- Process: 1948 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, sta>
- Main PID: 1949 (vsftpd)
- Tasks: 1 (limit: 12166)
复制代码 chroot_list=YES 时:
如果设置 chroot_list=YES,表示在 /etc/vsftpd/chroot_list 文件中列出的用户可以访问服务器的全部目次。换句话说,只有这些用户不会被限制在他们的主目次或指定目次内,他们可以自由浏览和访问服务器的其他文件体系目次。
chroot_list=NO 时:
如果设置 chroot_list=NO,则 /etc/vsftpd/chroot_list 文件中列出的用户会被锁定在特定的目次中,无法访问服务器上的其他目次。其他没有列出的用户则不受限制,可以访问整个文件体系。
- [root@ftp-server ~]# ftp localhost 21
- Trying ::1...
- Connected to localhost (::1).
- 220 (vsFTPd 3.0.3)
- Name (localhost:root): team1 // 输入需要登录的用户team1或者team2
- 331 Please specify the password.
- Password: // 输入密码
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> pwd // 查看当前目录
- 257 "/" is the current directory
- ftp> cd /etc // 进入etc目录,失败 权限不足
- 550 Failed to change directory.
- ftp> exit
复制代码
- [root@ftp-server ~]# ftp localhost 21
- Trying ::1...
- Connected to localhost (::1).
- 220 (vsFTPd 3.0.3)
- Name (localhost:root): user1 // 输入需要登录的用户user1
- 331 Please specify the password.
- Password: // 输入密码
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> pwd // 查看当前目录
- 257 "/web/www/html" is the current directory
- ftp> cd /etc // 进入etc目录,成功
- 250 Directory successfully changed.
- ftp> exit
复制代码 八、设置虚拟用户FTP服务器
- 要求
需要设置 FTP 服务器,允许虚拟用户 user2 和 user3 登录,并将他们的主目次设置为 /var/ftp/vuser。同时,这些用户只能查察文件,不能进行上传、修改或删除操作。
具体要求:
- 虚拟用户登录:使用 user2 和 user3 虚拟用户账号登录FTP服务器。
- 设置主目次:他们的主目次都被设置为 /var/ftp/vuser,即他们登录后只能访问该目次。
- 只读权限:这两个用户只能查察目次和文件内容,无法上传、修改或删除文件。
- [root@ftp-server ~]# cd /etc/vsftpd // 进入目录
- [root@ftp-server vsftpd]# vim vuser // 创建文本文件
复制代码
- 天生数据库
为了让体系能够使用虚拟用户的账号和暗码,需要将这些信息存储在一个数据库文件中,而不是简单的文本文件。因为体系不能直接读取文本文件中的虚拟账号和暗码。为了转换,起首需要使用 db_load 命令将文本文件转换成数据库格式,这样 vsftpd 才气通过数据库文件来验证虚拟用户的登录信息。
- [root@ftp-server vsftpd]# db_load -T -t hash -f vuser vuser.db
复制代码
- 设置PAM文件
为了让FTP服务器能够使用数据库中的虚拟用户账号进行身份验证,我们需要设置PAM(可插拔认证模块)。PAM 是一种身份验证框架,它允许体系通过不同的方式验证用户身份,包括使用数据库文件来验证虚拟用户。
修改vsftpd的PAM设置
打开 vsftpd 的PAM设置文件 /etc/pam.d/vsftpd,然后解释掉文件中的默认设置行。在这些行前加上 # 来禁用它们,这样体系就不会使用默认的身份验证方式,而是改为使用数据库文件中的虚拟用户信息进行验证。
- ##%PAM-1.0
- session optional pam_keyinit.so force revoke
- #auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
- #auth required pam_shells.so
- #auth include password-auth
- #account include password-auth
- #session required pam_loginuid.so
- #session include password-auth
- auth required pam_userdb.so dn=/etc/vsftpd/vuser
- account required pam_userdb.so dn=/etc/vsftpd/vuser
复制代码
- 编辑主设置文件 【/etc/vsftpd/vsftpd.conf】
- [root@ftp-server vsftpd]# vim /etc/vsftpd/vsftpd.conf # 在最后添加下面四行
- 131 guest_enable=YES
- 132 guest_username=vuser
- 133 user_config_dir=/etc/vsftpd/vuser_conf
- 134 allow_writeable_chroot=YES
复制代码- [root@ftp-server ~]# cd /etc/vsftpd
- [root@ftp-server vsftpd]# mkdir vuser_conf
- [root@ftp-server vsftpd]# cd vuser_conf/
- [root@ftp-server vuser_conf]# vim user2
- [root@ftp-server vuser_conf]# vim user3
- [root@ftp-server vuser_conf]# cat user2
- local_root=/var/ftp/vuser
- [root@ftp-server vuser_conf]# cat user3
- local_root=/var/ftp/vsuer
复制代码- [root@ftp-server ~]# cd /var/ftp/
- [root@ftp-server ftp]# ll
- total 0
- drwxr-xr-x. 2 root root 24 Dec 1 23:41 pub
- [root@ftp-server ftp]# mkdir vuser
- [root@ftp-server ftp]# cd
- [root@ftp-server ~]# touch /var/ftp/vuser/user2.tar
- [root@ftp-server ~]# touch /var/ftp/vuser/user2.ta3
复制代码- # 重启服务
- [root@ftp-server vuser_conf]# systemctl restart vsftpd
- # 登录user2
- [root@ftp-server vuser_conf]# ftp localhost 21
- Trying ::1...
- Connected to localhost (::1).
- 220 (vsFTPd 3.0.2)
- Name (localhost:root): user2
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> ls
- 229 Entering Extended Passive Mode (|||60168|).
- 150 Here comes the directory listing.
- -rw-r--r-- 1 0 0 0 Jun 06 18:46 user2.tar
- -rw-r--r-- 1 0 0 0 Jun 06 18:46 user3.tar
- # user2其他权限测试
- ftp> cd /etc/ # 进入其它目录权限
- 550 Failed to change directory. # 失败
- ftp> mkdir user2 # 创建文件权限
- 550 Permission denied. # 失败
- # 登录user3
- [root@ftp-server vuser_conf]# ftp localhost 21
- Trying ::1...
- Connected to localhost (::1).
- 220 (vsFTPd 3.0.2)
- Name (localhost:root): user3
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> ls
- 229 Entering Extended Passive Mode (|||28511|).
- 150 Here comes the directory listing.
- -rw-r--r-- 1 0 0 0 Jun 06 19:03 user2.tar
- -rw-r--r-- 1 0 0 0 Jun 06 19:03 user3.tar
- # user3其他权限测试
- ftp> cd /etc/ # 进入其它目录权限
- 550 Failed to change directory. # 失败
- ftp> mkdir user3 # 创建文件权限
- 550 Permission denied. # 失败
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |