分享
 
 
 

用SpamAssassin消灭垃圾邮件

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

道高一尺,魔高一丈

Brian Goetz(brian@quiotix.com)

首席顾问,Quiotix Corp

2002 年 9 月

偶尔收到不请自来的电子邮件可能只是有点麻烦,但我们现在所遭受的无处不在的垃圾邮件之灾极大地影响了众多用户对合法邮件的收取,并且许多人已完全愤怒了。我们要查找所有这些邮件是如何发出的 — 而且更重要的是,要对此做些什么。

不请自来的电子邮件以各种形式闯入我们的邮箱 — 商品推销、诈骗、政治或宗教抨击、病毒载体以及无法归类的稀奇古怪的形式。有些人每天都要收到 100 到 200 封不请自来的电子邮件(甚至更多),这并不罕见。

随着使用因特网人数的增加(自因特网建立以来,人数一直在增长),对于商人、小贩、想入非非者以及蓄意破坏者而言,可以无偿地联系到数目巨大的各类人的诱惑力变得难以抵挡。而这种费时且消耗 CPU 的破坏行为也迅速对经济产生了影响。

尽管设置了过滤器、阻挡器(blocker)、黑洞以及黑名单来阻止垃圾邮件的制造者,但出现了应付这些措施的方法,不料竟会遇到怀有恶意的圈内人采用突破能力更强的措施,这类似于编写脚本的小孩与安全性人士之间的游戏。

本文显示了垃圾邮件圈的演变(就如孙子及其后曾经出现的每位军事家所认同的,“知己知彼,百战不殆”)。本文还查看了 SpamAssassin,在与垃圾邮件的对抗中,它是所采用的经久耐用的武器系列中最新式的一种,本文还对它进行了展望。

SpamAssassin

在与垃圾邮件的对抗中,SpamAssassin 相对而言是个新手,Matt Sergeant、Craig Hughes 和 Justin Mason 在 2001 年 4 月前后首次发布了它,目前(到编写本文时为止)它的版本是 2.20。很快它就非常流行 — 目前运行在大约 30,000 台 UNIX 服务器上(根据 SpamAssassin 供应商 Deersoft 的统计 — 请参阅参考资料获取链接),并且 ABC 的 Good Morning America 曾对它作了特别报导 (!)。

在使用了好多年的 JunkFilter,并且认为它曾非常好用之后,SpamAssassin 的高效深深打动了我。我想这主要是因为 SpamAssassin 的开发人员作出了好几个优秀的设计决定。我愿意带您去体验他们遇到过的那些问题 — 以及他们如何解决这些问题 — 作为解决实际问题的示例。最后,我将为您指出 SpamAssassin 的简单配置过程,这就是我们要完成的全部!(希望给我们制造麻烦的垃圾邮件制造者也来参与。)

以前的过滤解决方案的缺点

在为减少垃圾邮件而创建自动工具方面已做过许多尝试,但大多数只在短期内有效。大多数工具很难配置,而且依赖特定的电子邮件平台或工具(Procmail 很受欢迎,因为它有强大的过滤功能,但许多用户不再通过 UNIX 外壳程序帐号来获取他们的邮件 — 这真糟糕!)。而垃圾邮件制造者当然一直在更新他们的技术:过滤器很难跟上这些技术。

在过去的一到两年中,商业性垃圾邮件制造者已经获取了更巧妙的使用诀窍,例如稍微更改一下消息和主题来迷惑严格的模式匹配或校验和方法,将消息文本编码为 base-64 附件(对于符合 MIME 的邮寄程序而言,它是透明的)以及伪造发送方的头来使邮件看来象是本地生成的。尽管理论上在垃圾邮件过滤器中提供这些诀窍是可能的,但前几代基于规则的过滤器(诸如 JunkFilter 或 SpamBouncer)太呆板或太受限,而不能迅速适应这些诀窍。

垃圾邮件的历史

1994 年 4 月 12 日没有记录到 Net.infamy 中,但或许应该这样做,因为我们知道那天首次出现了垃圾邮件。由于本文讨论的是垃圾邮件技艺的演变,所以我们为那些在因特网早期商业化的较早日子(大约是 1993 年到 1994 年)里没有在线的读者准备了详细的历史。

历史初期:垃圾邮件制造者学会编写头

在电子邮件中刚出现垃圾邮件的日子里,批量邮件程序很随便,因而要标识出大量垃圾邮件十分简单,可以达到 100% 的准确度。还有警告性特征符,例如由某些大量邮件程序所生成的特定类型的格式错误的头 [ 或者类似‘Yours truly, signed Canter and Siegel’……的文字表达!— 编者注 ]。这就是 Procmail 规则,很容易编写,可以阻止大多数垃圾邮件,而可以交付大多数合法邮件。短期内,该问题得到了解决。

