Linux基础服务 ·

FTP服务搭建

所需软件及结构

vsftpd 服务只需 vsftpd 软件包,并且其配置文件也很少,是一个非常简单易用的服务,我们可以使用 yum install vsftpd 来进行安装,以下是比较重要的配置设定:

  • /etc/vsftpd/vsftpd.conf
    严格来说,整个 vsftpd 的配置文件就只有这个文件!这个文件的设定是以 bash 的变量设定相同的方式来处理的, 也就是『参数=设定值』来设定的,注意, 等号两边不能有空白!至于详细的 vsftpd.conf 可以使用 『 man 5 vsftpd.conf 』来详查。
  • /etc/pam.d/vsftpd
    这个是 vsftpd 使用 PAM 模块时的相关配置文件。主要用来作为身份认证之用,还有一些用户身份的过滤功能, 也是通过这个文件来达成的:

/etc/vsftpd/ftpusers上面那个 file 后面接的文件是『限制使用者无法使用 vsftpd 』之意, 也就是说,其实你的限制文件不见得要使用系统默认值,也可以在这个文件里面进行修改!

  • 与上一个文件有关系,也就是 PAM 模块 (/etc/pam.d/vsftpd) 所指定的那个无法登入的用户配置文件! 这个文件的设定很简单,你只要将『不想让他登入 FTP 的账号』写入这个文件即可。一行一个账号,看起来像这样:

绝大部分的系统账号都在这个文件内,也就是说,系统账号默认是没有办法使用 vsftpd 的! 如果你还想要让某些使用者无法登入,写在这里是最快的!

  • /etc/vsftpd/user_list
    这个文件是否能够生效与 vsftpd.conf 内的两个参数有关,分别是『 userlist_enable, userlist_deny 』。 如果说 /etc/vsftpd/ftpusers 是 PAM 模块的用户过滤设定项目,那么这个 /etc/vsftpd/user_list 则是 vsftpd 自定义的过滤项目。事实上这个文件与 /etc/vsftpd/ftpusers 几乎一模一样, 在预设的情况下,你可以将不希望可登入 vsftpd 的账号写入这里。不过这个文件的功能会依据 vsftpd.conf 配置文件内的 userlist_deny={YES/NO} 而不同,这得要特别留意!
  • /etc/vsftpd/chroot_list
    这个文件预设是不存在的,所以必须要手动自行建立。这个文件的主要功能是可以将某些账号的使用者 chroot 在他们的家目录下!但这个文件要生效与 vsftpd.conf 内的『 chroot_list_enable, chroot_list_file 』两个参数有关。 如果你想要将某些实体用户限制在他们的家目录下而不许到其他目录去,可以启动这个设定项目!
  • /usr/sbin/vsftpd
    这就是 vsftpd 的主要执行文件! vsftpd 只有这一个执行文件而已!
  • /var/ftp/
    这个是 vsftpd 的预设匿名者登入的根目录!其实与 ftp 这个账号的家目录有关!

大致上就只有这几个文件比较重要而已。

vsftpd.conf 设定值说明

/etc/vsftpd/vsftpd.conf 本身就是一个挺详细的配置文件,且使用『 man 5 vsftpd.conf 』则可以得到完整的参数说明。 以下是 vsftpd.conf 内的常用参数:


与服务器环境较相关的设定值

connect_from_port_20=YES (NO)
主动式联机使用的 FTP 服务器的 port 的 ftp-data 的端口;

listen_port=21
vsftpd 使用的命令通道 port,如果你想要使用非正规的端口,需要修改这个设定项目! 不过你必须要知道,这个设定值仅适合以 stand alone 的方式来启动!(对于 super daemon 无效)

dirmessage_enable=YES (NO)
当用户进入某个目录时,会显示该目录需要注意的内容,显示的文件默认是 .message ,你可以使用底下的设定项目来修订!

message_file=.message
当 dirmessage_enable=YES 时,可以设定这个项目来让 vsftpd 寻找该文件来显示讯息!

