Linux部署FTP服务

什么是FTP服务

FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一。该协议是Internet文件传输的基础,它由一系列规格说明文档所定义,目的是让用户能把一个主机上的文件复制到另一个主机上,同时也允许用户与远程主机建立连接,以访问存储在远程主机上的文件,然后把文件从远程主机传到本地计算机,或从本地计算机传到远程主机。

FTP的主要作用就是让用户连接上一个可存储计算机文件的服务器,在服务器上用户可以进行文件的上传、下载、查看、更名、删除等操作,就像在本地计算机上操作一样方便。通常,连接FTP服务器需使用FTP客户端软件,用户通过FTP客户端程序向FTP服务器发出命令来请求服务,FTP服务器作出响应,并返回请求的结果。

需要注意的是,FTP的传输效率非常高,因此在网络上传输大的文件时,一般都采用该协议。但是,FTP并不提供一般文件系统的访问、修改等权限,它只负责完成文件的传输。

FTP端口号

控制连接:TCP 21,用于发送FTP命令信息

数据连接:TCP 20,用于上传、下载数据

FTP的模式

主动模式:服务端从 20 端口主动向客户端发起连接

被动模式:服务端在指定范围内某个端口被动等待客户端连接

FTP的传输模式

文本模式:ASCII 模式,以文本序列传输数据

二进制模式:Binary 模式,以二进制序列传输数据

FTP的用户类型

匿名用户:anonymous 或 ftp

本地用户:帐号名称、密码等信息保存在 passwd、shadow 文件中

虚拟用户:使用独立的帐号/密码数据文件

安装FTP

bash 复制代码
[root@bogon ~]# yum -y install vsftpd

匿名用户

安装好以后默认就启用了匿名用户,但是权限是只能查看和下载,如果想要让匿名用户拥有上传文件,创建目录或者移动等其他权限则需要配置。

修改配置文件

bash 复制代码
# 在anonymous_enable=YES下添加
anon_umask=022
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes

# anon_umask:设置匿名用户上传文件时的umask值,umask决定了新文件和目录的默认权限  
# 022意味着新文件或目录的权限将被设置为755(目录)或644(文件)减去umask值  
anon_umask=022  
  
# anon_upload_enable:允许匿名用户上传文件  
# yes表示启用,no表示禁用  
anon_upload_enable=yes  
  
# anon_mkdir_write_enable:允许匿名用户创建目录  
# yes表示启用,no表示禁用  
anon_mkdir_write_enable=yes  
  
# anon_other_write_enable:允许匿名用户进行其他写操作(如重命名和删除)  
# 请注意,这个选项通常是不安全的,因为它允许匿名用户删除或修改服务器上的任何文件  
# yes表示启用,no表示禁用  
anon_other_write_enable=yes
bash 复制代码
[root@bogon ~]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
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
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

重启服务

bash 复制代码
[root@bogon ~]# chown ftp /var/ftp/pub
[root@bogon ~]# systemctl restart vsftpd

客户端测试

使用匿名用户登录的时候可以使用ftp用户或者anonymous用户登录,密码直接按回车即可

