文件服务器 FTP服务器

FTP 服务器

过去的FTP有相当多的安全问题,为了更安全的使用FTP协议,就有了较为安全但功能较少的vsftpd这个软件

FTP包含不同等级的用户身份:user, guest, anonymous,使用者可以使用三种不同的身份,1,实体账号real user,2,访客guest,3,匿名登录者,anonymous这三种

这三种身份在系统的权限上面差异很大,例如实体用户取得系统的权限比较完整,可以进行比较多的动作,至于匿名登录者,大概仅提供下载的能力而已,不允许其使用太多的

资源,当然,这三种人物使用的【在线指令】自然就不相同了。

命令记录与登录文件记录:FTP可以利用系统的syslogd来进行数据的记录,而记录的数据包括用户曾经下达过的命令与用户传输数据(传输时间,档案大小等等)的记录

所以你可以很轻松的在 /var/log/ 里面找到各项登录信息

限制用户活动的目录: (change root, 简称 chroot):为了避免用户在Linux系统当中随意跳来跳去,所以将使用者的工作范围局限在用户的家目录底下,当用户登入FTP后,显示

的【根目录】就是自己家目录的内容,这种环境称之为change root 简称chroot,改变根目录的意思。当一个恶意的使用者以 FTP 登入你的系统当中,如果没有 chroot 的环境下,

他可以到 /etc, /usr/local, /home 等其他重要目录底下去察看档案数据,如/etc/passwd等等,如果没有做好一些档案权限的管理与维护,那他就有办法取得系统的某些重要资料

用来入侵你的系统,所以在chroot环境下,当然比较安全一些。

FTP 的运作流程与使用到的端口口

FTP 的传输使用的是 TCP 封包协议,TCP在建立联机之前会进行三向交握,不过FTP比较麻烦,因为他使用了两个联机,分别是命令信道与数据流通道(ftp-data),这两个联机

都需要经过三向交握,因为是TCP封包,这两个联机通道的关系是:底下我们先以 FTP 预设的主动式 (active) 联机来作个简略的说明:

1.建立命令通道的联机:客户端随机取一个大于1024以上的端口来与服务器port21达成联机,这个过程需要三向交握,达成联机后客户端便可以透过这个联机来对FTP服务器下达

命令,包括查询文件,下载,上传等都是利用这个通道来下达的

2.通知 FTP 服务器端使用 active 且告知连接的埠号:FTP服务器的21端口号主要用在命令的下达,但是当牵涉到数据流时,就不是使用这个联机了,客户端在需要数据的情况下

会告知服务器端要用什么方式来联机,如果是主动式 (active) 联机时, 客户端会先随机启用一个埠口portBB,且透过命令通道告知FTP服务器这两个消息,等待FTP服务器联机

3.FTP 服务器『主动』向客户端联机:FTP服务器由命令通道了解客户端的需求后,会主动的由20这个端口向客户端的portBB联机,这个联机当然也是经过三向交握,此时FTP的

客户端与服务器端一共会建立两条联机,分别用在命令的下达与数据的传输,而预设FTP服务器端使用的主动联机端口号是port 20

如此一来则成功的建立起『命令』与『数据传输』两个信道,『数据传输信道』是在有数据传输的行为时才会建立的通道,并不是一开始连接到FTP服务器就立刻建立的通道

主动式联机使用到的埠号:命令通道的 ftp (默认为 port 21) 与数据传输的 ftp-data (默认为port 20):port 21 主要接受来自客户端的主动联机,至于port 20则是FTP服务器主动

联机客户端的,这样的情况在服务器与客户端两者同时为公共IP的因特网上面通常没有太大的问题,不过万一你的客户端是在防火墙后端,或是是NAT服务器后端,一般来说,

很多的局域网络都会使用防火墙(iptables)的NAT功能,那么在NAT后端的FTP用户如何连接到FTP服务器?

FTP 客户端与服务器端联机中间具有防火墙的联机状态

1.用户与服务器间命令信道的建立:因为NAT会主动的记录由内部送往外部的联机信息,而由于命令信道的建立是由客户端向服务器端联机的,因此这一条联机可以顺利的建立

2. 用户与服务器间数据信道建立时的通知:客户端主动会先启用port BB,并透过命令通道告知FTP服务器,且等待服务器端的主动联机