listen=YES (NO)
若设定为 YES 表示 vsftpd 是以 standalone 的方式来启动的!预设是 NO !所以我们的 CentOS 将它改为 YES !这样才能使用 stand alone 的方式来唤醒。

pasv_enable=YES (NO)
支持数据流的被动式联机模式(passive mode),一定要设定为 YES !

use_localtime=YES (NO)
是否使用本地时间?vsftpd 预设使用 GMT 时间(格林威治),所以预设的 FTP 内的文件日期会比中国晚 8 小时,建议修改设定为 YES !

write_enable=YES (NO)
如果你允许用户上传数据时,就要启动这个设定值;

connect_timeout=60
单位是秒,在数据连接的主动式联机模式下,我们发出的连接讯号在 60 秒内得不到客户端的响应,则不等待并强制断线。

accept_timeout=60
当用户以被动式 PASV 来进行数据传输时,如果服务器启用 passive port 并等待 client 超过 60 秒而无回应, 那么就给他强制断线!这个设定值与 connect_timeout 类似,不过一个是管理主动联机,一个管理被动联机。

data_connection_timeout=300
如果服务器与客户端的数据联机已经成功建立 (不论主动还是被动联机),但是可能由于线路问题导致 300 秒内还是无法顺利的完成数据的传送,那客户端的联机就会被我们的 vsftpd 强制剔除!

idle_session_timeout=300
如果使用者在 300 秒内都没有命令动作,强制脱机!避免占着茅坑不拉屎!

max_clients=0
如果 vsftpd 是以 stand alone 方式启动的,那么这个设定项目可以设定同一时间,最多有多少 client 可以同时连上 vsftpd !限制使用 FTP 的用量!

max_per_ip=0
与上面 max_clients 类似,这里是同一个 IP 同一时间可允许多少联机。

pasv_min_port=0, pasv_max_port=0
上面两个是与 passive mode 使用的 port number 有关,如果你想要使用 65400 到 65410 这 11 个 port 来进行被动式联机模式的连接,可以这样设定 pasv_max_port=65410 以及 pasv_min_port=65400。 如果是 0 的话,表示随机取用而不限制。

ftpd_banner=一些文字说明
当使用者联机进入到 vsftpd 时,在 FTP 客户端软件上头会显示的说明文字。不过,这个设定值数据比较少! 建议你可以使用底下的 banner_file 设定值来取代这个项目;

banner_file=/path/file
这个项目可以指定某个纯文本档作为使用者登入 vsftpd 服务器时所显示的欢迎字眼。同时,也能够放置一些让使用者知道本 FTP 服务器的目录架构!


与实体用户较相关的设定值

guest_enable=YES (NO)
若这个值设定为 YES 时,那么任何实体账号,均会被假设成为 guest  (所以预设是不开放的)! 至于访客在 vsftpd 当中,预设会取得 ftp 这个使用者的相关权限。但可以通过 guest_username 来修改。

guest_username=ftp
在 guest_enable=YES 时才会生效,指定访客的身份而已。

local_enable=YES (NO)
这个设定值必须要为 YES 时,在 /etc/passwd 内的账号才能以实体用户的方式登入我们的 vsftpd 服务器!

local_max_rate=0
实体用户的传输速度限制,单位为 bytes/second, 0 为不限制。

chroot_local_user=YES (NO)
在预设的情况下,是否要将使用者限制在自己的家目录之内(chroot)?如果是 YES 代表用户默认就会被 chroot,如果是 NO, 则预设是没有 chroot。不过,实际还是需要底下的两个参数互相参考才行。为了安全性,这里应该要设定成 YES 才好。

chroot_list_enable=YES (NO)
是否启用 chroot 写入列表的功能?与底下的 chroot_list_flie 有关!这个项目得要开启,否则底下的列表文件会无效。

chroot_list_file=/etc/vsftpd.chroot_list
如果 chroot_list_enable=YES 那么就可以设定这个项目了!这个项目与 chroot_local_user 有关。

