简单

参见:https://www.jianshu.com/p/1527af1c372c

版本

vsftpd: version 3.0.2CentOS7

FTP传输模式

文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载文件。
FTP基于C/S模式,FTP客户端与服务器端有两种传输模式,分别是FTP主动模式、FTP被动模式。主被动模式均是以FTP服务器端为参照。

  • FTP主动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器,FTP服务器以数据端口(20)连接到客户端指定的数据端口(N+1)

  • FTP被动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,客户端提交 PASV命令,服务器会开启一个任意的端口(P >1024),并发送PORT P命令给客户端。客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据

在企业实际环境中,如果FTP客户端与FTP服务端均开放防火墙,FTP需以主动模式工作,这样只需要在FTP服务器端防火墙规则中,开放20、21端口即可。

安装

在linux环境下,使用最多的FTP服务端软件就是Vsftpd

1
yum -y install vsftpd

添加ftp用户

1
useradd ftpuser

给ftp用户添加密码

1
2
passwd ftpuser
# 输入两次密码后修改密码

修改selinux

可能遇到的问题:

1
2
3
4
5
6
7
8
9
10
11
# 出现以下错误
setenforce: SELinux is disabled

# 解决方法
说明selinux已经被彻底的关闭了
如果需要重新开启selinux,请按下面步骤:

vi /etc/selinux/config
更改为:SELINUX=1

#必须重启linux,不重启是没办法立刻开启selinux的

继续

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看状态
getsebool -a | grep ftp
# 结果:
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

# 这两个都off
ftpd_full_access --> off
tftp_home_dir --> off
# 执行如下命令设置为on:
setsebool -P ftpd_full_access on
setsebool -P tftp_home_dir on

再次执行getsebool -a | grep ftp看到那两个状态是on就行了

关闭匿名访问

1
2
3
4
5
6
7
8
vi /etc/vsftpd/vsftpd.conf

# 默认是YES,改成NO
anonymous_enable=NO

# 继续在vsftp.conf文件【最下面】添加以下内容:(作用是设置FTP被动模式使用的端口范围)
pasv_min_port=30000
pasv_max_port=60999

然后保存退出即可

开启端口

1
2
3
4
5
6
7
# 打开20 21端口
firewall-cmd --zone=public --add-port=20/tcp --permanent
firewall-cmd --zone=public --add-port=21/tcp --permanent
# 打开上面FTP被动模式设置的端口
firewall-cmd --zone=public --add-port=30000-60999/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

设置开机启动

1
2
3
systemctl enable vsftpd
# 或者
chkconfig vsftpd on

启动服务

1
2
3
systemctl start vsftpd
# 或者
service vsftpd start

测试

打开filezilla工具,输入虚拟机的ip,20/21端口(不填也行,默认就是20/21),用户名和密码,点击快速连接,连接vsftp服务:

如图所示则连接成功。

配置nginx为图片服务器

按照以上步骤安装好nginx和vsftp后,还是不能访问上传的图片的,需要进行如下配置:

1
vi /etc/nginx/nginx.conf

按道理这样就可以了,但是我访问却报错:
403 forbidden,最后发现是因为ftpuser文件夹没有可读权限,执行如下命令:

1
2
# 授予普通用户文件夹及其子文件夹读写权限
chmod -R 777 /home/ftpuser

再次访问即可成功!

配置

