在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文件,添加如下配置:
pasv_min_port=2000
pasv_max_port=2021
然后重启vsftp,命令如下:
systemctl restart vsftpd
以上配置表示客户端发起的数据传输,连接到服务器的端口为2000到2021之间的随机一个端口。
4、使用ftp命令连接
在linux系统中,使用ftp命令连接ftp服务器(该命令需要单独安装),客户端也要分主动模式和被动模式。如果不加-p参数,默认就是以主动模式连接。
#客户端以被动模式连接ftp
ftp -p [ftp_server]
5、用户锁定家目录
当匿名用户登录到ftp服务器,本身是不能切换根目录的,所以这里主要是对系统用户做限制。
不加限制以前:
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.
修改配置文件,添加以下参数:
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES
对以上三个参数做个解释:
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:表示让家目录可写,具体的解释在下面。
结合起来使用:
当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,报错如下:
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
报错原因:
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,
则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报以上错误了。
解决办法有两种:
一:去掉用户家目录的写权限:chmod a-w /home/lutixia
这种方法不建议,如果这样操作,那么用户家目录就没法创建,上传文件了。
二:就是添加上面的参数:allow_writeable_chroot=YES
6、三种用户
VSFTP提供了系统用户、匿名用户、和虚拟用户三种不同的登陆方式。所有的虚拟用户会映射成一个系统用户,访问时的文件目录是为此系统用户的家目录,匿名用户也是虚拟用户,映射的系统用户为ftp详细信息可以通过man vsftpd.conf(手册)查看。
最常用的是系统用户,新建的用户可以设置为可登录和不可登录,不可登录的用户就是专门用于ftp登录的。
#可以登录系统
useradd -d /data/lckd -s /bin/bash
#不可以登录系统
useradd -d /data/lckd -s /bin/nologin