linux-FTP服务

本文详细介绍了Linux系统中FTP服务的配置,包括工作模式、安装和配置FTP工具、以及三种认证模式:匿名用户模式、本地用户模式和虚拟用户模式。在虚拟用户模式中,详细阐述了如何安装DB工具、创建账户密码文件、修改文件属性和权限,以及针对不同虚拟用户设置不同权限的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FTP服务

利用文件传输形式,获取其他机器的数据和资料等。

FTP:文件传输协议。

基于C/S模式。

工作端口20,用于数据传输。

工作端口21,服务端接收来自于客户端发来的指令、参数等。

1.工作模式

  1. 主动模式
    • FTP服务器主动向客户端发起连接请求
  2. 被动模式
    • 服务器等待客户端发送请求

2.安装和配置ftp工具

  1. 安装
[root@localhost ~]# yum install vsftpd -y
  1. 配置
[root@localhost ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/systemd/system-generators/vsftpd-generator
/usr/lib/systemd/system/vsftpd.service
/usr/lib/systemd/system/vsftpd.target
/usr/lib/systemd/system/vsftpd@.service
/usr/sbin/vsftpd
······

/etc/vsftpd/vsftpd.conf即配置文件
[root@localhost ~]# grep -v '^\s*#\|^$' /etc/vsftpd/vsftpd.conf 
anonymous_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

做一些简单修改:

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 
[root@localhost ~]# grep -v '^\s*#\|^$' /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog	#取消注释
xferlog_std_format=YES
listen=YES		#开启
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

3.认证模式

vsftpd允许用户用三种认证模式登录ftp服务器:

  1. 本地用户模式

    基于linux本地账户密码进行验证,配置简单,但安全隐患高

  2. 匿名模式

    任何人不需要验证直接登录ftp数据,用于开发、公共的资源展示

  3. 虚拟用户模式

    单独为ftp工具创建用户数据库,基于口令验证账号密码,这些数据库仅用于FTP服务,不影响其他程序,最为安全

对于ftp客户端,需要安装ftp命令工具,才能使用。

1.匿名用户模式配置

在配置文件中搜索anon字符串,查找匿名用户相关参数设置项:

[root@localhost ~]# grep '^anon' /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES	#默认开启
anon_upload_enable=YES	#允许匿名用户上传 为了测试,本次打开
anon_mkdir_write_enable=YES #允许匿名用户创建目录,为了测试,本次打开

启动:

[root@localhost ~]# systemctl start vsftpd
Job for vsftpd.service failed because the control process exited with error code. See "systemctl status vsftpd.service" and "journalctl -xe" for details.
[root@localhost ~]# systemctl disable --now firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# sed -i 's@SELINUX=enforcing@SELINUX=disabled@g' /etc/selinux/config
[root@localhost ~]# setenforce 0

仍然起不来:提示:
Sep 01 07:14:36 localhost.localdomain vsftpd[15025]: 500 OOPS: run two copies of vsftpd for IPv4 and IPv6

将配置文件中listen=YES修改为listen=NO,可以启动了。

客户端使用ftp命令进行操作

客户端安装ftp工具
[root@admin ~]# yum install ftp
访问:
[root@admin ~]# ftp 10.0.0.130
Connected to 10.0.0.130 (10.0.0.130).
220 (vsFTPd 3.0.2)
Name (10.0.0.130:root): anonymous	#匿名用户账号
331 Please specify the password.
Password:							#默认为空
230 Login successful.				#登陆成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

可以尝试输入其他账户,看看什么提示
可以正常执行查看、切换目录等操作:
ftp> ls
227 Entering Passive Mode (10,0,0,130,79,201).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Jun 09  2021 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (10,0,0,130,46,204).
150 Here comes the directory listing.
226 Directory send OK.

但写入信息失败:
ftp> mkdir xiajz
550 Create directory operation failed.

为什么不能写入呢?查看ftp的数据目录:/var/ftp
[root@localhost ~]# cd /var/ftp/
[root@localhost ftp]# ls
pub
[root@localhost ftp]# ll
total 0
drwxr-xr-x. 2 root root 6 Jun 10  2021 pub		#属组属主都是root,其他用户没有写权限
修改属主属组为ftp:
[root@localhost ftp]# chown -R  ftp.ftp /var/ftp/pub/
[root@localhost ftp]# ll
total 0
drwxr-xr-x. 2 ftp ftp 6 Jun 10  2021 pub

写入数据:
[root@admin ~]# ftp 10.0.0.130
Connected to 10.0.0.130 (10.0.0.130).
220 (vsFTPd 3.0.2)
Name (10.0.0.130:root): anonymous
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> ls
227 Entering Passive Mode (10,0,0,130,125,190).
150 Here comes the directory listing.
226 Directory send OK.
ftp> mkdir xiajz
257 "/pub/xiajz" created
ftp> ls
227 Entering Passive Mode (10,0,0,130,207,251).
150 Here comes the directory listing.
drwx------    2 14       50              6 Sep 01 03:30 xiajz
226 Directory send OK.

想要查看命令列表,输入?即可
ftp> ?
Commands may be abbreviated.  Commands are:

!		debug		mdir		sendport	site
$		dir		mget		put		size
account		disconnect	mkdir		pwd		status
append		exit		mls		quit		struct
ascii		form		mode		quote		system
bell		get		modtime		recv		sunique
binary		glob		mput		reget		tenex
bye		hash		newer		rstatus		tick
case		help		nmap		rhelp		trace
cd		idle		nlist		rename		type
cdup		image		ntrans		reset		user
chmod		lcd		open		restart		umask
close		ls		prompt		rmdir		verbose
cr		macdef		passive		runique		?
delete		mdelete		proxy		send

能写入但不能修改
ftp> rename xiajz 老夏
550 Permission denied.

如何解决?
当前配置文件中关于anonymous的配置参数如下:
[root@localhost ftp]# grep '^anon' /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES

应添加其他的可写入权限,添加一行配置,修改后如下:
[root@localhost ftp]# grep '^anon' /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

重启服务:
[root@localhost ftp]# systemctl restart vsftpd

重新登录尝试重命名、删除等操作:
[root@admin ~]# ftp 10.0.0.130
Connected to 10.0.0.130 (10.0.0.130).
220 (vsFTPd 3.0.2)
Name (10.0.0.130:root): anonymous
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 (10,0,0,130,146,1).
150 Here comes the directory listing.
drwxr-xr-x    3 14       50             19 Sep 01 03:30 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (10,0,0,130,97,172).
150 Here comes the directory listing.
drwx------    2 14       50              6 Sep 01 03:30 xiajz
226 Directory send OK.
ftp> rename xiajz 老夏
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (10,0,0,130,237,58).
150 Here comes the directory listing.
drwx------    2 14       50              6 Sep 01 03:30 老夏
226 Directory send OK.
ftp> rmdir 老夏
250 Remove directory operation successful.
ftp> ls
227 Entering Passive Mode (10,0,0,130,146,247).
150 Here comes the directory listing.
226 Directory send OK.

写入的所有东西都存放在服务器端/var/ftp/pub目录下
客户端操作:
ftp> mkdir 老夏的文件夹
257 "/pub/老夏的文件夹" created
ftp> cd 老夏的文件夹
250 Directory successfully changed.
ftp> pwd
257 "/pub/老夏的文件夹"

服务器查看:
[root@localhost ftp]# ls
pub
[root@localhost ftp]# ls pub/
老夏的文件夹

2.本地用户模式

修改配置参数

修改后参数如下:

[root@localhost ~]# grep -v '^\s*#\|^$' /etc/vsftpd/vsftpd.conf 
anonymous_enable=NO		#关闭匿名用户验证模式
local_enable=YES		#开启本地用户验证模式
write_enable=YES		#允许用户写入
local_umask=022			#用户写入时默认的文件权限
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
userlist_deny=YES

重启服务:

[root@localhost ~]# systemctl restart vsftpd

此时就可以使用linux本地账号远程登录ftp服务器了。

现在服务器上创建一个用户:

[root@localhost ~]# useradd xiaohong && echo xiaohong123 |passwd --stdin xiaohong
Changing password for user xiaohong.
passwd: all authentication tokens updated successfully.

使用此用户登录ftp服务器:

[root@admin ~]# ftp 10.0.0.130
Connected to 10.0.0.130 (10.0.0.130).
220 (vsFTPd 3.0.2)
Name (10.0.0.130:root): xiaohong
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
ftp> ls
227 Entering Passive Mode (10,0,0,130,224,193).
150 Here comes the directory listing.
226 Directory send OK.
ftp> pwd
257 "/home/xiaohong"		#这种登录方式,是连接在用户的家目录中
ftp> mkdir 小红
257 "/home/xiaohong/小红" created


有些用户是无法登录ftp的,可以在用户名单中进行限制:

[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# 
[root@localhost vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@localhost vsftpd]# cat ftpusers 
# Users that are not allowed to login via ftp   #写入此文件的用户不准登录ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

3.虚拟用户模式

虚拟创建出来的登录用户,对系统最安全。

3.1 安装DB工具,能够转化普通文件为vsftpd能够识别的数据库文件

[root@localhost ~]# yum install db4 db4-utils -y                 #在epel源中

3.2 创建账户密码文件

[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# touch ftp_user.txt
文件中写入账号(上一行)和密码(下一行),可以写多个
xia				#账号
xia123			#密码
laoxia			#账号
xia1234			#密码
这就是两组账号密码

3.3 修改文件属性

这样记录账户密码的文件不安全,vsftpd也无法识别,因此需要使用db_load命令对其转换,一则加密,二则转换属性

[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/ftp_user.txt /etc/vsftpd/ftp_user.db
[root@localhost vsftpd]# ls
ftp_user.db  ftpusers  ftp_user.txt  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@localhost vsftpd]# cat ftp_user.txt 
xia
xia123
laoxia
xia1234
[root@localhost vsftpd]# cat ftp_user.db
m|廯эh^[root@localhost vsftpd]# 
[root@localhost vsftpd]# file ftp_user.txt
ftp_user.txt: ASCII text
[root@localhost vsftpd]# file ftp_user.db
ftp_user.db: Berkeley DB (Hash, version 9, native byte-order)

3.4降低数据库文件权限:

[root@localhost vsftpd]# chmod 600 ftp_user.db
[root@localhost vsftpd]# ll
total 36
-rw-------  1 root root 12288 Sep  1 15:39 ftp_user.db
-rw-------. 1 root root   125 Jun 10  2021 ftpusers
-rw-r--r--  1 root root    26 Sep  1 15:34 ftp_user.txt
-rw-------. 1 root root   361 Jun 10  2021 user_list
-rw-------  1 root root  5162 Sep  1 15:10 vsftpd.conf
-rwxr--r--. 1 root root   338 Jun 10  2021 vsftpd_conf_migrate.sh

删除旧文件,保障安全:

[root@localhost vsftpd]# rm -rf ftp_user.txt 

3.5创建虚拟用户登录之后进入的文件夹路径:

  • 注,最好将路径与linux中的一个用户做一个映射关系,防止虚拟用户登录后,创建目录报错
[root@localhost vsftpd]# useradd -d /var/ftpdir -s /sbin/nologin virtual_user
[root@localhost vsftpd]# ll -d /var/ftpdir/
drwx------ 2 virtual_user virtual_user 62 Sep  1 15:49 /var/ftpdir/

修改权限,防止虚拟用户登录之火没有权限操作
[root@localhost vsftpd]# chmod -R 755 /var/ftpdir/

将创建的系统用户添加到禁止登录列表中:
[root@localhost vsftpd]# echo virtual_user >> /etc/vsftpd/ftpusers 

3.6修改配置文件

添加个支持虚拟用户验证的PAM文件。PAM是一组安全机制模块,文件路径在/etc/pam.d/vsftpd

将如下内容追加入此文件中:

auth required pam_userdb.so db=/etc/vaftpd/ftp_user

account required pam_userdb.so db=/etc/vaftpd/ftp_user

修改后内容如下:

[root@localhost vsftpd]# cat /etc/pam.d/vsftpd 
auth       required     pam_userdb.so db=/etc/vsftpd/ftp_user 		#新增
account    required     pam_userdb.so db=/etc/vsftpd/ftp_user		#新增

修改配置文件,加载支持虚拟用户模式:

[root@localhost vsftpd]# grep -v '^\s*#\|^$' /etc/vsftpd/vsftpd.conf 
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
userlist_deny=YES
guest_enable=YES				#新增
guest_username=virtual_user		#新增		指定虚拟用户账号
allow_writeable_chroot=YES		#新增		如果用户被限制只能在其家目录,允许用户对其家目录写入

3.7针对不同虚拟用户设置不同权限

目标:

  • xia用户:能上传、下载、新建、修改、查看、删除等
  • laoxia用户:只读
创建一个管理虚拟用户的家目录:
[root@localhost ~]# mkdir /etc/vsftpd/virtual_user_dir
[root@localhost ~]# cd !$
cd /etc/vsftpd/virtual_user_dir
目录下创建两个文件,内容匹配权限,这就是虚拟用户的配置文件:
[root@localhost virtual_user_dir]# cat xia
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

[root@localhost virtual_user_dir]# cat laoxia
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

3.8修改主配置文件,加载3.7中定义的权限

配置文件中添加:

user_config_dir=/etc/vsftpd/virtual_user_dir

3.9重启服务,加载配置

[root@localhost virtual_user_dir]# systemctl restart vsftpd

3.10 验证

[root@admin ~]# ftp 10.0.0.130
Connected to 10.0.0.130 (10.0.0.130).
220 (vsFTPd 3.0.2)
Name (10.0.0.130:root): xia
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 虚拟用户xia
257 "/虚拟用户xia" created
ftp> rmdir 虚拟用户xia
250 Remove directory operation successful.
ftp> ls
227 Entering Passive Mode (10,0,0,130,75,140).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Sep 01 08:31 1123
226 Directory send OK.
ftp> rename 1123 2234再来一次
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (10,0,0,130,231,152).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Sep 01 08:31 2234再来一次
226 Directory send OK.

[root@admin ~]# ftp 10.0.0.130
Connected to 10.0.0.130 (10.0.0.130).
220 (vsFTPd 3.0.2)
Name (10.0.0.130:root): laoxia
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 (10,0,0,130,165,229).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Sep 01 08:31 2234再来一次
226 Directory send OK.
ftp> mkdir 5678
550 Permission denied.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值