配置文件说明

  • /etc/vsftpd/vsftpd.conf这个文件是vsftpd服务的核心配置文件!
    我们在修改配置文件的时候,最好先备份一份!

    1
    cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

    我们先来了解一下里边可以配置的大致内容:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    # 是否允许匿名登录FTP服务器,默认设置为YES允许
    # 用户可使用用户名ftp或anonymous进行ftp登录,口令为用户的E-mail地址。
    # 如不允许匿名访问则设置为NO
    anonymous_enable=YES
    # 是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许
    # 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub
    # 若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问FTP服务器
    local_enable=YES
    # 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许
    write_enable=YES
    # 掩码,本地用户默认掩码为077
    # 你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值
    local_umask=022
    # 是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES
    #anon_upload_enable=YES
    # 是否允许匿名用户创建新文件夹
    #anon_mkdir_write_enable=YES
    # 是否激活目录欢迎信息功能
    # 当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息
    # 默认情况下,欢迎信息是通过该目录下的.message文件获得的
    # 此文件保存自定义的欢迎信息,由用户自己建立
    dirmessage_enable=YES
    # 是否让系统自动维护上传和下载的日志文件
    # 默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定
    # 默认值为NO
    xferlog_enable=YES
    # Make sure PORT transfer connections originate from port 20 (ftp-data).
    # 是否设定FTP服务器将启用FTP数据端口的连接请求
    # ftp-data数据传输,21为连接控制端口
    connect_from_port_20=YES
    # 设定是否允许改变上传文件的属主,与下面一个设定项配合使用
    # 注意,不推荐使用root用户上传文件
    #chown_uploads=YES
    # 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名
    # 可以把上传的文件都改成root属主。whoever:任何人
    #chown_username=whoever
    # 设定系统维护记录FTP服务器上传和下载情况的日志文件
    # /var/log/vsftpd.log是默认的,也可以另设其它
    #xferlog_file=/var/log/vsftpd.log
    # 是否以标准xferlog的格式书写传输日志文件
    # 默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定
    # 默认值为NO
    xferlog_std_format=YES
    # 以下是附加配置,添加相应的选项将启用相应的设置
    # 是否生成两个相似的日志文件
    # 默认在/var/log/xferlog和/var/log/vsftpd.log目录下
    # 前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析;后者是vsftpd类型的日志
    #dual_log_enable
    # 是否将原本输出到/var/log/vsftpd.log中的日志,输出到系统日志
    #syslog_enable
    # 设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒
    # 即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒。可以根据实际情况对该值进行修改
    #idle_session_timeout=600
    # 设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改
    #data_connection_timeout=120
    # 运行vsftpd需要的非特权系统用户,缺省是nobody
    #nopriv_user=ftpsecure
    # 是否识别异步ABOR请求。
    # 如果FTP client会下达“async ABOR”这个指令时,这个设定才需要启用
    # 而一般此设定并不安全,所以通常将其取消
    #async_abor_enable=YES
    # 是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。
    # 启用此选项将允许服务器以ASCII方式传输数据
    # 不过,这样可能会导致由"SIZE /big/file"方式引起的DoS攻击
    #ascii_upload_enable=YES
    #ascii_download_enable=YES
    # 登录FTP服务器时显示的欢迎信息
    # 如有需要,可在更改目录欢迎信息的目录下创建名为.message的文件,并写入欢迎信息保存后
    #ftpd_banner=Welcome to blah FTP service.
    # 黑名单设置。如果很讨厌某些email address,就可以使用此设定来取消他的登录权限
    # 可以将某些特殊的email address抵挡住。
    #deny_email_enable=YES
    # 当上面的deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器
    # 此文件需用户自己创建,一行一个email address即可
    #banned_email_file=/etc/vsftpd/banned_emails
    # 用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限
    # 设置为YES时,用户被锁定在自己的home目录中,vsftpd将在下面chroot_list_file选项值的位置寻找chroot_list文件
    # 必须与下面的设置项配合
    #chroot_list_enable=YES
    # 被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录
    # 从而有利于FTP服务器的安全管理和隐私保护。此文件需自己建立
    #chroot_list_file=/etc/vsftpd/chroot_list
    # 是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O
    #ls_recurse_enable=YES
    # 是否允许监听。
    # 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
    listen=NO
    # 设定是否支持IPV6。如要同时监听IPv4和IPv6端口,
    # 则必须运行两套vsftpd,采用两套配置文件
    # 同时确保其中有一个监听选项是被注释掉的
    listen_ipv6=YES
    # 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件
    # 此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中
    pam_service_name=vsftpd
    # 是否允许ftpusers文件中的用户登录FTP服务器,默认为NO
    # 若此项设为YES,则user_list文件中的用户允许登录FTP服务器
    # 而如果同时设置了userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有
    userlist_enable=YES
    # 是否使用tcp_wrappers作为主机访问控制方式。
    tcp_wrappers=YES
  • /etc/vsftpd/ftpusers这个文件是禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏

  • /etc/vsftpd/user_list这个文件禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器

复杂

参见:https://blog.csdn.net/aiynmimi/article/details/77012507