3. 服务器主动连接到NAT等待转递至客户端的联机问题:但是由于透过NAT的转换后,FTP服务器只能得知NAT的IP而不是客户端的IP,因此FTP服务器会以port 20主动的向NAT

的port BB发送主动联机的要求,但你的NAT并没有启动port BB来监听FTP服务器的联机。这就是问题所在!因为在FTP主动式联机当中,NAT将会被视为客户端,但NAT其实

并非客户端,这就是问题,如果你曾经在IP分享器后面连接某些FTP服务器时,可能会发现明明连接上了FTP服务器(命令通道已建立),但是就是无法取得文件名的列表,会提

示:『 Can't build data connection: Connection refused,无法进行数据传输』之类的讯息,那肯定就是这个原因造成的

目前有两个简易的方法可以克服这个问题:

1. 使用 iptables 所提供的 FTP 侦测模块:iptables提供了这个模块,你可以使用modprobe这个命令来加载ip_conntrack_ftp 及 ip_nat_ftp 等模快,这几个模块会主动的分析

【目标是port 21的联机】信息,所以可以得到port BB的资料,此时若接受到FTP服务器的主动联机,就能够将该封包导向正确的后端主机了。不过,如果你链接的目标 FTP 服

务器他的命令通道默认端口号并非标准的 21号端口,那么这两个模块就无法顺利解析出来了。

2. 客户端选择被动式 (Passive) 联机模式:除了主动式联机之外,FTP 还提供一种称为被动式联机的模式,什么是被动式呢?既然主动式是由服务器向客户端联机,反过来

说,被动式就是由客户端向服务器端发起联机的,既然是客户端发起联机的,那自然就不需要考虑来自port 20的联机了。

客户端选择被动式联机模式

1. 用户与服务器建立命令信道:同样的需要建立命令通道,透过三向交握就可以建立起这个通道了

2. 客户端发出 PASV 的联机要求:当有使用数据信道的指令时,客户端可通过命令通道发出PASV的被动式联机要求(Passive的缩写),并等待服务器的回应

3. FTP 服务器启动数据端口口,并通知客户端联机:如果你的 FTP 服务器是能够处理被动式联机的,此时 FTP 服务器会先启动一个埠口在监听。 这个端口口号码可能是随机的

,也可以自定义某一范围的端口,然后你的FTP服务器会透过命令通道告知客户端该已经启动的端口(port PASV),并等待客户端的联机。

4. 客户端随机取用大于 1024 的埠口进行连接:然后你的客户端会随机取用一个大于1024的端口号来对主机的port PASV联机,如果一切顺利,那么你的FTP数据就可以透过

port BB及port PASV来传送了。被动式 FTP 数据信道的联机方向是由客户端向服务器端联机的,如此一来,在 NAT 内部的客户端主机就可以顺利的连接上 FTP Server 了

但是,万一 FTP 主机也是在 NAT 后端那怎么办?此时就要牵涉到DMZ技巧了,此外,透过 PASV 模式,服务器在没有特别设定的情况下,会随机选取大于 1024 的埠口来提供

客户端连接之用,那么万一服务器启用的端口被搞鬼了,而且,如此一来很难追踪入侵者的登入信息,所以这个时候可以透过passive ports的功能来【限定】服务器启用port 

number

FTP 的安全性问题与替代方案

FTP原先是明码传输的,但拜SSH所赐,目前已经有了较为安全的FTP,那就是ssh提供的sftp这个server,这个sftp-server最大的优点就是【在上面传输的数据时经过加密的】,

所以你在因特网上面流串的时候尽量的小心点,所以建议你使用SSH提供的sftp-server功能

然而这个功能对于一些习惯了图形接口,或者是有中文档名的使用者来说,实在是不怎么方便, 虽说目前有个图形接口的 filezilla 客户端软件,不过很多时候还是会发生一些莫

名的问题说,所以,有的时候 FTP 网站还是有其存在的需要的。如果真的要架设 FTP 网站,那么还是得需要注意几个事项喔:

1. 随时更新到最新版本的 FTP 软件,并随时注意漏洞讯息;

2. 善用 iptables 来规定可以使用 FTP 的网域;

3. 善用 TCP_Wrappers 来规范可以登入的网域;

4. 善用 FTP 软件的设定来限制使用你 FTP 服务器的使用者的不同权限啊;

5. 使用 Super daemon 来进阶管理你的 FTP 服务器;

6. 随时注意用户的家目录、以及匿名用户登入的目录的『档案权限』;