bash 复制代码
[root@bogon ~]# date > time.txt
[root@bogon ~]# ftp 192.168.207.131
Connected to 192.168.207.131 (192.168.207.131).
220 (vsFTPd 3.0.2)
Name (192.168.207.131:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> put time.txt
local: time.txt remote: time.txt
227 Entering Passive Mode (192,168,207,131,66,247).
150 Ok to send data.
226 Transfer complete.
29 bytes sent in 5.9e-05 secs (491.53 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,207,131,241,119).
150 Here comes the directory listing.
-rw-r--r--    1 14       50             29 Jun 13 03:16 time.txt
226 Directory send OK.
ftp> get time.txt
local: time.txt remote: time.txt
227 Entering Passive Mode (192,168,207,131,37,42).
150 Opening BINARY mode data connection for time.txt (29 bytes).
226 Transfer complete.
29 bytes received in 0.000224 secs (129.46 Kbytes/sec)

本地用户

修改配置文件

bash 复制代码
# 在local_enable=YES下添加
chroot_local_user=yes
allow_writeable_chroot=yes

# chroot_local_user:如果启用(yes),则本地用户(非匿名用户)登录后将被chroot到其主目录。  
# 这意味着用户将只能访问其主目录及其子目录,不能访问系统上的其他目录。  
# 这是一个增强安全性的措施,可以防止用户访问系统文件或执行恶意代码。  
chroot_local_user=yes  
  
# allow_writeable_chroot:在某些情况下,如果用户的家目录是可写的(即用户可以在其中创建或修改文件),  
# 那么在启用chroot后可能会导致vsftpd无法启动或用户无法登录。  
# 启用allow_writeable_chroot(yes)允许vsftpd在这种情况下继续运行,即使chroot目录是可写的。  
# 然而,请注意,这可能会稍微降低安全性,因为恶意用户可能会尝试利用可写的chroot目录来执行攻击。  
# 在大多数情况下,如果你的chroot目录不需要是可写的,最好保持这个选项为no。  
allow_writeable_chroot=yes
bash 复制代码
[root@bogon ~]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
anonymous_enable=YES
anon_umask=022
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
local_enable=YES
chroot_local_user=yes
allow_writeable_chroot=yes
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

重启服务

bash 复制代码
[root@bogon ~]# systemctl restart vsftpd

创建用户

bash 复制代码
[root@bogon ~]# useradd zhangsan
[root@bogon ~]# echo '123' | passwd --stdin zhangsan
Changing password for user zhangsan.
passwd: all authentication tokens updated successfully.

客户端测试

bash 复制代码
[root@bogon ~]# ftp 192.168.207.131
Connected to 192.168.207.131 (192.168.207.131).
220 (vsFTPd 3.0.2)
Name (192.168.207.131:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,207,131,161,43).
150 Here comes the directory listing.
226 Directory send OK.
ftp> put time.txt
local: time.txt remote: time.txt
227 Entering Passive Mode (192,168,207,131,148,58).
150 Ok to send data.
226 Transfer complete.
29 bytes sent in 7.6e-05 secs (381.58 Kbytes/sec)
ftp> get time.txt
local: time.txt remote: time.txt
227 Entering Passive Mode (192,168,207,131,200,167).
150 Opening BINARY mode data connection for time.txt (29 bytes).
226 Transfer complete.
29 bytes received in 0.00024 secs (120.83 Kbytes/sec)
ftp> 

黑名单白名单

/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 服务器,其他所有用户都将被拒绝。这可以用于创建一个只允许特定用户访问的白名单。

总结:

  • ftpusers 是一个固定的黑名单,列在其中的用户无论如何都不能通过 FTP 访问服务器。
  • user_list 可以作为黑名单(默认)或白名单(当 userlist_deny=NO 时),具体取决于 vsftpd 的配置。

为了服务器的安全,管理员应定期检查并更新这两个文件,确保只有合适的用户能够访问 FTP 服务。

虚拟用户

准备账号密码文件

编写虚拟用户账号文件,一行是账号一行是密码,如下账号是lisi密码是123,账号是wanguw密码是123

bash 复制代码
[root@bogon ~]# cat /etc/vsftpd/vusers.list
lisi
123
wangwu
123

账号密码文件加密

bash 复制代码
[root@bogon ~]# cd /etc/vsftpd/
[root@bogon vsftpd]# db_load -T -t hash -f vusers.list vusers.db
[root@bogon vsftpd]# chmod 600 /etc/vsftpd/vusers.*

添加虚拟用户的映射账号

bash 复制代码
[root@bogon vsftpd]# useradd -d /var/ftproot -s /sbin/nologin myftp
[root@bogon vsftpd]# chmod 755 /var/ftproot

编写PAM文件

bash 复制代码
[root@bogon vsftpd]# cat /etc/pam.d/vsftpd.vu
auth    required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

修改vsftpd配置文件

bash 复制代码
# 注释pam_service_name=vsftpd,在这一行下面添加
pam_service_name=vsftpd.vu
guest_enable=yes
guest_username=myftp
bash 复制代码
[root@bogon vsftpd]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
anonymous_enable=YES
anon_umask=022
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
local_enable=YES
chroot_local_user=yes
allow_writeable_chroot=yes
write_enable=YES
local_umask=022
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
guest_enable=yes
guest_username=myftp
userlist_enable=YES
tcp_wrappers=YES

重启服务

bash 复制代码
[root@bogon vsftpd]# systemctl restart vsftpd

客户端测试

bash 复制代码
[root@bogon ~]# ftp 192.168.207.131
Connected to 192.168.207.131 (192.168.207.131).
220 (vsFTPd 3.0.2)
Name (192.168.207.131:root): lisi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.
[root@bogon ~]# ftp 192.168.207.131
Connected to 192.168.207.131 (192.168.207.131).
220 (vsFTPd 3.0.2)
Name (192.168.207.131:root): wangwu
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

配置虚拟账号的权限

此时所有的虚拟账号都拥有相同的权限,我们可以通过修改配置文件设置每个用户的权限

bash 复制代码
# 主配置文件添加user_config_dir
[root@localhost ~]# vi /etc/vsftpd/vsftpd.conf 
user_config_dir=/etc/vsftpd/vusers_dir

# /etc/vsftpd/vusers_dir目录没有就创建出来
# cd /etc/vsftpd/vusers_dir 切换目录
[root@localhost vusers_dir]# vi lisi
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes

[root@localhost vusers_dir]# touch wangwu

# 每个用户的权限就不一样了,重启服务就可以验证了
[root@localhost vusers_dir]# systemctl restart vsftpd
相关推荐
此生只爱蛋18 分钟前
【Linux】正/反向代理
linux·运维·服务器
qq_54702617924 分钟前
Linux 基础
linux·运维·arm开发
zfj32130 分钟前
sshd除了远程shell外还有哪些功能
linux·ssh·sftp·shell
废春啊36 分钟前
前端工程化
运维·服务器·前端
我只会发热40 分钟前
Ubuntu 20.04.6 根目录扩容(图文详解)
linux·运维·ubuntu
爱潜水的小L1 小时前
自学嵌入式day34,ipc进程间通信
linux·运维·服务器
保持低旋律节奏1 小时前
linux——进程状态
android·linux·php
我送炭你添花1 小时前
Pelco KBD300A 模拟器:06+2.Pelco KBD300A 模拟器项目重构指南
python·重构·自动化·运维开发
zhuzewennamoamtf1 小时前
Linux I2C设备驱动
linux·运维·服务器
2301_773730311 小时前
系统编程—IPC进程间通信
网络·网络协议