遗憾的是,垃圾邮件制造者很快就学会了如何创建格式良好的头。在对抗中使用的下一种方法是辨别在垃圾邮件中经常出现的文本中的特定文字,但它们有时也出现在合法邮件中,象“MasterCard or Visa”或“hot sex”。其要点是象“business oppurtunity”和“revolutionary weight-loss method”之类的词组在捕捉某些垃圾邮件时可能很有效 — 但它们很可能还与大量合法消息相匹配。而且编写与这样的关键字相匹配的例程实在很困难,特别是使用 Procmail 时 — 许多(如果不是大多数的话)垃圾邮件过滤器都基于该程序。

随着垃圾邮件制造者获取了更巧妙的技术,呆板的二进制方法进行过滤就需要更复杂的调整,这使那些十分不擅长使用 Procmail 的用户(其中的大部分人)就不那么幸运了。而对于后继的用户,当升级垃圾邮件过滤器时(甚至当升级到相同过滤器的更高发行版时),要迁移规则集会困难重重,或不可能。

简而言之,与垃圾邮件对抗中一般基于规则的方法就是维护太麻烦、太耗时、太呆板和对用户太不友好。这些是 SpamAssassin 开发人员着手要修正的问题。

优秀设计的模型

SpamAssassin 如此成功的原因之一是它的设计人员在设计过程的初期就标识了重要的目标(和非目标)。他们没有关注于捕捉垃圾邮件(这本身就是个棘手的任务),而是将他们所关注的焦点扩展到创建用于捕捉垃圾邮件的平台。这证明是很关键的,因为这迫使将他们的注意力集中到当时(在现在大多数垃圾邮件过滤器中,依然如此的)在捕捉垃圾邮件平台中占主导地位的平台:Procmail。

不使用 Procmail 的选择(几乎每两个垃圾邮件过滤器中就会有一个陷入此陷阱)改变了一切。尽管 Procmail 确实是对邮件消息进行排序和分类的强大工具,但它隐含着某些局限性,这些局限性给构建在其上的任何软件添加了负担。另外,使用和定制很困难,而且某些类型的模式匹配是惊人地困难。最后,Procmail 并不是对每个人都可用,所以使用 Procmail 本质上会限制客户群,而使他们寻求通用的垃圾邮件过滤工具。

当然,几乎不可能使 Procmail 亲自负责这一操作:这个包最早是作为一个智能邮件排序程序发布的,那时事实上拥有电子邮件的每个人都使用 UNIX (1990 年);那时您要从过滤器中最想得到的是把消息从不同列表(或总是使用同一个“发件人:”和“主题:”行的不同朋友和同事)分类到不同的文件夹上。即使那时也可能删除来自某些人(比如,您发现一个特别讨厌的列表成员)的消息,但决不会将它编写成垃圾邮件捕捉器。怎么是这样的呢?它最初发布于 1990 年,即 Canter 和 Siegel 匆忙发出第一批现代垃圾邮件的约三年半之前(请参阅侧栏)。它很快适应了对抗垃圾邮件的任务,而且还在对抗的前沿奋战了近十年,这些都证明了它是一种优秀的系统设计(请参阅参考资料,获取有关 Procmail 及其设计的更多信息)。

擅长模式匹配的语言……唔

摆脱了 Procmail 的负担的 SpamAssassin 开发人员打算寻找一个新的平台,对于开发人员来说这是很轻松的事情。他们选择了 Perl:这是一个明智的决定。Perl 广泛应用在许多操作系统上,它易于扩展,并能从各种环境和工具上调用……而且还被设计成用于模式匹配。而更值得一提的是,SpamAssassin 是 UNIX 传统中具有良好行为的程序,它乐于与 Procmail 共事(请参阅参考资料中的 SpamAssassin 附件)— 它只是没有以 Procmail 为基础。

这样 SpamAssassin 开发人员确实将他们自己从将 Procmail 用作为基础的错误中解救了出来,而此前已经有其他人犯过同样的错误了,但是他们还向其用户提供了(感谢 Perl )完成配置的极其简单的方法。但在开始配置之前,让我们先查看一下 SpamAssassin 在设计上与市场上其它垃圾邮件过滤器不同的其它一些方面。

发放许可证