7. 若不对外公开的话,或许也可以修改 FTP 的 port 。

8. 也可以使用 FTPs 这种加密的 FTP 功能!

开放什么身份的使用者登入: 由于FTP登入者的身份可以分为三种,

1. 开放实体用户的情况 (Real user):很多的FTP服务器默认就已经允许实体用户的登入了,不过,需要了解的是,以实体用户作为FTP登入者身份时,系统默认并没有针对实体

用户来进行【限制】的,所以你可以针对整个文件系统进行任何他所具有权限的工作,因此,如果你的FTP使用者没能好好的保护自己密码而导致被入侵,那么你的整个Linux

系统数据就很有可能被窃取了,开放实体用户时的建议如下:

使用替代的 FTP 方案较佳:由于实体用户本来就可以透过网络连接到主机来进行工作(例如SSH),因此实在没有需要特别的开放FTP的服务,因此例如Sftp本来就能达到传输档

案的功能,限制用户能力,如 chroot 与 /sbin/nologin 等:如果确定要让实体用户利用FTP服务器的话,那么你可能需要让某些系统账号无法登入FTP才行,例如bin apache等等

最简单常用的做法是透过PAM模块来处理,譬如vsftpd这个软件默认可以透过/etc/vsftpd/ftpusers这个档案来设定不想让他具有登入FTP的账号,另外使用者身份chroot很重要

2. 访客身份 (Guest) :通常会建立 guest 身份的案例当中,多半是由于服务器提供了类似『个人 Web 首页』的功能给一般身份用户,这些使用者总是需要管理自己的网页空间

将使用者的身份压缩成为 guest,并且将他的可用目录设定好,即可提供使用者一个方便的使用环境了!且不需要提供他 real user 的权限,常见的建议如下:

仅提供需要登入的账号即可,不需要提供系统上面所有人均可登入的环境,我们在服务器的设定当中,需要针对不同的访客给他们不一样的『家目录』,而这个家目录与用户的

权限设定需要相符合,例如要提供 dmtsai 这个人管理他的网页空间,而他的网页空间放置在 /home/dmtsai/www 底下,那我就将 dmtsai 在 FTP 提供的目录仅有 

/home/dmtsai/www 而已,比较安全,针对这样的身份者,需要设定较多的限制,包括:上下传档案数目与硬盘容量的限制、 联机登入的时间限制、许可使用的指令要减少很多很

多,例如 chmod就不要允许他使用等等。

3. 匿名登录使用者 (anonymous):提供匿名者给因特网的使用者进入实在不是个好主意,因为每个人都可以去下载,如果要开放匿名者的话,要注意:不要将重要的资料放置

到匿名者可以读取的目录中,还有很多限制都要进行,包括:允许的工作指令要减低很多, 几乎就不许匿名者使用指令啦,限制文件传输的数量,尽量不要允许『上传』数据的

设定,限制匿名者同时登入的最大联机数量,可以控制盗连

总之如果你提供的数据没有版权的问题,那么对因特网开放是OK的,但是如果你提供的软件具有版权的话,该版权允许在内网中传输,此时架设一个『仅针对内部开放的匿名 

FTP 服务器 (利用防火墙处理) 』也是 OK 的,如果你还想要让使用者反馈的话,那是否要架设一个匿名者可上传的区域,尽量不要这样做,除非这个使用者是可以信任的,否则

不要允许对方上传,所以此时一个文件系统权限管理严格的 FTP 服务器,并提供实体用户的登入就有点需求。

vsftpd 服务器基础设定

vsftpd针对操作系统的【程序的权限】概念来设计,系统上面执行的程序都会引发一个程序,成为PID,这个PID在系统上面能进行的任务与他拥有的权限有关,PID拥有的权限

等级越高,他能够进行的任务就越多,例如,使用root身份所触发的PID通常拥有可以进行任何工作的权限等级,不过,万一触发这个 PID 的程序 (program) 有漏洞而导致被网络

怪客所攻击而取得此 PID 使用权时,那么他将取得这个PID拥有的权限,所以,近来发展的软件都会尽量的将服务取得的PID权限降低,使用该服务即使被入侵者取得也无法得到

有效的系统管理权限,这样做比较安全,vsftpd就是基于这个想法而设计的。除了 PID 方面的权限之外, vsftpd 也支持 chroot 这个函式的功能,他可以将某个特定的目录变成