userlist_enable=YES (NO)
是否藉助 vsftpd 的用户过滤机制来处理某些不受欢迎的账号,与底下的参数设定有关;

userlist_deny=YES (NO)
当 userlist_enable=YES 时才会生效的设定,若此设定值为 YES 时,则当使用者账号被列入到某个文件时, 在该文件内的使用者将无法登入 vsftpd 服务器!该文件的文件名与下列设定项目有关。

userlist_file=/etc/vsftpd/user_list
若上面 userlist_deny=YES 时,则这个文件就有用处了!在这个文件内的账号都无法使用 vsftpd !


匿名者登入的设定值

anonymous_enable=YES (NO)
设定为允许 anonymous 登入我们的 vsftpd 主机!预设是 YES ,底下的所有相关设定都需要将这个设定为 anonymous_enable=YES 之后才会生效!

anon_world_readable_only=YES (NO)
仅允许 anonymous 具有下载可读文件的权限,预设是 YES。

anon_other_write_enable=YES (NO)
是否允许 anonymous 具有除了写入之外的权限?包括删除与改写服务器上的文件及文件名等权限。预设当然是 NO!如果要设定为 YES,那么开放给 anonymous 写入的目录亦需要调整权限,让 vsftpd 的 PID 拥有者可以写入才行!

anon_mkdir_write_enable=YES (NO)
是否让 anonymous 具有建立目录的权限?默认值是 NO!如果要设定为 YES, 那么 anony_other_write_enable 必须设定为 YES !

anon_upload_enable=YES (NO)
是否让 anonymous 具有上传数据的功能,默认是 NO,如果要设定为 YES ,则 anon_other_write_enable=YES 必须设定。

deny_email_enable=YES (NO)
将某些特殊的 email address 屏蔽,不让那些 anonymous 登入!如果以 anonymous 登入服务器时,不是会要求输入密码吗?密码不是要你输入你的 email address 吗?如果你很讨厌某些 email address, 就可以使用这个设定来将他取消登入的权限!需与下个设定项目配合:

banned_email_file=/etc/vsftpd/banned_emails
如果 deny_email_enable=YES 时,可以利用这个设定项目来规定哪个 email address 不可登入我们的 vsftpd !在上面设定的文件内,一行输入一个 email address 即可!

no_anon_password=YES (NO)
当设定为 YES 时,表示 anonymous 将会略过密码检验步骤,而直接进入 vsftpd 服务器内!所以一般预设都是 NO 的!(登入时会检查输入的 emai)

anon_max_rate=0
这个设定值后面接的数值单位为 bytes/秒 ,限制 anonymous 的传输速度,如果是 0 则不限制(由最大带宽所限制),如果你想让 anonymous 仅有 30 KB/s 的速度,可以设定『anon_max_rate=30000』

anon_umask=077
限制 anonymous 上传文件的权限!如果是 077 则 anonymous 传送过来的文件权限会是 -rw------- !


关于系统安全方面的一些设定值

ascii_download_enable=YES (NO)
如果设定为 YES ,那么 client 就优先 (预设) 使用 ASCII 格式下载文件。

ascii_upload_enable=YES (NO)
与上一个设定类似的,只是这个设定针对上传而言!预设是 NO

one_process_model=YES (NO)
这个设定项目比较危险一点~当设定为 YES 时,表示每个建立的联机都会拥有一支 process 在负责,可以增加 vsftpd 的效能。不过, 除非你的系统比较安全,而且硬件配备比较高,否则容易耗尽系统资源!一般建议设定为 NO 的!

tcp_wrappers=YES (NO)
是否支持 TCP Wrappers !无特殊需求设定为 YES !

xferlog_enable=YES (NO)
当设定为 YES 时,使用者上传与下载文件都会被纪录起来。记录的文件与下一个设定项目有关:

xferlog_file=/var/log/xferlog
如果上一个 xferlog_enable=YES 的话,这里就可以设定了!这个是日志文件的文件名!