SpamAssassin 不仅是用 Perl 编写的,它还是在 [Perl] Artistic License 之下发布的,其中有些声明比 GPL“更宽松”,因为它向程序员提供了“更多的权利”,使他们对 Artistic-Licensed 软件进行的更改保留为私有(当然,如果他们愿意,可以选择按照 AL 或 GPL(或其它任何许可证)那样发布他们的更改)。争论的另一方面,当然是另一些人认为 GPL“更随意”,因为它向用户提供了访问公共代码的所有将来改进的“更多权利”。

我不会再在许可证主题上多费口舌(因为那样很愚蠢),只是想说一家名为 Deersoft 的公司(请参阅参考资料获取链接)已经发布了基于 Windows 版本的 SpamAssassin,称为 SpamAssassin Pro。在它们的站点上,许可证信息没有占据显要位置(而且,到截稿时为止,我们还未确定他们使用的是什么许可证),因此可能他们已利用了对 SpamAssassin 的开放许可所提供的机会来封锁其源代码。(至少有一位专职的 SpamAssassin 核心开发人员参与了 Deersoft)。

我们不能和平共处吗?

正如我们已经提到的,SpamAssassin 可以方便地与 Procmail 一起使用来为单一用户过滤垃圾邮件。它还可以与 Sendmail 或其它 MTA 一起使用来为整个站点过滤垃圾邮件。每用户(per-user)版本将用户定制存储到用户主目录的一个文件中;站点范围(site-wide)版本可以将用户定制存储到 MySQL 数据库中,以便 SpamAssassin 可以访问定制,而不必请求对用户文件的特权访问。

只供娱乐

SpamAssassin 不是用于诸如 Sendmail、Procmail 或 qmail 之类的特定邮件系统的插件,而完完全全是平台,但当它被最终用户或系统管理员调用时,它可以方便地与大多数流行的邮件处理系统进行接口互连。

规章制度

尽管 SpamAssassin 确实使用匹配规则来标识可能是垃圾邮件的邮件,但它采用了一种概率统计的、基于分数的方法来对消息分类,而没有采用二进制方法。它没有寻求创建那些将消息标识为“一定是垃圾邮件”或“一定不是垃圾邮件”的规则,而是使用利用概率来推断给定的消息是垃圾邮件的可能性的规则。

SpamAssassin 还使用了称为自动筛选(auto-whitelisting)的统计技术(在后面的垃圾邮件分析中有相关的更多信息),以及头分析、主体分析、公共域和商业 DNS 黑名单、Razor 和 DCC 垃圾邮件校验和数据库,并检查垃圾邮件制造者搞乱消息内容时常用的诀窍(诸如用 base-64 或 Javascript 对消息文本编码)。但我们有些超前了 — 以下是 SpamAssassin 规则集的基础:

每条规则都与一个分数(正或负)相关,对所有规则对应的分数汇总求和后得出消息的总分。对应负分的规则表示合法邮件的属性;对应正分的规则表示不请自来的邮件的属性 — 因此总体等级为负是件好事(在回答“这个邮件是垃圾邮件吗?”这一问题时,是凭直觉来确定各个等级和总分的)。正如开始时所设定的,几乎没有哪个规则具有足够高的分数只凭消息本身就可以将消息标识为垃圾邮件,但这是由设计决定的,因为大多数垃圾邮件将触发多个(或甚至是许多)规则。

SpamAssassin 将处理规则划分成几个主要类别 — 头规则;主体规则(在规范化编码后,它与一个特定短语相匹配),原始主体规则(与诸如编码或 MIME 结构之类的原始消息特征相匹配),以及几个其它规则(包括对照外部数据库,匹配消息签名)。诸如转换编码、分拆消息的 MIME 结构以及将头与主体分离之类的机制都由框架处理,所以规则的编写者可以较少涉及分拆消息的机制,而更多关注标识相关消息的特征。

将 SpamAssassin 设计成有别于类似工具的最后一个要素是对各类人员(用户和系统管理员)的不同需求的理解。与 Procmail 类似,SpamAssassin 允许站点级和非特权用户级配置并存。这两个级别组中的每个都只想平静地用它们自己的方法(而不是相互干涉)过滤它们的邮件,过去不能理解这一点导致许多其它设计得很好的工具落败(而且这可能也是 Procmail 的寿命如此之长的又一个奥秘)。

垃圾邮件分析

标准 SpamAssassin 规则集中有几百条规则,每条规则都设置了权重。因此,即使这些规则不完美,但它们却很有用。例如,一条缺省规则与主题全是大写的消息相匹配。只采用这一条规则,不能体现它所有的能力。当与所有其它规则的结果结合使用时,在垃圾邮件标识过程中,它就起到了很有效的作用。这与大多数以前的垃圾邮件过滤器的要求(其中,每条规则必须保持完全独立)截然相反。

