linux下vsftpd相关知识

在linux系统中,安装ftp通常用的是vsftp,下面讲解vsftp的相关知识。

1、两种模式

vsftp服务端有两种模式,分别是主动模式和被动模式:(默认情况下是被动模式)

  • 主动模式:

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:"我打开了X端口,你过来连接我"。于是服务器从20端口向客户端的X端口发送连接请求,建立 一条数据链路来传送数据。

即 :

命令连接:客户端 >1024 端口 → 服务器 21 端口

数据连接:客户端 >1024 端口 ← 服务器 20 端口

  • 被动模式

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 服务器在命令链路上用PASV命令告诉客户端:"我打开了X端口,你过来连接我"。于是客户端向服务器的X端口发送连接请求,建立一条数据链路来传送数据。

即:

命令连接:客户端 >1024 端口 → 服务器 21 端口

数据连接:客户端 >1024 端口 ← 服务器 >1024 端口

2、连接模式选择

被动模式下如果服务器存在防火墙,需要开的端口除了命令连接端口21之外,还要开客户端连接服务器的端口,这个端口可以人为指定一个区间。

被动模式如果存在NAT,客户端连接服务器的端口也需要做端口映射。

所以ftp需要通过NAT的情况下访问,一般采取被动模式。

如果是主动模式,传输数据是服务器通过20端口发起的数据传输,所以服务器只需要开21端口,但是客户端此时就是一个随机端口来连接,

客户端需要关闭防火墙或者放开端口,此时客户端的连接端口一般不能人为指定。

3、修改被动模式下服务器连接端口

修改vsftpd.conf文件,添加如下配置:

shell 复制代码
pasv_min_port=2000
pasv_max_port=2021

然后重启vsftp,命令如下:

shell 复制代码
systemctl restart vsftpd

以上配置表示客户端发起的数据传输,连接到服务器的端口为2000到2021之间的随机一个端口。

4、使用ftp命令连接

在linux系统中,使用ftp命令连接ftp服务器(该命令需要单独安装),客户端也要分主动模式和被动模式。如果不加-p参数,默认就是以主动模式连接。

shell 复制代码
#客户端以被动模式连接ftp
ftp -p [ftp_server]

5、用户锁定家目录

当匿名用户登录到ftp服务器,本身是不能切换根目录的,所以这里主要是对系统用户做限制。

不加限制以前:

shell 复制代码
lckd@lckd:~$ ftp 192.168.210.29
Connected to 192.168.210.29.
220 (vsFTPd 3.0.5)
Name (192.168.210.29:lckd): vftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
Remote directory: /home/vftp
ftp> cd /
250 Directory successfully changed.
ftp> ls
229 Entering Extended Passive Mode (|||2000|)
150 Here comes the directory listing.
dr-xr-xr-x    2 0        0               6 May 16  2022 afs
lrwxrwxrwx    1 0        0               7 May 16  2022 bin -> usr/bin
dr-xr-xr-x    5 0        0            4096 Oct 31 01:28 boot
drwxr-xr-x   20 0        0            3480 Oct 31 01:28 dev
drwxr-xr-x  142 0        0            8192 Oct 31  2024 etc
drwxr-xr-x    7 0        0              70 Oct 30 11:41 home
lrwxrwxrwx    1 0        0               7 May 16  2022 lib -> usr/lib
lrwxrwxrwx    1 0        0               9 May 16  2022 lib64 -> usr/lib64
drwxr-xr-x    2 0        0               6 May 16  2022 media
drwxr-xr-x    2 0        0               6 May 16  2022 mnt
drwxr-xr-x    3 0        0              22 Sep 04 09:51 opt
dr-xr-xr-x  521 0        0               0 Oct 31 01:28 proc
dr-xr-x---   15 0        0            4096 Oct 31 07:12 root
drwxr-xr-x   50 0        0            1320 Oct 31 06:55 run
lrwxrwxrwx    1 0        0               8 May 16  2022 sbin -> usr/sbin
drwxr-xr-x    2 0        0               6 May 16  2022 srv
dr-xr-xr-x   13 0        0               0 Oct 31 01:28 sys
drwxrwxrwt   29 0        0            4096 Oct 31 07:13 tmp
drwxr-xr-x   12 0        0             144 Aug 05 06:04 usr
drwxr-xr-x   20 0        0            4096 Aug 05 06:17 var
226 Directory send OK.

