我们已经知道如果保护自己的密码﹐还有如何使用资料加密的手段来保护资料。但是如果您的电脑遭到﹐密码档案和私有键值都被盗窃了﹐我们所作的努力不就白费了吗﹖系统遭到入侵,在今天的网路环境来说已是施空见惯的了... ^_^ 只要您的机器有连上网路,那就有被入侵的可能。因此,所有的网路安全专家所给的意见都是一样的:最安全的设定就是拔掉网路线!
那么,我们如何做到安全的网路连线呢?除了小心还是小心!不过,我们还可以用技术手段来对网路线线加以控制,以便将一些不"必要的"连线排除在外。这样的技术设备,就是所谓的“(Fire Wall)”了。
何谓防火墙﹖
Firewall 一词,原本是建筑物上用来阻隔火灾的结构,也有说是位于引擎室与驾驶舱之间的汽车部件。网路的火墙就是这么用途的啦﹕将危险的、不安全的连线阻隔在您的网路之外。而我们通常说的火墙有两种﹕过滤性火墙(filter) 和 代理性火墙(proxy)。若没特别说明,我们一般所说的火墙是指过滤性火墙。
然而﹐从安全觉度来看,proxy 比起 filter 来说,将更加可靠:因为它将内部与外部网路完全区隔开来了,除非它帮您做连线代理,否则别想建立连线。而且,内部网路对外部网路而言,是完全"隐形"的!除此之外,proxy 也有其非常好用的地方﹐比方说我们可以利用单一的连线﹐如使用 modem/adsl﹐然后让整个内部网路连接外部资源﹐不仅节省硬体成本﹐而也无需支付多个 帐号与电话线路。Proxy 的功能就是“代理”﹐可以分为“程式代理”和“socks 代理”,如无特指,一般是指程式代理。
前者可以说是为你代理所有应用软体的连线工作﹕当您需要连接外部资源的时候﹐您的请求是直接送给 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﹑﹑MAIL 等﹐同时也允许内部网路使用这些服务。但外部网路是完全禁止进入内部网路的﹐而内部网路则可以通过 Proxy 存取外部资源﹔我们也允许内部伺服器使用 rsync 协定来和 DMZ 上面的机器进行资料同步。一般我们不会将重要的资料存放在 DMZ 上面的机器﹐而且邮件也会在 DMZ 接收后由内部伺服器提取进来。这样﹐就算那里的机器被攻破了﹐也不至于损失太多。
至于如何一一设定﹐恐怕不是这里能够详细论述的了。