根目录,所以与根目录没有关系的其他目录就不会被误用了。例如,你使用匿名身份登入FTP服务的话,通常被限定在/var/ftp目录下工作,而你看到的根目录其实就只是/var/ftp

,至于系统其他的目录你就看不到了,这样即使这个ftp服务被攻破了,那也没关系,入侵者还是仅能在/var/ftp里面跑来跑去而已,而无法使用Linux的完整功能,系统比较安全

vsftpd具有底下的特定:

vsftpd这个服务的启动者身份时一般用户,对于Linux的权限较低,对于Linux系统的危害较低,此外vsftpd利用chroot()可以进行改换根目录的动作,使得系统工具不被vsftpd这支

服务器所误用,任何需要具有较高执行权限的 vsftpd 指令均以一支特殊的上层程序所控制, 该上层程序享有的较高执行权限功能已经被限制的相当的低,并以不影响 Linux 本身

的系统为准,绝大部分 ftp 会使用到的额外指令功能 (dir, ls, cd ...) 都已经被整合到 vsftpd 主程序当中了,因此理论上vsftpd不需要用到额外的系统提供的指令,在chroot情况下,

vsftpd不但可以顺利运作,且不需要额外功能对于系统来说比较安全。所有来自客户端且想要使用这支上层程序所提供的较高执行权限之 vsftpd 指令的需求, 均被视为『不可信

任的要求』来处理,必需要经过相当程度的身份确认后,方可利用该上层程序的功能。 例如 chown(), Login 的要求等等动作。

所需要的软件以及软件结构

vsftpd 所需要的软件只有一个,那就是 vsftpd,使用yum install vsftpd来安装,这些设定数据比较重要的有:

/etc/vsftpd/vsftpd.conf  严格来说,整个 vsftpd 的配置文件就只有这个档案,这个档案的设定是以bash的变量设定相同的方式来处理的,也就是『参数=设定值』来设定的,注

意, 等号两边不能有空白,使用man 5 vsftpd.conf来查看详细资料。

/etc/pam.d/vsftpd 这个是vsftpd使用PAM模块时的相关配置文件,主要用来作为身份认证之用,还有一些用户身份的低档功能,也是透过这个档案来达成的,

cat /etc/pam.d/vsftpd

auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed 这行内容中的deny file是【限制使用者无法使用vsftpd】之意,也就是说,其实你的

限制档案不见的要使用系统默认值,也可以在这个档案里面进行修改。

/etc/vsftpd/ftpusers 这个档案与上一个档案有关系,也就是/etc/pam.d/vsftpd所指定的那个无法登入的用户配置文件,你只要将【不想让他登入FTP的账号】写入这个档案即可

一行一个账号,可以看到这个文件中有很多系统默认账号,因为系统默认账号是没有办法是用vsftpd的

/etc/vsftpd/user_list 这个档案是否能够生效与vsftpd.conf内的两个参数有关,userlist_enable, userlist_deny,这个/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 设定值说明

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

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

listen_port=21  vsftpd 使用的命令通道 port,如果你想要使用非正规的埠号,在这个设定项目修改,这个设定值适合以stand alone的方式来启动

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

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

listen=YES (NO) 若设定YES表示vsftpd是以standalone的方式启动,预设为NO,所以要将其改为YES,使用stand alone的方式来唤醒

pasv_enable=YES (NO) 支持数据流的被动式联机模式,一定要设定为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 秒而无回应, 那么就给他强制断线,与上面那个类似,不过一

个是管理主动联机,一个管理被动联机

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

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到65411这11个端口来进行被动式联机模式的连接,可以设定

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) 当为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,就可以使用这个设定来将他取消登入的权限!需与下个设定项目配合:

banned_email_file=/etc/vsftpd/banned_emails  如果 deny_email_enable=YES 时,可以利用这个设定项目来规定哪个 emailaddress 不可登入我们的 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 启动的模式

vsftpd 可以使用 stand alone 或 super daemon 的方式来启动,预设使用stand alone来启动的,一般如果你的FTP服务器是提供给整个因特网来进行大量下载的任务,那就建议

你使用stand alone的方式,服务的速度会比较好,如果仅是提供个内部人员使用的FTP服务器,那使用super damon来管理即可

利用 CentOS 提供的 script 来启动 vsftpd (stand alone)  /etc/init.d/vsftpd start,查看端口 netstat -tulnp| grep 21