修改配置文件,添加以下参数:

shell 复制代码
vim /etc/vsftpd/vsftpd.conf

chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES

对以上三个参数做个解释:

asciidoc 复制代码
chroot_local_user=YES: 
将所有用户限制在主目录(该项默认值是NO,即在安装vsftpd后不做配置的话,ftp用户都可以逃出主目录,切换到根目录。)

chroot_list_enable=NO:
不启动限制用户的名单。YES为启用,NO禁用

chroot_list_file=/etc/vsftpd/chroot_list:
当chroot_list_enable为YES才需要配置此文件,表示例外的用户。至于是限制名单还是排除名单,
需要参考chroot_local_user的值。

allow_writeable_chroot=YES:表示让家目录可写,具体的解释在下面。

结合起来使用:

asciidoc 复制代码
当chroot_local_user=YES时,
chroot_list_enable
=YES时,表示当全部用户被锁定主目录时,而list表中的用户不受限制。
=NO时,表示不启动list表功能,也就是全部限制。

当chroot_local_user=NO时,
chroot_list_enable
=YES时,表示当全部用户不被锁定主目录时,而list表中的用户受限制。
=NO时,表示不启动list表功能,也就是全部不限制。

参见如下表格:

chroot_local_user=YES chroot_local_user=NO
chroot_list_enable=YES 所有用户都要限制在它自己家目录。一旦存在于list表中用户,可以切换家目录,不受限制。 所有用户都可以自由切换家目录。一旦存在于list表中用户,不可以切换家目录,受限制。
chroot_list_enable=NO 所有用户都要限制在它自己家目录。直接不考虑list表。 所有用户都可以自由切换家目录。直接不考虑list表。

锁定到家目录后,可能出现如下故障:

通过系统用户登录到ftp服务器,执行ls,报错如下:

shell 复制代码
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()

报错原因:

shell 复制代码
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,
则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报以上错误了。

解决办法有两种:

asciidoc 复制代码
一:去掉用户家目录的写权限:chmod a-w /home/lutixia
这种方法不建议,如果这样操作,那么用户家目录就没法创建,上传文件了。
二:就是添加上面的参数:allow_writeable_chroot=YES

6、三种用户

VSFTP提供了系统用户、匿名用户、和虚拟用户三种不同的登陆方式。所有的虚拟用户会映射成一个系统用户,访问时的文件目录是为此系统用户的家目录,匿名用户也是虚拟用户,映射的系统用户为ftp详细信息可以通过man vsftpd.conf(手册)查看。

最常用的是系统用户,新建的用户可以设置为可登录和不可登录,不可登录的用户就是专门用于ftp登录的。

shell 复制代码
#可以登录系统
useradd -d /data/lckd -s /bin/bash
#不可以登录系统
useradd -d /data/lckd -s /bin/nologin
相关推荐
dessler27 分钟前
Docker-run命令详细讲解
linux·运维·后端·docker
群联云防护小杜40 分钟前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
PyAIGCMaster1 小时前
ubuntu装P104驱动
linux·运维·ubuntu
奈何不吃鱼1 小时前
【Linux】ubuntu依赖安装的各种问题汇总
linux·运维·服务器
icy、泡芙1 小时前
T527-----音频调试
linux·驱动开发·音视频
aherhuo1 小时前
kubevirt网络
linux·云原生·容器·kubernetes
zzzhpzhpzzz1 小时前
Ubuntu如何查看硬件型号
linux·运维·ubuntu
蜜獾云1 小时前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
陌北v11 小时前
Docker Compose 配置指南
运维·docker·容器·docker-compose
只会copy的搬运工2 小时前
Jenkins 持续集成部署——Jenkins实战与运维(1)
运维·ci/cd·jenkins