在OpenBSD上架设安全的小型网络
像世界上其它的东西一样,良好的安全建设需要一笔不菲的价格。道理其实很简单,因为现在没有那么多的技术高超的安全专家来照顾我们不堪一击的网络。人才短缺所造成的一个不幸的结果就是高的令人难以承受的专家佣金。这个问题将一些小型的网络交给到了一群没有多大经验的网络管理员的手中,这些管理员也许不知道如何去设计、配置和网络中的主机,使这些有缺陷的主机时时受到网络上那些试图寻找内部信息、免费储存空间或者用于DDoS的肉鸡的入侵者的。
幸运的是,网络上不少好心的黑客(褒义)制作出了不少非常出色的安全产品供网管们免费使用。这篇文章就是概述如何使用一个分隔的专用网络/DMZ的设计来设计并运行一个小型网络,这将允许管理员在使其用户享受高水平的同时向外部网络提供一些服务。这个设计的执行和管理都相当的容易,就算初学者都可以很轻松的掌握,而且它还可以作为安全公司给客户的一个基础安全配置。
我们的目标就是达到对外部发起的做到最大的。同时,我们不希望花费很多钱,这样我们所使用的软件就只能限于源代码的软件或者免费软件。这并不像听起来那么坏,因为大部分免费的操作系统几乎都自带有一套能达到一个小型企业标准的网络安全软件。同时,很多免费的安全解决方案都可以在一些商业产品里找到。
为了使事情变的更简单,我们先假设我们将要建造的这个网络只有一个对Internet的连接,并且它只有大概十几个内部用户。当然,你总是可以按你自己的意愿将它的规模变小或变大。这只在于添加更快的硬件,将网络规划成许多更小的网络来消除瓶颈现象,甚至增加更多的对外连接等。
最简单的设计莫过于使用内部专用网络的防火墙来建设并这个网络,这样的话就不会有任何外来的连接,这种网络被称为非军事区(demilitarizedzone,简称DMZ),我们需要将它建设成以有一些对外的服务,同时使用相同的防火墙来进行的分隔网络的形式。这些服务可以是DNS,WWW,mail,FTP,或者news,不过你完全有去或增加任何其它服务。DMZ可以包含一台主机或者很多主机,这都在于你想要这个网络的复杂性而定的。
3.所有从Internet发送到DMZ的数据包都应该被过滤,只给有那些发送到我们对Internet所的服务的数据包才能通过防火墙。此外,最初从DMZ发送的请求包的有效的回应包也容许进入DMZ。(如有必要,这个规则可以做更大的)
上不了192.168.1.1除了我们说的这些数据包过滤规则以外,我们同时需要一个方法来让我们所提供给外部网络的服务在DMZ中的主机上运行。我们完全可以在装载防火墙的主机上运行这些服务,但是那么做的话就会出现很多麻烦,因为我们在防火墙上装载的服务越多,这个防火墙就会变的更弱。我们会通过重定位数据流到DMZ上,这样我们其实就把潜在的目标从防火墙移到了DMZ上。这样的话,如果者对我们的网络进行,他们就是在DMZ里的主机,而他们想整个内部网络,则还要入侵防火墙和剩下的网络,这样会缓慢入侵者速度,从而让整个网络更安全了一些。(负责重定向数据包的主机有时被称为端口转发(portforwarding))。
因为一般的小型网络通常只有它们ISP所分配的一个单独的IP地址,所以防火墙同时需要运行一些“伪装”软件,这些软件使所有从内部网和DMZ那里发出的数据流好像是从一台主机上发出的一样。这是使我们的网络更难被攻破的另一个安全手段,因为在防火墙后面的机器的IP地址永远不会被显示给外面的网络。
可以过滤数据包,重定向数据流到其它的地址和实现IP地址伪装的免费的防火墙产品有ipfilter,ipfw,ipchains,和iptables。前面的两个软件包是使用于BSD家庭的,后两个则广泛用于Linux操作系统中。
我在本文中选择使用的防火墙软件是在OpenBSD2.8上运行的DarenReed的ipfilter,ipfilter同时有NetBSD,Solaris,SunOS,BSD/OS,IRIX,HP-UX,和QNX版本。如果你是使用其它的防火墙软件,你要记得把我们后面要讲到的防火墙规则翻译成你所使用的防火墙的规则语言。(通用的设计原理在任何案例里都将是相同的。)我选择ipfilter主要有四个原因。第一,我对它非常了解。第二,它是被千万程序员反复测试过的。第三,它是OpenBSD的默认防火墙。第四,我喜欢它简单的语法。Ipfilter相当的容易操作,它可以整理内部用户所发送的请求包及它们的回复包,并且让它们通过防火墙,而不需要我们写一些复杂的防火墙规则。它并且带有简单的数据包重定向和地址伪装模块,ipnat。
硬件,运行ipfilter防火墙软件的机器可以是任何支持OpenBSD或其它有ipfilter支持版本的操作系统,例如NetBSD,只要它能提供至少三个网络接口(一个连接Internet,一个连接内部专用网络和另外一个连接DMZ)。我的选择是一台普通的低档奔腾处理器电脑,装备有串行端口和三个主板上空闲的扩充插槽。不过它可以只是一台Alpha,Sun,VAX或者任何一台满足我们所说的需求的主机。不过,防火墙所在的那台主机的硬盘至少要有540MB。你可以使用IDE而不是SCSI,只要磁盘系统不装太多东西,只要主机有起码24MB的内存。
另外一个重要的组成部分是网络接口卡。连接内部网络和DMZ到防火墙上用的接口卡,我推荐带有用于双绞线的10BASE-T插槽的10/100Mb/一秒的网卡和RJ-45插槽,这些东西不管是全新的还是二手货都很便宜。其它一些必要的连接设备包括双绞线和带有10BASE-T插槽的10/100Mb/一秒的hub。(如果整个DMZ都是在一个机器上的话,可以购买两个hub,一个用于内部专用网络,另一个用于交叉双绞线。)
我之所以你不要使用共轴的10BASE2电缆,而使用双绞线(还有带RJ-45插槽的网卡及hub),是因为双绞线装置更可靠一些,尽管它们需要一个hub才能工作。(在共轴线上,一个错误就会导致所有的电脑都连接到一个无法访问网络的电缆上,而如果一个错误发生在双绞线上,只有一台机器会被断开连接,其它的机器还都可以正常的访问网络)。
还有要注意的是,在你去eBay或者本地的旧电脑销售店里采购二手硬件之前,我你最好先去OpenBSD的网站及软件所副的安装说明书上查找自己要买的硬件的品牌是否在OpenBSD的支持硬件。这个步骤会为你省去很多的麻烦。
最后一个重要的东西就是DOS盘或者Windows95/98的救援盘。因为我不是太清楚微软对使用DOS或者Windows启动盘来装另外一个操作系统是怎么想的,所以我你最好是找一个的DOS或者MSWindows光盘来最备用,或者直接去买一个IBM的DOS,最好是去下载FreeDOS,一个免费的DOS克隆版本。一但你有了一个DOS盘,创建一个启动盘,把里面不需要的程序删除掉,然后把需要的驱动程序装进去。
OpenBSD的安装过程相当简单,你可以在OpenBSDFAQ的第4部分中找到详细的安装说明。这样以来,我不会对设置进行详细的,不过我会主要说明一些会让第一次使用OpenBSD的用户感到困惑的问题:
对大硬盘的支持(Largedisksupport):当硬盘无法启动的时候,就算系统安装完全顺利,你也需要用硬盘或者电脑厂商的程序来让硬盘变的可启动。有些时候,特别是当电脑有一个很老的BIOS时,你的系统可能无法识别硬盘的大小。这种问题应该不会影响到OpenBSD的安装,但当安装结束以后,你必须去你电脑或者硬盘的厂商的网站上去下载驱动或者配置程序来让系统工作。如果你还有问题,阅读安装文档,那里非常详细的斤记录了一些不同的方法来解决大硬盘的问题。
网络接口地址(Networkinteceaddress):当OpenBSD的安装程序询问你关于网络接口地址的时候,它是问你想要配置哪个接口。因为我们可以以后再对它进行配置,所以选择哪个并不是很重要。唯一一个要主要的地方就是,如果你是要配置连接到Internet上的接口的话,你必须要使用你的ISP分配给你的IP地址,同时你应该对在防火墙后的网络使用一个地址,对不连接到Internet的主机使用一个保留的地址。例如如果我们使用192.168.1.x,那么就应该把连接防火墙到其余的网络的那个接口设置为192.168.1.1,并要把连接防火墙到DMZ的接口设置为192.168.2.1(192.168.2.x是其它的网络)。你现在无法配置连接到串行端口的接口,因为它需要另外一个软件(pppd)。不过我们可以呆会儿再完成这个步骤。
IRQ冲突(IRQconflicts.):为了避免IRQ冲突,我们需要拆掉所有不需要的硬件。第一个被拆掉的应该是声卡,因为在用于作为防火墙的电脑上不需要这样的东西。电视/,扫描器控制器,和其它一些类似的多余的卡也该被拆掉。如果你的电脑已经预装了SCSI盘的话,你只需要一个网卡和SCSI控制卡。当然,你需要留下图形卡,因为我们在安装过程中还是要看显示器的。
当你遇到了与IRQ相关的网卡问题时,一般是由两中原因引起的。一种是因为网卡与其它设备使用的是同一个IRQ端口,因为冲突造成系统无法检测到设备。或者就是网卡不能在安装期间进行自行配置。如果你存在这些问题的话,经常会出现缺少对其它电脑的连接(使用ping命令测试专用网络或DMZ时,会报告数据包100%遗失),"devicetimeout"信息,或者系统会在启动期间崩溃等现象。这些问题可以简单的用适当的网卡配制程序和用户内核配置程序来解决。
当这种错误发生时,从DOS或者Windows启动盘启动,运行网卡配置程序,关闭自动配置功能,把网络类型设置为10BASE-T,并从可用中断列表中选择IRQ。对你系统中的每一个卡重复这个过程,退出配置程序,重新启动到OpenBSD中。
如果经过的配置后你的电脑还存在着同样的问题,你将需要通过UKC来配置你的内核。你可以由两个方法来进入UKC控制台:在启动的时候,当你看见boot>提示符时输入boot–c,或者以root身份输入config-e/bsd。当你看见UKC>提示符后,你可以搜索设备,添加新设备,禁用或启动一个设备,和查找这些设备之间的IRQ冲突。如果你找到你为网卡所选的IRQ已经被另外一个设备所占用,你可能需要禁用那个设备,这是在如果它不是系统必须的设备的前提下。例如,我总是在防火墙机器上禁用鼠标,因为我不会在那台机器上使用XWindows,所以鼠标是完全不必要的。同样的,所有的音响设备也应该被禁用,因为它们在防火墙上没有任何作用。当你找到了一个可用的配置,把它写下来并用config-e/bsd(使用root身份)来建立和保存一个新的内核来代替默认的内核(这时保存一个默认内核的备份是个好主意)。你可以在config的手册中找一些额外的信息(manconfig会成为你的好伙伴)。SCSI控制器上的IRQ相关问题也可以用类似的方决。想了解更多关于UKC的知识,请阅读OpenBSDF.A.Q的第四节。OpenBSD所支持的设备列表可以在http://www.openbsd.org/i386.html找到。
网络选择问题:这些问题一般可以用两种方决:以适当的配制程序对卡进行配置,或者在”主机名.”文件(这些文件一般在/etc目录里)中设置选择选项来解决。你可以利用ifconfig–a来检查你的系统中有哪些接口,这个命令会显示接口设备的列表。之后你可以阅读一些适当的手册页(例如:对于ne卡,阅读manne)并找出哪些选项是负责选择的。如果你无法从名称上识别网络设备的话,请去阅读OpenBSD网站上的EthernetAdapterssection。当你找到需要配置的接口后,去寻找”/etc/主机名.设备名”文件(例如:设备ne1的/etc/hostname.ne1),如果必要的话,你可以编辑它。你可能需要创建这个文件,不过每一个以太网接口都应该有一个这种文件。(更多的信息,你可以去阅读hostname.if的手册)。
·/etc/主机名.设备名–这些文件储存了一些系统需要用来配置网卡的基本信息。每一个网卡都应该有一个这样的文件。你可以在OpenBSDF.A.Q的第5节和manhostname.if中了解更多的信息。举个例子,一个连接防火墙到内部专用网络上的ne1(NE1000/NE2000兼容)设备应该是这个样子:
·/etc/hosts–这个文件是为防火墙准备的主机名数据库,它包含了所有防火墙“认识”的IP地址或主机名列表,它应该包含在内部专用网上和在DMZ上所知的主机名称及地址的名单(一个主机完全可能同时在很多网络内,并拥有不同的主机名和地址),在我们的这个例子中,这个名单应该包含192.168.1.1(内部专用网络)和192.168.2.1(DMZ):
/etc/hosts中列出的防火墙接口应该和/etc/主机名.设备名中列出的IP地址相同。如果防火墙是通过一个以太网来连接到Internet的话,/etc/hosts中应该有另外一行注明ISP所分配的主机名及IP地址。记得把这些网络中的foo.com和bar.com改变成实际的域名。这些并不一定必须是登记过的域名。我为内部专用网和DMZ使用两个不同的域名,因为它帮助我区分两个不同网络,但是你当然可以只使用一个域名(或者你可以使用超过两个域名,完全由你决定)。
在你做完所有这些修改之后,用sync重启系统;重启并且检查那些网络接口是否在正确的运行(使用ping对内部专用网或DMZ发送请求,如果报告没有任何数据包遗失就表示工作正常)。记住如果把防火墙连接到内部网络的网络接口是插在串行接口的话,你则需要配置pppd守护进程(阅读manppp)。这样的接口使用的设备名是tun0。(你不需要为它创建一个/etc/hostname.tun0文件)。
记住你必须以一种允许防火墙和其它在内部专用网络、DMZ和Internet之间进行流畅通讯的方法来配置其它在专用内部网络和DMZ上的主机。为此,你应该配置内部专用网络上的每一台主机上的TCP/IP协议,使它们都用192.168.1.1来做它们的网关,并且在相同的地址空间里给每台机器一个IP地址(192.168.1.2,192.168.1.3,192.168.1.4,等等)。同样的,DMZ中的机器应该被配置为使用192.168.2.1作为它们的网关,并给每机器一个从192.168.2.2-192.168.2.254范围中的IP地址。此外,每台机器应该被命名一个独特的主机名。
一旦完成了这些工作,你应该在专用网络内运行一个内部的DNS服务器,这样可以让内部通讯变的更容易一些。DNS配置文件的条目中应该列出全部在专用网络上和在DMZ里主机。因为安全原因,DMZ中的机器将无法访问那些在专用网络中的数据(他们完全寄任何数据包给专用网络),但专用网络需要访问DMZ的,因为用户需要简单的升级在WWW服务器上的文档,阅读和发送邮件到Internet上的其它主机和使用其它在DMZ上的服务。
Ipfilter可以分为两个模块:网络地址转换(networkaddresstranslator)简称NAT,和数据包过滤器(packetfilter)。第一个是用于伪装(隐藏单个外部IP地址后面的内部IP地址)和重定向主机和端口之间的数据包。包过滤器会检查被NAT修改过的数据包是否可以允许通过防火墙后的网络。你可以在DarenReed的ipfilter网站上找到关于ipfilter设计和语法规则的详细解释。manipf和manipnat可以提供更多的额外信息。
这些规则告诉NAT引擎去映射所有在端口10000-20000上,从内部专用网络到地址"x.x.x.x"上的连接。并映射所有在端口20001-30000上,从DMZ到地址"x.x.x.x"上的连接。"x.x.x.x"应该被替换为你的ISP分配给你的实际IP地址。tun0是Internet接口设备的名字,如果外部接口没有使用串行端口的话,把tun0替换为你所使用的网络设备名。
同样,"x.x.x.x"是连接防火墙到Internet的外部接口的IP地址。192.168.2.254是DMZ中的HTTP服务器的IP地址。因为安全原因,服务器在一个无的端口8080上请求。注意这里必须要一个规则把每个接口上的数据包重定向到"x.x.x.x"的80号端口上,要不然有些数据包将无法到达正确的目的地。
lo0是一个回环接口,我们不需要去动它,因为在这里数据包会浪费大量的处理器周期。关键字quick防火墙在数据包匹配这个规则后立刻停止处理其它规则。这样可以减少大量的处理器周期,并且简化了规则的书写。这里没什么可加的了,所以我们继续进行到tun0接口规则,我们在这里需要阻拦所有到不地址的输出数据(一些入侵者喜欢使用这类反弹控制的方法,我们当然不想帮他们):
我们同样希望所有从DMZ地址上发送的数据能顺利发送到Internet上去。所有我们需要做的只是复制内部专用网络的规则,并更换网络地址而已。(用192.168.2.0/24代替192.168.1.0/24--/24是netmask):
或者更好的,使用外部名字服务器来代替内部名字服务器。这样的话,/etc/resolv.conf将会像这样(“y.y.y.y”和“z.z.z.z”是外部名字服务器的地址,它应该是你的ISP分配给你的):
·从外部到我们网络的pings和连接尝试将报告100%数据包遗失—这将是个问题当你想通过从外部发送pings来防火墙,来看机器是否在运行。你可以用到公开端口的连接来代替。
在市场上有很多可用的方案,但我你使用你最了解的,或者,如果你不知道如何管理软件的一个特殊部分,我的是从简单的东西开始。例如,如果你不知道如何配置和管理DNS,你可以使用/etc/hosts文件直到你了解了更多关于DNS的知识。如果你需要用DNS来实现虚拟域名服务,使用外部DNS服务器。你可以以每月5美圆的低价来租用一个DNS服务器,或者你可以问你的ISP是否可以在他们的名字服务器上架设你的这些域名。
至于HTTP服务器软件,如果你从来没有用过Web服务器的话,考虑一下用thttpd来代替Apach。.thttpd比较小,而且更容易来配置和管理,并且还可以教你一些好的管理习惯。如果你非常想运行公共名字服务器的话,试试djbdns。学习你想要用于访问的软件中的不同的配置功能,并学会如何用chroot来运行它们,这样可以大大的增加系统的安全性。
最后,尽可能的学习关于网络安全,防火墙,TCP/IP管理。我在文章中提到的设计在尽可能的情况下让安全和不方便之处平衡,但你不可能在没有任何麻烦的情况下使用它,而且它并不是最安全的设计。这只似乎个开始:你应该改进它来适应你自己的要求。阅读所有可用的HOW-Tos和指南。当出现疑问的时候,问一些老的和有更多经验的管理员们,并向他们学习。