自行设定以 super daemon 来启动 (有必要再进行,不用实作),你的 FTP 是很少被使用的,那么利用 super daemon 来管理,修改一下配置文件

vim /etc/vsftpd/vsftpd.conf   # 找到 listen=YES 这一行:大约在 109 行左右啦,并将它改成: listen=NO

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

vim /etc/xinetd.d/vsftpd编辑 ,接着启动/etc/init.d/vsftpd stop   /etc/init.d/xinetd restart   netstat -tulnp| grep 21

两者启动方式不一样,切记不要两者同时启动,使用chkconfig --list 检查一下这两种启动的方式,目前使用的是stand alone来启动处理的

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

vim /etc/vsftpd/vsftpd.conf

anonymous_enable=YES <==支持匿名者的登入使用 FTP 功能

# 2. 与实体用户有关的设定

local_enable=YES <==支持本地端的实体用户登入   write_enable=YES <==允许用户上传数据 (包括档案与目录)  local_umask=022 <==建立新目录 (755) 与档案 (644) 的权限

# 3. 与服务器环境有关的设定

dirmessage_enable=YES <==若目录下有 .message 则会显示该档案的内容   xferlog_enable=YES <==启动登录文件记录,记录于 /var/log/xferlog

connect_from_port_20=YES <==支持主动式联机功能    xferlog_std_format=YES <==支持 WuFTP 的登录档格式   listen=YES <==使用 stand alone 方式启动 vsftpd

pam_service_name=vsftpd <==支持 PAM 模块的管理    userlist_enable=YES <==支持 /etc/vsftpd/user_list 档案内的账号登入管控!

tcp_wrappers=YES <==支持 TCP Wrappers 的防火墙机制

练习:你可以使用 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预设使用GMT时间,因此客户端 使用FTP连接到FTP服务器端时,会发现每个档案的时间都慢了八小时,建议加一个参数值,就是『 

use_localtime=YES 』

vim /etc/vsftpd/vsftpd.conf   # 在这个档案当中的最后一行加入这一句即可 use_localtime=YES   /etc/init.d/vsftpd restart   chkconfig vsftpd on

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

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

针对实体账号的设定:CentOS默认情况实体用户可以使用FTP的服务,不过可能还需要一些额外的功能来限制实体用户,例如,限制用户无法离开家目录(chroot),限制下载

速率,限制用户上传档案的权限(mask)等等,底下列一些希望达到的功能,然后继续进行额外功能的处理:

希望使用台湾本地时间取代 GMT 时间; 用户登入时显示一些欢迎讯息的信息; 系统账号不可登入主机 (亦即 UID 小于 500 以下的账号); 一般实体用户可以进行上传、下载、

建立目录及修改档案等动作; 用户新增的档案、目录之 umask 希望设定为 002;其他主机设定值保留默认值即可。

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

vim /etc/vsftpd/vsftpd.conf

# 1. 与匿名者相关的信息,在这个案例中将匿名登录取消: anonymous_enable=NO

# 2. 与实体用户相关的信息:可写入,且 umask 为 002 喔  local_enable=YES write_enable=YES local_umask=002 userlist_enable=YES  userlist_deny=YES

userlist_file=/etc/vsftpd/user_list <==这个档案必须存在!还好,预设有此档案!

# 3. 与服务器环境有关的设定  use_localtime=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES 

pam_service_name=vsftpd tcp_wrappers=YES banner_file=/etc/vsftpd/welcome.txt <==这个档案必须存在!需手动建立

/etc/init.d/xinetd restart <==取消 super dameon     /etc/init.d/vsftpd restart

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 配置文件, 然后将 UID 小于 500 的账号名称给他同时写到这两个档案内

4. 测试结果:测试使用已知使用者登入,例如 dmtsai 这个实体用户:ftp localhost  由于默认一般用户无法登入 FTP 的!因为 SELinux 的问题,你可以在登入者账号处分别填写 

