近来在各项Internet的应用已迅速席卷全球之时,「网路安全」的问题也开始引起了大多数人的关切,而基於这个问题而发展出"Firewall"(防火墙)如此的产物,利用它来防止外部网路不速之客的入侵。此文要将"Firewall"和"Linux"做一个结合,介绍各位来架设Linux的防火墙。
各位Linux的老朋友新朋友好久没有在纸上相见,希望能藉这个难得的机会用短短的文章和大家多多分享这敝人的小小心得。
自从国家资讯高速公路(NII)的推动以来,相继的TANET、SeedNet、HiNet的苦心经营,Internet几乎已经成为各家杂志的热烈话题,而「加入Internet、利用Internet」也成为建立企业形象的一种方式。在一阵Internet风潮骚动之下,有人就开始担心所谓的「网路安全」问题。因为Internet的开放,而使得所有成员的受惠,但也因为他的开放,所以更要考虑这个「网路安全」的问题。这一次咱们要谈谈的话题就是因为这个原因而开始的—"Firewall"(防火墙)就是基於这个「网路安全」考量之下的一个产物。
我们可以在内部网路与外面网路连接之间,设置一个具有Firewall功能的机器,利用它来过滤这两个网路之间相互传输的资料,然後透过相关软体的设定来限制不同使用者所可以使用的网路功能。由外部网路要传送至内部网路的资料一定要透过设置了Firewall这个机器来转送,内部网路的资料也透过这个Firewall将资料正确的传送位於外部网路上的目的地。身为Firewall的机器就成了网路间的转运站。因此当「外星访客」莅临时,由於他的脚步仅到达Firewall,所以在最差的情形是这个「Firewall机器被摧毁了!!」,但是内部网路却可以逃过一劫而「苟活」下来,基於牺牲小我完成大我的原则下,这样的代价似乎是值得的。
虽然这样的手续似乎相当繁琐,但是也因为如此,多多少少可以防止一些外部网路不速之客的入侵,以确保内部网路的安全。另一方面也可以限制内部网路对外部网路的通讯,做另一层网路资料流控管。当然,为了这个安全问题,我们得牺牲不少「便利」、「速度」上的享受,但是事情总是会有个弥补的方式的,这些都将会是我们所涉及的内容。
Firewall的架设型态并非唯一的,这完全要看作业系统以及Firewall软体的功能来看。上面的图形就是一个最简单的Firewall架构。在前面讲了一些Firewall的字眼後,得和我们的主角"Linux"做一个结合,开始真正的跳入我们的重点—「如何利用Linux架设一个Firewall」。
将Firewall功能加入Linux核心之中
自从Linux1.2.x之後的Kernel编译设定中,就加入CONFIG_FIREWALL的选项,由於事关几个系统呼叫函式的功能,因此如果要将Linux设定为具有Firewall的机器,那麽就要先确定,所使用的LinuxKernel已经将Firewall功能纳入了!!
当然,最稳当的方式就是重新编译LinuxKernel,并且将CONFIG_IP_FIREWALL设为"Yes"。还有一点需要注意的就是「架设一个最基本的LinuxFirewall时,必须要将该部LinuxMachine的IP_Forwarding功能去除」,我们利用下面的图示来稍作解释。所以在处理Kernel重新编译的工作执行"makeconfig"时,请特别将下列选择项目仔细考虑加入。
1.NetworkSupport(CONFIG_NET)[y]
2.TCP/IPnetworking(CONFIG_INET)[y]
3.IPforwarding/gatewaying(CONFIG_IP_FORWARD)[n]
4.IPfirewalling(CONFIG_IP_FIREWALL)[y]
5.IPaccounting(CONFIG_IP_ACCT)[y]
6.SLIP或PPP驱动程式(如果对外来连接是利用拨接或专线时)
Ex:PPP(Point-to-point)support(CONFIG_PPP)[y]
7.个人网路卡驱动程式(用来连接内部区域网路时)
Ex:NE2000/NE1000support(CONFIG_NE2000)[y]
然後,接着执行「makedep;makeclean;makezImage」等等的编译工作(关於详细的Kernel重新编译请读者自行参考前几期光碟月刊内的详细说明)
(备注:在发展中的Linux1.3.x将加入另一种Firewall的功能,称为ip_masquerade,他是将目前由外部软体来转送资料的方式改为由Kernel内部直接来处理,听起来相当不错的消息,不过都尚在发展测试阶段,敬告诸位,如果要安全一点,先不要使用,带运作稳定後在愉快用之)
产生新的Kernel後,请将产生的zImage或vmlinuz移至根目录(或是其他启动目录),然後如果你使用LILO请务必再执行「LILO」一次,更新启动资料,然後重新启动Linux。
进入新的Linux後,为了确保万一,请观察/proc/net/snmp的内容,执行方式如下:
simon:/proc/net#catsnmp
1.→Ip:ForwardingDefaultTTLInReceivesInHdrErrors....(省略)
2.→Ip:06412000001212000000000
Icmp:InMsgsInErrorsInDestUnreachsInTimeExcds....(省略)
Icmp:00000000000000000000000000
Tcp:RtoAlgorithmRtoMinRtoMaxMaxConnActiveOpens....(省略)
Tcp:000000000000
Udp:InDatagramsNoPortsInErrorsOutDatagrams
Udp:120012
请对照1.2.行的说明与内容值,如果2.的第一个值为0,则表示IP_Forwarding的功能并未被包含於Kernel中。所以,请执行此命令来检查是否真的将IPForwarding的功能已经被关掉了!!
设定网路位址
在确定Linux具有Firewall的功能後,接下来要做的就是设定网路的位址,首先先处理对外的部份,既然这台Linux需要对外连线,那麽理所当然就应该会有一个经过授权的命名位址、而且是唯一的。以Internet而言这个网路位址(IPAddress)是世界唯一的,也不可以有第二个,否则会有打架的情形,所以就不需要太伤脑筋了!!不过就因为对外的位址一定要唯一的,所以在设定内部网路的位址(IPAddress)时,就得考虑周延一点,否则如果有内部机器与外部网路位址相同时,Firewall机器将可能不知道如何将资料传至正确位置。
下面是有些特别保留给内部网路使用的IPAddress范围:
10.0.0.0-10.255.255.255
172.16.0.0-172.31.255.255
192.168.0.0-192.168.255.255
如果,有需要不妨将不存在於Internet的内部网路位址设定在这个范围之内,这样才不会影响到FirewallMachine在转运资料时的错误。
测试网路的线路
再来的步骤是测试网路的连线,请注意,因为这时Linux是个FirewallMachine,所以,内部网路上的机器无法直接由本身机器与外面连线,同样的外面网路的机器也无法直接连到内部网路的机器,但是,他们都应该可以连到这台Firewall上来。
因此,接下来我们得分别测试由这台LinuxFirewallMachine与外面网路的连线是否正常,然後在测试由内部网路上的机器与这台Linux是否可以维持正常的连线情形。
千万不要硬是要试着由内部网路上的机器直接去与外面的某台机器进行连线,这是理论与实际都不可能的,一来因为有了Firewall,二来内部网路上的任何机器(除了这台Firewall之外)本来就不属於外面网路的一员(也就是没有专属的网路位址IPAddress)。
设定限制网路的功能
架建Firewall的目的是在於安全的考量。虽然有了Firewall的一层阻挡,可以稍作某程度的保护,但是如果在这台Firewall上,开放所有网路的功能,那不就等於一个完全的公开,这样似乎还不太恰当。因此,既然要达到安全控管的目的所以就要对於FirewallMachine上所提供的网路程式稍作限制。
怎麽限制FirewallMachine上所提供的网路功能呢?你只要以root的身分修改"/etc/inet.conf"这个档案。将你不准备直接使用於Firewall上的网路功能加上注解符号。一般来说是保存档案传输、终端模拟的功能,而将与系统资讯相关的程式给关闭(systat、bootp、fingerd....)避免他人使用这些程式获取该机器的现状资讯。
设定ProxyServer
因为以这样架设起来的Firewall环境下,所有与外部网路相关的资料一定得透过这台Firewall(当然也可能不只一台)去连接。这样子,如果要Telnet到外面网路,那就得先Telnet到FirewallMachine,然後在由此Telnet到外面,也就是说「凡事都得假手他人」,那想想,如果内部有人想玩玩WWW那不就无解的嘛?"ProxyServer"就是来协助此种问题的一个答案,下次我们就继续来说明,如何在LinuxFirewallMachine上,建立SOCKS4.2这个ProxyServer。
如何在内部网路的机器执行Linux、Trumpet、Netscape来透过这个架好的LinuxFirewall对外连线!!!。这样子,先撇开安全性不提,我们就可以利用这个方式,让好几台机器,同时使用一个InternetIPAddress,连到国际网路上去玩耍啦!!!