防火墙

我们已经知道如果保护自己的密码﹐还有如何使用资料加密的手段来保护资料。但是如果您的电脑遭到入侵﹐密码档案和私有键值都被盗窃了﹐我们所作的努力不就白费了吗﹖系统遭到入侵,在今天的网路环境来说已是施空见惯的了… ^_^ 只要您的机器有连上网路,那就有被入侵的可能。因此,所有的网路安全专家所给的意见都是一样的:最安全的设定就是拔掉网路线

那么,我们如何做到安全的网路连线呢?除了小心还是小心!不过,我们还可以用技术手段来对网路线线加以控制,以便将一些不”必要的”连线排除在外。这样的技术设备,就是所谓的“防火牆(Fire Wall)”了。

何谓防火墙﹖

Firewall 一词,原本是建筑物上用来阻隔火灾的结构,也有说是位于引擎室与驾驶舱之间的汽车部件。网路的火墙就是这麽用途的啦﹕将危险的、不安全的连线阻隔在您的网路之外。而我们通常说的火墙有两种﹕过滤性火墙(filter) 和 代理性火墙(proxy)。若没特别说明,我们一般所说的火墙是指过滤性火墙

然而﹐从安全觉度来看,proxy 比起 filter 来说,将更加可靠因为它将内部与外部网路完全区隔开来了,除非它帮您做连线代理,否则别想建立连线。而且,内部网路对外部网路而言,是完全”隐形”的!除此之外,proxy 也有其非常好用的地方﹐比方说我们可以利用单一的连线﹐如使用 modem/adsl﹐然后让整个内部网路连接外部资源﹐不仅节省硬体成本﹐而也无需支付多个 ISP 帐号与电话线路。Proxy 的功能就是“代理”﹐可以分为“程序代理”和“socks 代理”,如无特指,一般是指程序代理

前者可以说是为你代理所有应用软件的连线工作﹕当您需要连接外部资源的时候﹐您的请求是直接送给 proxy ﹐然后﹐proxy 会帮您到真正的目的地去获取﹐然后再转送给您。而每一次的代理动作﹐它都会将资料保留一个备份﹐存在它的快取区去﹐如果再接获相同的请求(不管是原来的机器﹐还是另外别的机器发出的)﹐它就将存于快取裡面的资料做为回覆。有些聪明的 proxy 还能知道快取区里面的资料是否和实际目的地的资料同步呢﹐如果发现实际目的地的资料经过更新﹐它就会再次将更新过的资料复制进自己的快取区。


Proxy 之工作原理
        从上面的这个过程﹐我们可以看得出﹐proxy 还可以提高网路的存取速度哦﹐因为如果资料已经在快取(缓存)里面了﹐其传送都在 LAN 里面进行﹐而无需经过复杂的路由程序。同时﹐因为资料无需从外面重复传递﹐实际上﹐也令到网路的流量减少许多。而且﹐通过 proxy ﹐我们也可以省下许多 IP 位址﹐因为其他机器尽可以使用私有 IP 就行了。目前正时兴的网咖(Internet Cafe)﹐许多就是利用 proxy 来降低成本和提高 www 的浏览速度。另外﹐proxy 还可以再经由上游 proxy(或proxy阵列) 连接 internet ﹐从而再可以提高效率和安全性。

而 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)﹑等。在此基础上﹐然后再配合实际情形设定更多规则加以限制

        我们设定规则的时候是非常多样性的﹐也可以由一个 chain 导向另一个 chian ﹐直到符合我们的要求为止。下面让我们看一看一个非常阳春的规则设定例子﹕

        当我们从一个 chain 跳到另一个自定义的 chain 的时候﹐如果自定义的 chain 没有将封包剔除的话﹐就会回到刚才的 chain 的下一个规则去﹐继续其后的规则检查。从上例中我们可以看到﹕只有从 192.168.1.1 传给 192.168.1.2 的 TCP 封包才能过关﹐其它诸如 ICMP 和 UDP 封包﹐及其他位址的封包一律会被挡掉。只要我们精心设计﹐不难设定出一个适合自己情形的不太松也不太紧的火墙的。

防火墙的设定技巧

从上面的防火墙运作来看﹐我们可以运用设定规则﹐将一些重要的主机保护起来﹐让其只允许特定的网路存取﹐也就可以将大部份的网路入侵者摈于门外。不过﹐对于那些绝顶骇客高手而言﹐还是会从您的设定漏洞攻破您的把守的﹐例如﹕他们通常会使用“取道”的方法﹐绕过那些被禁止的位址﹐以及通过不断改变位址来逃避追踪。有些较优秀的火墙程式﹐可以自动检测一些骇客常用的攻击方法﹐除了会对网路管理员发出预警之外﹐还可以即时切断该连线﹐和追查路径等动作。

同时﹐利用不同系统来设定多个火墙﹐也能提高防御能力﹕除非骇客对所有系统都熟悉﹐否则﹐过了一道火墙﹐还是过不了第二道火墙﹔而且由于第一道火墙的屏隔﹐要探测第二道火墙的难度也高许多。当然﹐要设定的规则就更为複复杂了﹐通常都会造成过于严厉而令到一些网路资源无法使用﹐或降低了网路的效能。

所以﹐设计一套完善的规则﹐其实是件极具挑战性的事情﹐其后也需要不断的测试以修补漏洞﹐这也是非常耗时的工作。如果对一个繁忙的网路来说﹐事先的测试工作就显得非常重要了﹕您总不能在收到一大堆不能连线的投诉之后而关闭火墙作调试吧﹖

通常我们在设定火墙的时候﹐划分一个“非军事区(DMZ – Demilitarized Zone)”是非常好用的﹕

        我们可以设定火墙﹐允许外部直接传入到 DMZ 上面的伺服器﹐但仅限制于某些特定的协议﹐如 DNS﹑WWW﹑FTP﹑MAIL 等﹐同时也允许内部网路使用这些服务。但外部网路是完全禁止进入内部网路的﹐而内部网路则可以通过 Proxy 存取外部资源﹔我们也允许内部伺服器使用 rsync 协定来和 DMZ 上面的机器进行资料同步。一般我们不会将重要的资料存放在 DMZ 上面的机器﹐而且邮件也会在 DMZ 接收后由内部伺服器提取进来。这样﹐就算那里的机器被攻破了﹐也不至于损失太多。

至于如何一一设定﹐恐怕不是这裡能够详细论述的了。

发表评论