Debian 安装 vsftpd 遇到的那些坑!

安装 vsftpd 是因为我有时候需要传一些比较大的文件,而 webdav 不支持大文件传输。本来以为很简单,结果安装起来是一坑接着一坑,搞了好些时间才明白了。现在做个总结,免得以后再踩进坑!
安装方法我就不多说了,网上很多。这里有一篇参考教程:Debian 下安装 FTP 服务 vsftpd

大坑 1-vsftpd 主 / 被动模式

vsftpd 默认开启的是主动模式,主动模式因为数据传输端口是随机的。所以路由上的端口映射都无法正常使用。
解决方法:在 /etc/vsfptd.conf 配置文件中开启 vsftpd 被动模式,端口范围可以自己设置。

1
2
3
4
#开启被动模式
pasv_enable=YES
pasv_min_port=6000
pasv_max_port=7000

大坑 2 - 添加 local 用户,无法访问 ftp

这个问题,研究了好久,问题出在 /etc/pam.d/vsftpd 这个文件中,打开这个文件可以看到内容:

1
2
3
4
5
6
7
8
# Standard behaviour for ftpd(8).
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
# Standard pam includes
@include common-account
@include common-session
@include common-auth
auth required pam_shells.so

请注意三个细节:

1
2
3
sense=deny
file=/etc/ftpusers
auth required pam_shells.so

第一行说明,在第二行所在文件中的用户都会被禁止访问 ftp 服务。第三行则说明,登陆用户需要有 shell。
不然连接 ftp 时会报错:530 Login incorrect.

解决方法:
我们需要创建一个有 shell 和有用户目录的用户名就 OK 了。

1
2
useradd -d /home/ftptest/user1 -s /bin/bash -M user1
passwd user1

不要听从网络上的教程将 /etc/vsftpd.conf 里面的 pam_service_name=vsftpd 改成其他值或者删除 /etc/pam.d/vsftpd。这会导致安全性问题,即你无法将 root 等高级权限帐号排除在 ftp 服务外,这将导致可以使用 root 登陆 ftp,引起一些不必要的麻烦。

大坑 3-FTP 的用户,并不需要 shell.

这个是上面这个问题的改进,因为我们很多时候,新建的用户只是用来登陆 FTP,并不需要登陆 shell。这样每个用户都让他可以 shell 登陆到 debian 上也不安全。
解决方法:
修改 /etc/pam.d/vsftpd 文件
auth required pam_shells.so 修改为 auth required pam_nologin.so 即可
重启 vsftpd.

大坑 4-FTP 限制用只能访问 HOME 目录

编辑 /etc/vsftpd/ 下有个文件 vsftpd.conf

去掉 chroot_local_user 前的注释

1
2
3
chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list

以上 3 句配置的解释:
chroot_local_user=YES # 是否将所有用户限制在主目录,YES 为启用,NO 禁用
chroot_list_enable=YES # 是否启动限制用户的名单,YES 为启用 ,NO 禁用
chroot_list_file=/etc/vsftpd/chroot_list # 是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于 chroot_local_user 的值
如果 chroot_local_user 为 YES,则 chroot_list 中的用户排除在限制之外;
如果 chroot_local_user 为 NO,则 chroot_list 中的用户限制在主目录下;

以此配置登录时会报错:“500 OOPS: vsftpd: refusing to run with writable rootinside chroot () ”

因为从 2.3.5 之后,vsftpd 增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了,如果检查发现还有写权限,就会报该错误。要修复这个错误,可以用命令 chmod a-w /home/user 去除用户主目录的写权限(注意把 user 替换成你自己对应的 user)。或者你可以在 vsftpd 的配置文件中增加如下项:

1
allow_writeable_chroot=YES

结尾

下面贴出我自己的 vsftpd.conf 的配置。里面有添加中文备注方便英文不好的同学了解一下,大神请跳过!

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# Example config file /etc/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
#
# 是否允许监听。
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen=NO
#
# 设定是否支持IPV6。如要同时监听IPv4和IPv6端口,
# 则必须运行两套vsftpd,采用两套配置文件
# 同时确保其中有一个监听选项是被注释掉的
listen_ipv6=YES
#
# 是否允许匿名登录FTP服务器,默认设置为YES允许
# 用户可使用用户名ftp或anonymous进行ftp登录,口令为用户的E-mail地址。
# 如不允许匿名访问则设置为NO
anonymous_enable=NO
#
# 允许匿名用户创建目录;
#anon_mkdir_write_enable=YES
#
# 允许匿名用户其他写入权限。
#anon_other_write_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
#
# If enabled, vsftpd will display directory listings with the time
# in your local time zone. The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
use_localtime=YES
#
# 是否让系统自动维护上传和下载的日志文件
# 默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定
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=NO

# 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名
# 可以把上传的文件都改成root属主。whoever:任何人
#chown_username=whoever
#
# 设定系统维护记录FTP服务器上传和下载情况的日志文件.
# /var/log/vsftpd.log是默认的,也可以另设其它.
#xferlog_file=/var/log/vsftpd.log
#
# 是否以标准xferlog的格式书写传输日志文件
# 默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定
#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_local_user=YES
#
# 被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录
# 从而有利于FTP服务器的安全管理和隐私保护。此文件需自己建立
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
#
# 是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O
#ls_recurse_enable=YES
#
# 是否允许ftpusers文件中的用户登录FTP服务器,默认为NO
# 若此项设为YES,则user_list文件中的用户允许登录FTP服务器
# 而如果同时设置了userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有
#userlist_enable=YES/NO
#
# 设置是否阻扯user_list文件中的用户登录FTP服务器,默认为YES
#userlist_deny=YES/NO
# Customization
#
# Some of vsftpd's settings don't fit the filesystem layout by
# default.
#
# This option should be the name of a directory which is empty. Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty
#
# 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件
# 此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

#
# Uncomment this to indicate that vsftpd use a utf8 filesystem.
#utf8_filesystem=YES
#
#开启被动模式
pasv_enable=YES
pasv_min_port=6000
pasv_max_port=7000
#
#开启主动模式:
#connect_from_port_20=YES
#pasv_enable=NO
#
#ftp用户登陆后的初始目录
#local_root=/mnt/ftp
#allow_writeable_chroot=YES