SpamAssassin 还使用了称为自动筛选的统计技术,来了解您收到邮件的特征,并使用它来调整垃圾邮件的分数。其意义,举个例子来说,假定您有一位朋友,经常向您发送(非垃圾邮件)电子邮件,但另一方面,那位朋友向您转发通常会获得很高的垃圾邮件分数的广告。SpamAssassin 将使用那位朋友的历史数据以向下调整消息的垃圾邮件分数。如果您知道来自某一特定的发送者(或站点)的消息是合法的还是垃圾邮件的话,您还可以用显式的白名单和黑名单项补充规则集。

但等一下!还有更多内容!

除了了解诸如自动筛选之类的技术外,SpamAssassin 还可以访问诸如商业黑名单服务和 Razor 及 DCC 垃圾邮件校验和数据库之类的外部数据库。这些外部校验完全被视为类似的任意其它规则,当用户认为合适时,能够对与这些数据库中的一个匹配相关的权重进行调整。

正如用户所报告的,Razor 是已知的垃圾邮件消息校验和的数据库。(SpamAssassin 包含报告垃圾邮件的简单方法,它可以很容易地被集成到诸如 mutt 之类的基于 shell 的邮件代理中。)如果消息的校验和出现在 Razor 中,则触发相应的规则,并将其对应的分数加到消息分数中。Razor 在捕捉许多垃圾邮件时,其有效性令人惊奇,而且因为它的决定是以人类分类为基础的,所以它常常标识其它消息试探法所无法捕捉的消息。同时, SpamAssassin 指派给 Razor 命中的权重本身不足以将消息标记为垃圾邮件,所以对 Razor 的错误或甚至是怀有恶意的提交通常不会对 SpamAssassin 用户造成很大的麻烦。使用 Razor 比使用传统的黑名单更简单得多,黑名单通常错误地将清白的 IP 打上垃圾邮件制造者的烙印(而且要将其从黑名单上删除也很困难,这一点已臭名昭著了)。

因为 SpamAssassin 可以不断地学习和访问动态数据库,甚至无需安装定期规则更新,所以与严格基于规则的系统相比,它更可能长时间地使用。

配置 SpamAssassin

与旨在作为 /bin/mail 的替代的 Procmail 不同,SpamAssassin 没有在实际的邮件交付中胡闹;它集中于将一件事做好,也就是明确充当单一邮件消息的垃圾邮件过滤器。很容易将它与各种邮件处理系统相联系,不管是在用户级别,还是在系统级别。

个人用户可以容易地添加新规则,当他们认为合适时,定制现有规则的权重,设置阈值从而将达到该值的邮件归为垃圾邮件,并影响 SpamAssassin 处理可能的垃圾邮件的方式。用户定制与核心规则集分开存储,从而可以轻松升级到 SpamAssassin 的新版本,而保留用户定制。

为单一用户过滤垃圾邮件

为单一 UNIX 用户配置 SpamAssassin 的最简单方法是通过 — Procmail!

安装并构建了 SpamAssassin 分发版后,您可以通过将这一神奇的语句添加到 .forward 文件来启用 Procmail 过滤:

"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #user"

接着,将下面的语句添加到 .procmailrc 文件:

:0fw | /path/to/spamassassin/spamassassin

就这样!现在,所有消息都将通过 SpamAssassin 过滤。缺省情况下,当 SpamAssassin 将消息标记为垃圾邮件时,它将对主题、主体和 X-Spam-Status 头添加一个记号。现在用户可以使用他或她喜欢的邮件用户代理的过滤功能来将这些带标记的垃圾邮件消息扫除到“垃圾邮件”文件夹或删除它们。

您可以通过创建 .spamassassin/user_prefs 文件轻松地定制 SpamAssassin 如何标记和标识垃圾邮件。您可以定制将消息标识为垃圾邮件必需的“垃圾邮件点”点数、创建新规则以及对现有规则重新设置权重。

以下是 user_prefs 文件样本。它将标识垃圾邮件的阈值从 5 提高到 6,禁止在主题和主体内包含垃圾邮件警告,对已知规则重新设置权重,并添加几个黑名单、白名单和头规则。

清单 1. 典型的 user_prefs 配置文件

#How many hits before a mail is considered spam?

required_hits 6

#Don't mangle the messages so badly

rewrite_subject 0