xferlog_std_format=YES (NO)
是否设定为 wu ftp 相同的日志文件格式?预设为 NO ,因为日志文件会比较容易读! 不过,如果你有使用 wu ftp 日志文件的分析软件,这里才需要设定为 YES

dual_log_enable=YES, vsftpd_log_file=/var/log/vsftpd.log
除了 /var/log/xferlog 的 wu-ftp 格式日志文件之外,还可以具有 vsftpd 的独特日志文件格式!如果你的 FTP 服务器并不是很忙碌, 或许订出两个日志文件的撰写 (/var/log/{vsftpd.log,xferlog) 是不错的。

nopriv_user=nobody
我们的 vsftpd 预设以 nobody 作为此一服务执行者的权限。因为 nobody 的权限相当的低,因此即使被入侵,入侵者仅能取得 nobody 的权限!

pam_service_name=vsftpd
这个是 pam 模块的名称,我们放置在 /etc/pam.d/vsftpd 便是这个!

上面这些是常见的 vsftpd 的设定参数,还有很多参数我没有列出来,你可以使用 man 5 vsftpd.conf 查阅!不过,基本上上面这些参数已经够我们设定 vsftpd 。

vsftpd 启动的模式

vsftpd 可以使用 stand alone 或 super daemon 的方式来启动,我们 CentOS 预设是以 stand alone 来启动的。 那什么时候应该选择 stand alone 或者是 super daemon 呢?如果你的 ftp 服务器是提供给整个因特网来进行大量下载的任务,例如各大专院校的 FTP 服务器,那建议你使用 stand alone 的方式, 服务的速度上会比较好。如果仅是提供给内部人员使用的 FTP 服务器,那使用 super daemon 来管理即可。


利用 CentOS 提供的 script 来启动 vsftpd (stand alone)

其实 CentOS 不用作任何设定就能够启动 vsftpd !是这样启动的:


自行设定以 super daemon 来启动 (有必要再进行,不用实作)

如果你的 FTP 是很少被使用的,那么利用 super daemon 来管理不失为一个好主意。 不过若你想要使用 super daemon 管理的话,那就得要自行修改一下配置文件了。其实也不难啦,你应该要这样处理的:

接下来修改一下 super daemon 的配置文件,底下这个文件你必须要自行建立的,原本是不存在的:

然后尝试启动看看:

两者启动的方式可是不一样的!管理的方式就会差很多的!不管你要使用哪种启动的方式,切记不要两者同时启动,否则会发生错误的!你应该使用 chkconfig --list 检查一下这两种启动的方式,然后依据你的需求来决定用哪一种方式启动。底下的设定都会以 stand alone 这个 CentOS 默认的启动模式来处理!


CentOS 的 vsftpd 默认值

在 CentOS 的默认值当中,vsftpd 是同时开放实体用户与匿名用户的,CentOS 的默认值如下:

通过这样的设定值咱们的 vsftpd 可以达到如下的功能:

  • 你可以使用 anonymous 这个匿名账号或其他实体账号 (/etc/passwd) 登入;
  • anonymous 的家目录在 /var/ftp ,且无上传权限,亦已经被 chroot 了;
  • 实体用户的家目录参考 /etc/passwd,并没有被 chroot,可前往任何有权限可进入的目录中;
  • 任何于 /etc/vsftpd/ftpusers 内存在的账号均无法使用 vsftpd (PAM);
  • 可利用 /etc/hosts.{allow|deny} 来作为基础防火墙;
  • 当客户端有任何上传/下载信息时,该信息会被纪录到 /var/log/xferlog 中;
  • 主动式联机的端口为 port 20;
  • 使用格林威治时间 (GMT)。

所以当你启动 vsftpd 后,你的实体用户就能够直接利用 vsftpd 这个服务来传输他自己的数据了。 不过比较大的问题是,因为 vsftpd 预设使用 GMT 时间,因为你在客户端使用 ftp 软件连接到 FTP 服务器时,会发现每个文件的时间都慢了八小时了! 所以建议你加设一个参数值『 use_localtime=YES 』!

如此一来你的 FTP 服务器不但可以提供匿名账号来下载 /var/ftp 的数据,如果使用实体账号来登入的话, 就能够进入到该用户的家目录底下去了!且使用本地端时间!

另外,如果你预计要将 FTP 开放给 Internet 使用时,请注意得要开放防火墙!关于防火墙的建置情况, 由于牵涉到数据流的主动、被动联机方式,因此,还得要加入防火墙模块。

针对实体账号的设定

虽然在 CentOS 的默认情况当中实体用户已经可以使用 FTP 的服务了,不过我们可能还需要一些额外的功能来限制实体用户。 举例来说,限制用户无法离开家目录 (chroot)、限制下载速率、限制用户上传文件时的权限 (mask) 等等。 底下我们先列出一些希望达到的功能,然后再继续进行额外功能的处理:

  • 希望使用台湾本地时间取代 GMT 时间;
  • 用户登入时显示一些欢迎讯息的信息;
  • 系统账号不可登入主机 (亦即 UID 小于 500 以下的账号);
  • 一般实体用户可以进行上传、下载、建立目录及修改文件等动作;
  • 用户新增的文件、目录之 umask 希望设定为 002;
  • 其他主机设定值保留默认值即可。

你可以自行处理 vsftpd.conf 这个文件,以下则是一个范例,让我们开始一步一步来依序处理先:

1.先建立主配置文件 vsftpd.conf,这个配置文件已经包含了主要设定值:

2.建立欢迎讯息:当我们想让登入者可查阅咱们系统管理员所下达的『公告』事项时,可以使用这个设定!那就是 banner_file=/etc/vsftpd/welcome.txt 这个参数的用途了!我们可以编辑这个文件即可。 好了,开始来建立欢迎画面!

3.建立限制系统账号登入的文件

    再来是针对系统账号来给予用户过滤的机制,其实有两个文件,一个是 PAM 模块管的,一个是 vsftpd 主动提供的, 在预设的情况下这两个文件分别是:
  • /etc/vsftpd/ftpusers:就是 /etc/pam.d/vsftpd 这个文件的设定所影响的;
  • /etc/vsftpd/user_list:由 vsftpd.conf 的 userlist_file 所设定。

这两个文件的内容是一样的,并且这两个文件必须要存在才行。请你参考你的 /etc/passwd 配置文件, 然后将系统用户的账号名称给他同时写到这两个文件内!一行一个账号!

4.测试结果:你可以使用图形接口的 FTP 客户端软件来处理,也可以通过 Linux 本身提供的 ftp 客户端功能!

由于默认一般用户无法登入 FTP 的!因为 SELinux 的问题! 然后以上面的方式测试完毕后,你可以在登入者账号处分别填写 (1)root (2)anonymous 来尝试登入看看! 如果不能登入的话,那就是设定 OK 的!(root 不能登入是因为 PAM 模块以及 user_list 设定值的关系, 而匿名无法登入,是因为我们 vsftpd.conf 里头就是设定不能用匿名登录!)

上面是最简单的实体账号相关设定。那如果你还想要限制用户家目录的 chroot 或其他如速限等数据,就得要看看底下的特殊设定项目。


实体账号的 SELinux 管理

在预设的情况下,CentOS 的 FTP 是不允许实体账号登入取得家目录数据的,这是因为 SELinux 的问题! 如果你在刚刚的 ftp localhost 步骤中,在 bye 离开 FTP 之前下达过『 dir 』的话,那你会发现没有任何资料跑出来, 这并不是你错了,而是 SELinux 不太对劲的缘故。那如何解决呢?这样处理即可:

这样就搞定了!如果还有其他可能发生错误的原因,包括文件数据使用 mv 而非使用 cp 导致 SELinux 文件类型无法继承原有目录的类型时,那就请自行查阅 /var/log/messages 的内容!通常 SELinux 没有这么难处理的!


对使用者 (包括未来新增用户) 进行 chroot

一般 FTP 使用环境中,大多数都是要开放给厂商联机来使用的,给自己人使用的机会虽然也有, 不过使用者数量通常比较少一些。所以,现在都是建议默认让实体用户通通被 chroot, 而允许不必 chroot 的账号才需要额外设定。这样的好处是,新建的账号如果忘记进行 chroot,反正原本就是 chroot, 比较不用担心如果该账号是开给厂商时该怎办的问题。

现在假设我系统里面仅有 vbird 与 dmtsai 两个账号不要被 chroot,其他如 student, smb1... 等账号通通预设是 chroot 的,包括未来新增账号也全部预设 chroot!需要给三个设定值加上一个额外配置文件就可以搞定!步骤如下:

如此一来,除了 dmtsai 与 vbird 之外的其他可用 FTP 的账号者,通通会被 chroot 在他们的家目录下, 这样对系统比较好啦!接下来,请你自己分别使用有与没有被 chroot 的账号来联机测试看看。


限制实体用户的总下载流量 (带宽)

为了避免带宽被使用者上传/下载所耗尽,而影响咱们服务器的其他正常服务,所以限制使用者的传输带宽有时也是需要的! 假设『我要限制所有使用者的总传输带宽最大可达 1 MBytes/秒 』时,你可以这样做即可:

上述的单位是 Bytes/秒,所以你可以依据你自己的网络环境来限制你的带宽!这样就给他限制好!测试用本机最准!你可以用 dd 做出一个 10MB 的文件放在 student 的家目录下,然后用 root 下达 ftp localhost,并输入 student 的帐密,接下来给他 get 这个新的文件,就能够在最终知道下载的速度了!


限制最大同时上线人数与同一 IP 的 FTP 联机数

如果你有限制最大使用带宽的话,那么你可能还需要限制最大在线人数才行!举例来说,你希望最多只有 10 个人同时使用你的 FTP 的话,并且每个 IP 来源最多只能建立一条 FTP 的联机时,那你可以这样做:


建立严格的可使用 FTP 的账号列表

在预设的环境当中,我们是将『不许使用 FTP 的账号写入 /etc/vsftpd/user_list 文件』,所以没有写入 /etc/vsftpd/user_list 当中的使用者就能够使用 FTP 了!如此一来,未来新增的使用者预设都能够使用 FTP 的服务。 如果换个角度来思考,若我想只让某些人可以使用 FTP 而已,亦即是新增的使用者预设不可使用 FTP 这个服务的话那么应该如何作呢?你需要修改配置文件成为这样:

则此时『写入 /etc/vsftpd/user_list 变成可以使用 FTP 的账号』了! 所以未来新增的使用者如果要能够使用 FTP 的话,就必须要写入 /etc/vsftpd/user_list 才行! 使用这个机制请特别小心,否则容易搞混掉。

通过这几个简单的设定值,相信 vsftpd 已经可以符合大部分合法 FTP 网站的需求! 更多详细的用法则请参考 man 5 vsftpd.conf !

例题:

假设你因为某些特殊需求,所以必须要开放 root 使用 FTP 传输文件,那么你应该要如何处理?

答:

由于系统账号无法使用 FTP 是因为 PAM 模块与 vsftpd 的内建功能所致,即 /etc/vsftpd/ftpusers 及 /etc/vsftpd/user_list 这两个文件的影响。所以你只要进入这两个文件,并且将 root 那一行批注掉,那 root 就可以使用 vsftpd这个 FTP 服务了。 不过,不建议如此做!

仅有匿名登录的相关设定

虽然你可以同时开启实体用户与匿名用户,不过建议你,服务器还是依据需求,针对单一种身份来设定! 底下我们将针对匿名用户来设定,且不开放实体用户。一般来说,这种设定是给类似大专院校的 FTP 服务器来使用的!

  • 使用本地时间,而非 GMT 时间;
  • 提供欢迎讯息,说明可提供下载的信息;
  • 仅开放 anonymous 的登入,且不需要输入密码;
  • 文件传输的速限为 1 Mbytes/second;
  • 数据连接的过程 (不是命令通道!) 只要超过 60 秒没有响应,就强制 Client 断线!
  • 只要 anonymous 超过十分钟没有动作,就予以断线;
  • 最大同时上线人数限制为 50 人,且同一 IP 来源最大联机数量为 5 人;

预设的 FTP 匿名者的根目录所在: ftp 账号的家目录

首先我们必须要知道的是匿名用户的目录在哪里? 事实上匿名者默认登入的根目录是以 ftp 这个用户的家目录为主,所以你可以使用『 finger ftp 』来查阅。 咱们的 CentOS 默认的匿名者根目录在 /var/ftp/ 中。且匿名登录者在使用 FTP 服务时,他预设可以使用『 ftp 』 这个使用者身份的权限,只是被 chroot 到 /var/ftp/ 目录中了。

因为匿名者只会在 /var/ftp/ 当中浏览,所以你必须将要提供给用户下载的数据通通给放置到 /var/ftp/ 去。 假设你已经放置了 linux 的相关目录以及 gnu 的相关软件到该目录中了,那我们可以这样做个假设:

然后将 vsftpd.conf 的数据清空,重新这样处理它:

建立 vsftpd.conf 的设定数据

建立欢迎画面与下载提示讯息

在这个案例当中,我们将欢迎讯息设定在 /etc/vsftpd/anon_welcome.txt 这个文件中, 至于这个文件的内容你可以这样写 (这个文件一定要存在!否则会造成客户端无法联机成功!):

主要写的数据都是针对一些公告事项!

客户端的测试:密码与欢迎讯息是重点!

同样的,我们使用 ftp 这个软件来给他测试一下吧!

这次可就不需要输入任何密码了,因为是匿名登录!而且,如果你以其他的账号来尝试登入时, 那么 vsftpd 会立刻响应仅开放匿名的讯息!(530 This FTP server is anonymous only.)


让匿名者可上传/下载自己的资料 (权限开放最大)

在上列的数据当中,实际上匿名用户仅可进行下载的动作而已。如果你还想让匿名者可以上传文件或者是建立目录的话, 那你还需要额外增加一些设定才行:


如果你设定上面四项参数,则会允许匿名者拥有完整的建立、删除、修改文件与目录的权限。 不过,实际要生效还需要 Linux 的文件系统权限正确才行! 我们知道匿名者取得的身份是 ftp ,所以如果想让匿名者上传数据到 /var/ftp/uploads/ 中,则需要这样做:

然后你以匿名者身份登入后,就会发现匿名者的根目录多了一个 /upload 的目录存在了,并且你可以在该目录中上传文件/目录! 如此一来系统的权限大开!很危险!所以,请仔细的控制好你的上传目录才行!

不过,在实际测试当中,却发现还是没办法上传!如果你有去看一下 /var/log/messages 的话,那就会发现啦! 又是 SELinux !通过『 sealert -l ... 』在 /var/log/messages 里面观察到的指令丢进去, 立刻就知道解决方案啦!解决方案就是放行 SELinux 的匿名 FTP 规则如下:


然后你再测试一下用 anonymous 登入,到 /uploads 去上传个文件,应该能够成功了。


让匿名者仅具有上传权限,不可下载匿名者上传的东西

一般来说,用户上传的数据在管理员尚未查阅过是否合乎版权等相关事宜前,是不应该让其他人下载的! 然而 前面的设定当中,用户上传的资料是可以被其他人所浏览与下载的!如此一来实在是很危险的!所以如果你要设定 /var/ftp/uploads/ 内通过匿名者上传的数据中,仅能上传不能被下载时,那么被上传的数据的权限就得要修改一下才行! 请将前面所设定的四个参数简化成为:

当然,那个 /var/ftp/uploads/ 还是需要可以被 ftp 这个使用者写入才行!如此一来被上传的文件将会被修改文件拥有者成为 daemon 这个使用者,而 ftp (匿名者取得的身份) 是无法读取 daemon 的数据的,所以也就无法被下载!

例题:

在上述的设定后,我尝试以 anonymous 登入并且上传一个大文件到 /uploads/ 目录下。由于网络的问题,这个文件传到一半就断线。 下在我重新上传时,却告知这个文件无法覆写!该如何是好?

答:

为什么会无法覆写呢?因为这个文件在你脱机后,文件的拥有者就被改为 daemon 了!因为这个文件不属于 ftp 这个用户了, 因此我们无法进行覆写或删除的动作。此时,你只能更改本地端文件的文件名再次的上传,重新从头一直上传!

被动式联机端口的限制

FTP 的联机分为主动式与被动式,主动式联机比较好处理,因为都是通过服务器的 port 20 对外主动联机, 所以防火墙的处理比较简单。被动式联机就比较麻烦,因为预设 FTP 服务器会随机取几个没有在使用当中的端口来建立被动式联机,那防火墙的设定就比较麻烦!

没关系,我们可以通过指定几个固定范围内的端口来作为 FTP 的被动式数据连接之用即可, 这样我们就能够预先知道 FTP 数据链路的端口!举例来说,我们假设被动式连接的端口为 65400 到 65410 这几个端口时,可以这样设定:


匿名用户的设定大致上这样就能符合你的需求了!

防火墙设定

FTP 使用两个端口,加上常有随机启用的数据流端口,以及被动式联机的服务器端口等, 所以,你可能得要进行:

加入 iptables 的 ip_nat_ftp, ip_conntrack_ftp 两个模块

开放 port 21 给因特网使用

开放预设的使用端口范围,本示例中是 port 65400~65410 端口给 Internet 联机用。

这样就好了!同时兼顾主动式与被动式的联机!并且加入所需要的 FTP 模块!

常见问题与解决方法

底下说明几个常见的问题与解决方法!

如果在 Client 端上面发现无法联机成功,请检查:

iptables 防火墙的规则当中,是否开放了 client 端的 port 21 登入?

在 /etc/hosts.deny 当中,是否将 client 的登入权限挡住了?

在 /etc/xinetd.d/vsftpd 当中,是否设定错误,导致 client 的登入权限被取消了?

 

如果 Client 已经连上 vsftpd 服务器,但是却显示『 XXX file can't be opend 』的字样,请检查:

最主要的原因还是在于在 vsftpd.conf 当中设定了检查某个文件,但是你却没有将该文件设定起来, 所以,请检查 vsftpd.conf 里面所有设定的文件的文件名,使用 touch 这个指令将该文件建立起来即可!

 

如果 Client 已经连上 vsftpd 服务器,却无法使用某个账号登入,请检查:

在 vsftpd.conf 里面是否设定了使用 pam 模块来检验账号,以及利用 userlist_file 来管理账号?

请检查 /etc/vsftpd/ftpusers 以及 /etc/vsftpd/user_list 文件内是否将该账号写入了?

 

如果 Client 无法上传文件:

最可能发生的原因就是在 vsftpd.conf 里面忘记加上这个设定『write_enable=YES』这个设定,请加入;

是否所要上传的目录『权限』不对,请以 chmod 或 chown 来修订;

是否 anonymous 的设定里面忘记加上了底下三个参数:

anon_other_write_enable=YES

anon_mkdir_write_enable=YES

anon_upload_enable=YES

是否因为设定了 email 过滤机制,又将 email address 写入该文件中了!?请检查!

是否设定了不许 ASCII 格式传送,但 Client 端却以 ASCII 传送呢?请在 client 端以 binary 格式来传送文件!

检查一下 /var/log/messages ,是否被 SELinux 所抵挡住了?

上面是蛮常发现的错误,如果还是无法解决你的问题,请你务必分析一下这两个文件:/var/log/vsftpd.log 与 /var/log/messages ,里面有相当多的重要资料,可以提供给你进行除错!不过 /var/log/vsftpd.log 却预设不会出现! 只有 /var/log/xferlog 而已。如果你想要加入 /var/log/vsftpd.log 的支持,可以这样做:


这样未来有新联机或者是错误时,就会额外写一份 /var/log/vsftpd.log !

参与评论