我们已经知道如果保护自己的密码﹐还有如何使用资料加密的手段来保护资料。但是如果您的电脑遭到入侵﹐密码档案和私有键值都被盗窃了﹐我们所作的努力不就白费了吗﹖系统遭到入侵,在今天的网路环境来说已是施空见惯的了… ^_^ 只要您的机器有连上网路,那就有被入侵的可能。因此,所有的网路安全专家所给的意见都是一样的:最安全的设定就是拔掉网路线!
那么,我们如何做到安全的网路连线呢?除了小心还是小心!不过,我们还可以用技术手段来对网路线线加以控制,以便将一些不”必要的”连线排除在外。这样的技术设备,就是所谓的“防火牆(Fire Wall)”了。
何谓防火墙﹖
Firewall 一词,原本是建筑物上用来阻隔火灾的结构,也有说是位于引擎室与驾驶舱之间的汽车部件。网路的火墙就是这麽用途的啦﹕将危险的、不安全的连线阻隔在您的网路之外。而我们通常说的火墙有两种﹕过滤性火墙(filter) 和 代理性火墙(proxy)。若没特别说明,我们一般所说的火墙是指过滤性火墙。
然而﹐从安全觉度来看,proxy 比起 filter 来说,将更加可靠:因为它将内部与外部网路完全区隔开来了,除非它帮您做连线代理,否则别想建立连线。而且,内部网路对外部网路而言,是完全”隐形”的!除此之外,proxy 也有其非常好用的地方﹐比方说我们可以利用单一的连线﹐如使用 modem/adsl﹐然后让整个内部网路连接外部资源﹐不仅节省硬体成本﹐而也无需支付多个 ISP 帐号与电话线路。Proxy 的功能就是“代理”﹐可以分为“程序代理”和“socks 代理”,如无特指,一般是指程序代理。
前者可以说是为你代理所有应用软件的连线工作﹕当您需要连接外部资源的时候﹐您的请求是直接送给 proxy ﹐然后﹐proxy 会帮您到真正的目的地去获取﹐然后再转送给您。而每一次的代理动作﹐它都会将资料保留一个备份﹐存在它的快取区去﹐如果再接获相同的请求(不管是原来的机器﹐还是另外别的机器发出的)﹐它就将存于快取裡面的资料做为回覆。有些聪明的 proxy 还能知道快取区里面的资料是否和实际目的地的资料同步呢﹐如果发现实际目的地的资料经过更新﹐它就会再次将更新过的资料复制进自己的快取区。
Proxy 之工作原理
而 socks 代理呢﹖就好像接线生那样﹐仅是将您的 TCP 连接由里面的接口搭至外面的接口而已。还记得在“网路概念”里面提到的 API 吗﹖socks 代理其实就是代理 API 请求而已﹐而真正处理工作的﹐还是发出请求的主机本身。
这里还要一提的是“NAT(Network Address Translation)”﹐它的工作原理也非常近似 socks proxy ﹐不过﹐它是利用转换封包的位址来达到目的。如果本地网路主机要将一个封包送到外面网路﹐当火墙收到这个封包的时候﹐就会启动 IP 伪装功能(maquerading)﹐将来源位址暂时转换成其本身位址﹐然后等到接到回应封包之后﹐再将位址进行还原(demasquerading)。在里面的机器根本就无需知道这个动作﹐一切都由火墙处理好了。这和 Proxy 一样﹐也可以节省大量的 IP 位址﹐而让使用私有 IP 位址的主机也能够存取 internet 了。因此,有人也将 NAT 称为 IP Proxy 。
防火墙的运作原理
如果您对 TCP 与 IP 协定已经相当了解的话﹐尤其是 IP 封包和 TCP 封包格式﹐那么,您将会更容易了解(过滤性)防火墙的运作﹕火墙会对所有经过的封包进行检查﹐按照一系列规则(rule)﹐来决定封包的处理方式。火墙一般都会根据封包的来源和目的位址﹑协定﹑port﹑界面等因素进行判断﹐决定是否让封包通过。提醒一下:firewall 只管放行与否,至于要送到哪里去,则是 routing 所负责的。
以 Linux 2.2.x 核心的 ipchains 为例,我们可以为火墙建立一些基本原则来定义好各种的链(chain)﹕传入(input)﹑传出(output)﹑转递(forward)﹑重导(redirect)﹑等﹐来决定封包的处理动作﹕接受(accept)﹑拒绝(deny)﹑回绝(reject)﹑转递(forward)﹑伪装(masquerade)﹑等。在此基础上﹐然后再配合实际情形设定更多规则加以限制。
防火墙的设定技巧
从上面的防火墙运作来看﹐我们可以运用设定规则﹐将一些重要的主机保护起来﹐让其只允许特定的网路存取﹐也就可以将大部份的网路入侵者摈于门外。不过﹐对于那些绝顶骇客高手而言﹐还是会从您的设定漏洞攻破您的把守的﹐例如﹕他们通常会使用“取道”的方法﹐绕过那些被禁止的位址﹐以及通过不断改变位址来逃避追踪。有些较优秀的火墙程式﹐可以自动检测一些骇客常用的攻击方法﹐除了会对网路管理员发出预警之外﹐还可以即时切断该连线﹐和追查路径等动作。
同时﹐利用不同系统来设定多个火墙﹐也能提高防御能力﹕除非骇客对所有系统都熟悉﹐否则﹐过了一道火墙﹐还是过不了第二道火墙﹔而且由于第一道火墙的屏隔﹐要探测第二道火墙的难度也高许多。当然﹐要设定的规则就更为複复杂了﹐通常都会造成过于严厉而令到一些网路资源无法使用﹐或降低了网路的效能。
所以﹐设计一套完善的规则﹐其实是件极具挑战性的事情﹐其后也需要不断的测试以修补漏洞﹐这也是非常耗时的工作。如果对一个繁忙的网路来说﹐事先的测试工作就显得非常重要了﹕您总不能在收到一大堆不能连线的投诉之后而关闭火墙作调试吧﹖
通常我们在设定火墙的时候﹐划分一个“非军事区(DMZ – Demilitarized Zone)”是非常好用的﹕
至于如何一一设定﹐恐怕不是这裡能够详细论述的了。