Linux安装vsftpd及配置详解

本文主要介绍Centos6.x安装vsftpd、配置文件、以及客户端的使用。

1.FTP服务端和客户端的安装

Centos默认Yum源自带了ftp的服务端和客户端软件,直接使用Yum安装。

1
# yum -y install vsftpd ftp

2.FTP主动模式与FTP被动模式

  • 主动模式

主动:默认情况下,ftp服务是开放了21端口,用来接受控制命令,服务器用20端口去发送数据(连接客户端大于1024的随机端口)

1
2
3
server				client
21 <-----------命令----------- 随机端口
20 ------------数据----------> 随机端口
  • 被动模式

被动:ftp服务也是开放21端口,用来接受命令控制,进行数据传输时,客户端会告知服务端打开一个大于1024的端口,然后客户端去主动连接服务

1
2
3
server				client
21 <-----------命令----------- 随机端口
随机端口 ---------数据-----------> 随机端口

主动模式:建立数据链路时由sever端去主动连接客户端的大于1024的随机端口
被动模式:建立数据链路时由client端去主动连服务端的随机端口

vsftpd默认使用被动模式。

3. FTP匿名登录

先启动vsftpd服务端:

1
# /etc/init.d/vsftpd start

使用ftp客户端连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
# ftp localhost
Trying ::1...
ftp: connect to address ::1Connection refused
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (localhost:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

匿名用户有两个:

用户名:anonymous 密码:空

用户名:ftp 密码:空

4.配置文件

  • 默认配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
# cat  /etc/vsftpd/vsftpd.conf  |grep -v ^# |grep -v ^$
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 #日志使用xferlog而不是vsftpd.log,改为NO的话,则相反
listen=YES #默认运行在stand alone下
pam_service_name=vsftpd #支持pam(可植入模块)
userlist_enable=YES #打开用户列表的功能
tcp_wrappers=YES #支持tcp_wrappers
  • 匿名用户(anonymous)设置

    • 不允许匿名用户登录
    1
    2
    3
    # vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO #修改配置文件
    # /etc/init.d/vsftpd reload
    • 匿名用户下载

    匿名用户默认是可以登录,也可以下载。默认使用匿名用户登录的服务端的/var/ftp目录下。

    • 匿名用户上传

    默认是不允许匿名用户上传的

    1
    2
    3
    4
    5
    6
    # vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES #允许匿名用户登录
    anon_upload_enable=YES #允许匿名用户上传文件
    anon_mkdir_write_enable=YES #允许匿名用户创建目录
    anon_other_write_enable=yes #允许匿名用户可以删除文件和重命名文件
    # chmod 777 /var/ftp/pub #把pub改为可写,用于上传
  • 普通用户(local)设置

    • 普通用户登录

    配置文件中local_enable=YES,默认是允许普通用户登录的。如果要限制普通用户登录,可以通过户列表来控制。

    1
    2
    3
    4
    # vim /etc/vsftpd/vsftpd.conf
    userlist_enable=yes #打开用户列表功能
    userlist_deny=YES #这一句可加可不加,默认就是有这一句的
    # vim /etc/vsftpd/user_list #加上要禁止的用户,一个用户写一行
    • 普通用户的下载和上传

    默认是允许下载和上传的。允许上传除了系统目录有写权限外,还有与服务的参数write_enable=YES有关。

    所有的本地用户(非匿名用户)登录后,都统一登录到/ftpdata/目录下:

    方法一:把所有的用户家目录改成/ftpdata/。但这样做会影响到系统用户登录到自己的家目录

    方法二:使用下面的参数,它不影响你系统用户登录到自己的家目录
    local_root=/ftpdata

    • 关于chroot环境

    默认情况下,普通用户(匿名用户除外)可以登录ftp后,cd切换到/下的任何地方,只要有r权限,就可以get文件,那么显示是不安全的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ftp> ls /
    227 Entering Passive Mode (127,0,0,1,182,179).
    150 Here comes the directory listing.
    dr-xr-xr-x 2 0 0 4096 Jun 26 19:11 bin
    dr-xr-xr-x 5 0 0 1024 Apr 10 13:58 boot
    drwxr-xr-x 2 0 0 4096 Oct 04 2017 cgroup
    drwxr-xr-x 3 0 0 4096 Apr 10 13:38 data
    drwxr-xr-x 18 0 0 3820 Jun 04 00:52 dev
    drwxr-xr-x 129 0 0 12288 Jun 29 19:19 etc
    drwxr-xr-x 4 0 0 4096 Jun 26 08:19 home
    drwxr-xr-x 2 0 0 4096 Apr 16 07:58 ks
    dr-xr-xr-x 11 0 0 4096 Apr 10 16:22 lib
    dr-xr-xr-x 10 0 0 12288 Jun 26 19:11 lib64
    drwx------ 2 0 0 16384 Apr 10 13:38 lost+found
    drwxr-xr-x 3 0 0 4096 Jun 01 06:05 media
    drwxr-xr-x 2 0 0 0 Jun 04 00:51 misc
    drwxr-xr-x 3 0 0 4096 Apr 10 16:13 mnt
    drwxr-xr-x 2 0 0 0 Jun 04 00:51 net
    drwxr-xr-x 3 0 0 4096 Jun 26 09:25 opt
    dr-xr-xr-x 151 0 0 0 Jun 04 00:51 proc
    drwxr-xr-x 3 0 0 4096 Jun 21 06:52 pydash
    dr-xr-x--- 38 0 0 4096 Jul 02 06:38 root
    dr-xr-xr-x 2 0 0 12288 Jun 26 19:11 sbin
    drwxr-xr-x 2 0 0 4096 Apr 10 13:42 selinux
    drwxr-xr-x 2 0 0 4096 Sep 23 2011 srv
    drwxr-xr-x 13 0 0 0 Jun 04 00:51 sys
    drwxrwxrwt 8 0 0 4096 Jul 01 19:19 tmp
    drwxr-xr-x 13 0 0 4096 Apr 10 13:42 usr
    drwxr-xr-x 23 0 0 4096 Jun 26 08:16 var
    dr-xr-xr-x 7 0 0 4096 Nov 29 2013 yum
    226 Directory send OK.

    普通用户ls /,可以看到系统的根目录,进入相应的目录就可以下载。

    通过chroot将普通用户限制在它的家目录。

    1
    2
    3
    4
    5
    # vim /etc/vsftpd/vsftpd.conf
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    # vim /etc/vsftpd/chroot_list #创建这个文件,并写上要加入笼环境的用户名,一行写一个
    # /etc/init.d/vsftpd reload

    如何把所有的普通用户(匿名用户默认就是笼环境)加入到chroot环境?

    1
    # chroot_local_user=YES

    注意:

    对于chroot_local_user与chroot_list_enable的组合效果,可以参考下表:

chroot_local_user=YES chroot_local_user=NO
chroot_list_enable=YES (1)所有用户都被限制在其主目录下 (2)使用chroot_list_file指定的用户列表,这些用户作为“例外”,不受限制 (1)所有用户都不被限制其主目录下 (2)使用chroot_list_file指定的用户列表,这些用户作为“例外”,受到限制
chroot_list_enable=NO (1)所有用户都被限制在其主目录下 (2)不使用chroot_list_file指定的用户列表,没有任何“例外”用户 (1)所有用户都不被限制其主目录下 (2)不使用chroot_list_file指定的用户列表,没有任何“例外”用户
  • 被动连接模式,控制服务器数据传输端口的范围
1
2
3
4
5
6
7
# vim /etc/vsftpd/vsftpd.conf
pasv_enable=YES #这一句默认不加也可以
pasv_min_port=3000
pasv_max_port=3005 #最小端口范围和最大端口范围可以自定义,也可以使用同一个端口

# netstat -nt |grep TIME_
tcp 0 0 127.0.0.1:3000 127.0.0.1:38206 TIME_WAIT

5.客户端工具的使用

  • ftp使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # ftp 127.0.0.1
    ftp> ls #查看远程文件
    ftp> !ls #感叹号后面执行本地命令
    ftp> ! #退出ftp命令行
    ftp> append ks.cfg a.txt #把本地的ks.cfg文件的内容追加到远程的a.txt
    ftp> cd ftp #进入远程的ftp目录
    ftp> lcd /root/ #改变本地工作目录
    ftp> get hello.txt #复制单个远程文件到本地
    ftp> put a.txt #复制一个本地文件到远程
    ftp> del ftp.txt #删除远程单个文件
    ftp> open 127.0.0.1 #连接到远程服务器
    ftp> close #结束FTP会话并返回命令行
    ftp> bye #结束FTP会话并退出
    ftp> glob #开关文件名通配符(默认ON)

    ftp> mget 1.tmp 2.tmp 3.tmp #复制一个或多个远程文件至本地 (ftp -i 127.0.0.1)
    ftp> mdel *.php #删除远程一个或多个文件
    ftp> mkdir tmp #创建一个远程目录
    ftp> mput *.txt #复制一个或多个本地文件到远程
    ftp> pwd #显示远程当前工作目录
    ftp> recv 1.tmp #复制远程文件到本地
    ftp> rename 1.tmp 1.tmp.bak #重命名远程文件
    ftp> rmdir tmp #删除远程目录
    ftp> send 1.tmp #复制一个本地文件到远程(功能同put)
    ftp> passive #主被动模式切换
---------------- The End ----------------