use_terse_report 1

#whitelist and blacklist

whitelist_from *@spam-site-i-like.com

blacklist_from annoying-person@some-host.com

#reweight an existing rule

score BASE64_ENC_TEXT 3

#add some new rules

header KNOWN_LIST List-Id =~ /a-mailing-list-i-like/

score KNOWN_LIST -3

body EVITE /This invitation was sent to you by .* using Evite/

describe EVITE Looks like an eVite

score EVITE -3

为整个站点过滤垃圾邮件

将 SpamAssassin 用于整个系统有无数方法。包含在 SpamAssassin 中的 spamd 程序实质上是通过套接字通信的 SpamAssassin 命令行程序的守护程序版本。将 SpamAssassin 作为守护程序运行增加了启动开销,这包括装载 Perl 解释器和装载控制多个消息调用的所有 SpamAssassin 规则。就安全性而言,可以以非特权用户运行 spamd。

因为很容易从脚本上调用 SpamAssassin,所以很容易将几乎任何 MTA 配置成使用 SpamAssassin。通过将 SpamAssassin 作为过滤器添加到 /etc/procmailrc,您可以使用站点范围的 Procmail 过滤。使用 Sendmail 的站点可以将 spamassassin-milt“milter”用于 Sendmail,这只需要对 sendmail.mc 添加一行内容。对于诸如 Exim、MailScanner 和 MimeDefang 之类的各种其它邮件处理程序,还需要插件。一旦站点范围安装了,用户就可以如上所示通过 user_prefs(或类似的 MySQL)独立定制规则、规则的权重和其它处理选项。

SpamAssassin 有了用武之地

SpamAssassin 采用与以前垃圾邮件过滤器极其不同的方法,而且该方法证明是更灵活和更适合的。

我喜欢 SpamAssassin 的其中一点是,对大多数用户而言,它能捕捉几乎所有的垃圾邮件,而不需要隔离合法邮件。实际上它还提供了无限的调整和定制选项。我使用 SpamAssassin 已经有一段时间了,所以我很高兴地说,根据我的体验,弄错正、负的几率极其低。在经过一小部分的初始调整(主要是白名单和黑名单项)之后,现在我只需一周花几分钟扫描垃圾邮件文件夹来查找弄错正的情况(而几乎从未找到任何弄错的),而且可能只有 1% 的垃圾邮件成功躲过了过滤器的探测。此外,我没有觉得需要成为调整方面的专家,也不必担心当我升级到下一个版本时,会丢失我的定制。

它确实起作用。

参考资料

* 从 SpamAssassin 站点下载 SpamAssassin,或访问 SourceForge 上的 SpamAssassin 项目页面。

* SpamAssassin 是在 [Perl] Artistic License 下发布的。将它与 GNU GPL 的文本相比照。

* Deersof 发布了 SpamAssassin 的商业性基于 Windows 的版本。

* 包含了 SpamAssassin 的 Brave GNU World(第 #38 期,2002 年 5 月)。

* SpamAssassin Sendmail 的“milter”使配置 Sendmail 以使用 SpamAssassi 变得简单。它在 GNU GPL 之下发布。

* SpamAssassin 可以使用 Razor 已发布的垃圾邮件校验和数据库,以及 DCC 校验和数据库。

* MailScanner 可以使用 SpamAssassin 来处理进入的电子邮件并扫描查找病毒。

* JunkFilter 是一个基于 Procmail 的垃圾邮件过滤器。

* 了解有关最初的功能强大的过滤器软件,Procmail 的更多信息。

* 将传统的 Procmail 垃圾邮件管理安装和配置与用于 SpamAssassin 的同一过程相比较。

* Canter 和 Siegel 以前的 Procmail FAQ 看上去十分类似当今的 Procmail FAQ — 请注意提到了邮件交付和分类 — 而没有提到垃圾邮件。始终如此。(还请注意使 Procmail 尽可能强壮所采用的步骤)。

* 了解有关用比 Procmail 本身更“原始”的工具过滤邮件的信息(O'Reilly and Associates 文档)。

* 在 developerWorks Linux 专区查找更多的 Linux 文章。

关于作者

Brian Goetz 是一位软件顾问,在过去的 15 年中,他一直是一位专业软件开发人员。他在 Quiotix 担任首席顾问,这是一家位于美国加利福尼州洛斯拉图斯的软件开发和咨询公司。请在流行的业界出版物上阅读 Brian 已发表和即将发表的文章。可以通过 brian@quiotix.com 与 Brian 联系。

来自:www-900.ibm.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有