(1)root (2)anonymous 来尝试登入看看,如果不能登入的话,那就是设定 OK 的啦!(root 不能登入是因为 PAM 模块以及 user_list 设定值的关系, 而匿名无法登入,是因为我们 

vsftpd.conf 里头就是设定不能用匿名登录

实体账号的 SELinux 议题:预设的情况下,CentOS 的 FTP 是不允许实体账号登入取得家目录数据的,这是因为  SELinux 的问题,那如何解决呢?这样处理即可:

getsebool -a | grep ftp     ftp_home_dir --> off <==就是这玩意儿!要设定 on 才行! setsebool -P ftp_home_dir=1,如果还有问题,请自行查阅/var/log/messages 的内容

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

现在都是建议默认让实体用户通通被 chroot, 而允许不必 chroot 的账号才需要额外设定,假设我系统里面仅有 vbird 与 dmtsai 两个账号不要被 chroot,其他如 student, smb1... 

等账号通通预设是 chroot 的,包括未来新增账号也全部预设chroot,需要三个设定值加上一个额外配置文件就搞定了

# 1. 修改 vsftpd.conf 的参数值:# 增加是否设定针对某些使用者来 chroot 的相关设定   chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list

# 2. 建立不被 chroot 的使用者账号列表,即使没有任何账号,此档案也是要存在! vim /etc/vsftpd/chroot_list  vbird dmtsai                  /etc/init.d/vsftpd restart

限制实体用户的总下载流量 (带宽)  vim /etc/vsftpd/vsftpd.conf          # 增加底下这一个参数即可: local_max_rate=1000000 <==记住喔,单位是 bytes/second

/etc/init.d/vsftpd restart,用本机测试最准!你可以用 dd 做出一个 10MB 的档案放在 student 的家目录下,然后用 root 下达 ftp localhost,并输入 student 的帐密,接下来给他 

get 这个新的档案,就能够在最终知道下载的速度啦,如果你有限制最大使用带宽的话,那么你可能还需要限制最大在线人数才行。例如:你希望最多只有 10 个人同时使用你

的 FTP 的话,并且每个 IP 来源最多只能建立一条 FTP 的联机时  vim /etc/vsftpd/vsftpd.conf    # 增加底下的这两个参数: max_clients=10 max_per_ip=1 /etc/init.d/vsftpd restart

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

在预设的环境当中,我们是将『不许使用 FTP 的账号写入 /etc/vsftpd/user_list 档案』,所以没有写入 /etc/vsftpd/user_list 当中的使用者就能够使用 FTP,那么未来新增的使用

者预设都能够使用FTP的服务,若我想要让某些人可以使用FTP而已,亦即新增的使用者预设不可使用FTP这个服务的话那么该如何做?需要修改配置文件成这样:

vim /etc/vsftpd/vsftpd.conf        # 这几个参数必须要修改成这样: userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_list       /etc/init.d/vsftpd restart

则此时『写入 /etc/vsftpd/user_list 变成可以使用 FTP 的账号』了,所以未来新增的使用者如果要能够使用 FTP 的话,就必须要写入 /etc/vsftpd/user_list 才行

例题:假设你因为某些特殊需求,所以必须要开放 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 的相关软件到该目录中了,

那我们可以这样做个假设:mkdir /var/ftp/linux          mkdir /var/ftp/gnu

然后将 vsftpd.conf 的数据清空,重新这样处理他吧:建立 vsftpd.conf 的设定数据   vim /etc/vsftpd/vsftpd.conf  # 将这个档案的全部内容改成这样

# 1. 与匿名者相关的信息: anonymous_enable=YES no_anon_password=YES <==匿名登录时,系统不会检验密码 (通常是email)

anon_max_rate=1000000 <==最大带宽使用为 1MB/s 左右 data_connection_timeout=60 <==数据流联机的 timeout 为 60 秒 idle_session_timeout=600 <==若匿名者发呆超过 10 

分钟就断线 max_clients=50 <==最大联机与每个 IP 的可用联机 max_per_ip=5

# 2. 与实体用户相关的信息,本案例中为关闭他的情况! local_enable=NO

# 3. 与服务器环境有关的设定 use_localtime=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES 

pam_service_name=vsftpd tcp_wrappers=YES banner_file=/etc/vsftpd/anon_welcome.txt <==檔名有改  /etc/init.d/vsftpd restart

2. 建立欢迎画面与下载提示讯息  vim /etc/vsftpd/anon_welcome.txt

3. 客户端的测试:密码与欢迎讯息是重点! ftp localhost, 看到否?这次可就不需要输入任何密码了,因为是匿名登录,而且,如果你以其他的账号来尝试登入时, 那么 vsftpd 

会立刻响应仅开放匿名的讯息,!(530 This FTP server is anonymous only.)

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

实际上匿名用户仅可进行下载的动作而已。如果你还想让匿名者可以上传档案或者是建立目录的话, 那你还需要额外增加一些设定才行:vim /etc/vsftpd/vsftpd.conf

# 新增底下这几行啊! write_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES anon_upload_enable=YES       /etc/init.d/vsftpd restart

设定以上四个参数,不过,实际要生效还需要 Linux 的文件系统权限正确才行,

我们知道匿名者取得的身份是 ftp ,所以如果想让匿名者上传数据到 /var/ftp/uploads/ 中,则需要这样做:mkdir /var/ftp/uploads     chown ftp /var/ftp/uploads

你以匿名者身份登入后,就会发现匿名者的根目录多了一个 /upload 的目录存在了,并且你可以在该目录中上传档案/目录,如此系统的权限打开,请仔细控制好你的上传目录

不过,在实际测试当中,却发现还是没办法上传呢!怎么回事啊?如果你有去看一下 /var/log/messages 的话,那就会发现,又是 SELinux 这家伙

在 /var/log/messages 里面观察到的指令丢进去,setsebool -P allow_ftpd_anon_write=1   setsebool -P allow_ftpd_full_access=1

然后你再测试一下用 anonymous 登入,到 /uploads 去上传个档案吧!就会知道能不能成功哩

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

所以如果你要设定 /var/ftp/uploads/ 内透过匿名者上传的数据中,仅能上传不能被下载时,那么被上传的数据的权限就得要修改一下才行

vim /etc/vsftpd/vsftpd.conf

# 将这几行给他改一改先!记得要拿掉 anon_other_write_enable=YES write_enable=YES anon_mkdir_write_enable=YES anon_upload_enable=YES chown_uploads=YES <==新

增的设定值在此! chown_username=daemon            /etc/init.d/vsftpd restart

当然啦,那个 /var/ftp/uploads/ 还是需要可以被 ftp 这个使用者写入才行!如此一来被上传的档案将会被修改档案拥有者成为 daemon 这个使用者,而 ftp (匿名者取得的身份) 是

无法读取 daemon 的数据的,所以也就无法被下载

例题:在上述的设定后,我尝试以 anonymous 登入并且上传一个大档案到 /uploads/ 目录下。由于网络的问题,这个档案传到一半就断线。下在我重新上传时,却告知这个档案

无法覆写!该如何是好?

因为这个档案在你脱机后,档案的拥有者就被改为 daemon 了,!因为这个档案不属于 ftp 这个用户了,因此我们无法进行覆写或删除的动作。此时,你只能更改本地端档案的

档名再次的上传,重新从头一直上传.

被动式联机埠口的限制

FTP 的联机分为主动式与被动式,主动式联机比较好处理,因为都是透过服务器的 port 20 对外主动联机, 所以防火墙的处理比较简单。被动式联机就比较麻烦~因为预设 FTP 

服务器会随机取几个没有在使用当中的埠口来建立被动式联机,那防火墙的设定就麻烦

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

埠口为 65400 到 65410 这几个埠口时,可以这样设定:# 增加底下这几行即可啊! pasv_min_port=65400 pasv_max_port=65410   /etc/init.d/vsftpd restart

防火墙设定:加入 iptables 的 ip_nat_ftp, ip_conntrack_ftp 两个模块,开放 port 21 给因特网使用,开放前一小节提到的 port 65400~65410 埠口给 Internet 联机用

要修改的地方不少,那就让我们来一步一脚印

# 1. 加入模块:虽然 iptables.rule 已加入模块,不过系统档案还是修改一下好了:vim /etc/sysconfig/iptables-config

IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"   # 加入模块即可!两个模块中间有空格键隔开!然后重新启动 iptables 服务  /etc/init.d/iptables restart

# 2. 修改 iptables.rule 的脚本如下: vim /usr/local/virus/iptables/iptables.rule           iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT

# 找到上面这一行,并将前面的批注拿掉即可!并且新增底下这一行喔! iptables -A INPUT -p TCP -i $EXTIF --dport 65400:65410 --sport 1024:65534 -j ACCEPT

/usr/local/virus/iptables/iptables.rule,这样就好了!同时兼顾主动式与被动式的联机!并且加入所需要的 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 服务器,却无法使用某个账号登入,请检查:

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

2. 请检查 /etc/vsftpd/ftpusers 以及 /etc/vsftpd/user_list 档案内是否将该账号写入

如果 Client 无法上传档案,该如何是好?

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

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

3. 是否 anonymous 的设定里面忘记加上了底下三个参数:anon_other_write_enable=YES     anon_mkdir_write_enable=YES        anon_upload_enable=YES

4. 是否因为设定了 email 抵挡机制,又将 email address 写入该档案中了!?请检查!

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

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

请你务必分析一下这两个档案:/var/log/vsftpd.log 与 /var/log/messages ,里面有相当多的重要资料,不过 /var/log/vsftpd.log 却预设不会出现! 只有 /var/log/xferlog 而已。如果

你想要加入 /var/log/vsftpd.log 的支持,可以这样做:vim /etc/vsftpd/vsftpd.conf   dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd.log # 加入这两个设定值即可呦!

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

客户端的图形接口 FTP 联机软件

客户端的联机软件主要有文字接口的 ftp 及 lftp 这两支指令。至于 Linux 底下的图形接口软件,可以参考 gftp 这支程序

Filezilla    说明网站:http://filezilla.sourceforge.net/            下载网站:http://sourceforge.net/project/showfiles.php?group_id=21558

透过浏览器取得 FTP 联机:ftp://username@your_ip, 要记得,如果你没有输入那个 username@ 的字样时,系统默认会以匿名登录来处理这次的联机。

因此如果你想要使用实体用户联机时, 就在在 IP 或主机名之前填写你的账号,。举例来说,鸟哥的 FTP 服务器 (192.168.100.254) 若有 dmtsai 这个使用者, 那我启动浏览器

后,可以这样做ftp://dmtsai@192.168.100.254,ftp://dmtsai:yourpassword@192.168.100.254

让 vsftpd 增加 SSL 的加密功能:既然都有 openssl 这个加密函式库,当然能够使用类似的机制来处理 FTP ,但前提之下是你的 vsftpd 有支持 SSL 函式库才行

此外,我们也必须要建立 SSL 的凭证档给 vsftpd 使用,这样才能够进行加密

1. 检查 vsftpd 有无支持 ssl 模块:ldd $(which vsftpd) | grep ssl   如果有出现 libssl.so 的字样,就是有支持

2. 建立专门给 vsftpd 使用的凭证数据:CentOS 给我们一个建立凭证的地方,那就是 /etc/pki/tls/certs/ 这个目录

cd /etc/pki/tls/certs

make vsftpd.pem

cp -a vsftpd.pem /etc/vsftpd/

ll /etc/vsftpd/vsftpd.pem

3. 修改 vsftpd.conf 的配置文件,假定有实体、匿名账号:

提供实体账号登入,实体账号可上传数据,且 umask 为 002, 实体账号默认为 chroot 的情况,且全部实体账号可用带宽为 1Mbytes/second

实体账号的登入与数据传输均需透过 SSL 加密功能传送;提供匿名登录,匿名者仅能下载,不能上传,且使用明码传输 (不透过 SSL)

整体的设定vim /etc/vsftpd/vsftpd.conf

# 实体账号的一般设定项目: local_enable=YES write_enable=YES local_umask=002 chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list 

local_max_rate=10000000

# 匿名者的一般设定: anonymous_enable=YES no_anon_password=YES anon_max_rate=1000000 data_connection_timeout=60 idle_session_timeout=600

# 针对 SSL 所加入的特别参数!每个项目都很重要,ssl_enable=YES <==启动 SSL 的支持 allow_anon_ssl=NO <==但是不允许匿名者使用 SSL

force_local_data_ssl=YES <==强制实体用户数据传输加密 force_local_logins_ssl=YES <==同上,但连登入时的帐密也加密 ssl_tlsv1=YES <==支持 TLS 方式即可,底下不用启

动 ssl_sslv2=NO ssl_sslv3=NO rsa_cert_file=/etc/vsftpd/vsftpd.pem <==预设 RSA 加密的凭证档案所在

# 一般服务器系统设定的项目: max_clients=50 max_per_ip=5 use_localtime=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES 

xferlog_std_format=YES listen=YES pam_service_name=vsftpd  tcp_wrappers=YES banner_file=/etc/vsftpd/welcome.txt dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd.log 

pasv_min_port=65400 pasv_max_port=65410   /etc/init.d/vsftpd restart

4. 联机测试看看!使用 Filezilla 联机测试:需要透过 TLS 的加密方式才行

例题:既然有了 SFTP 可以进行加密的 FTP 传输,那为何需要 ftps








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值