斌、朵♫恋 » 安全文章 » 。◕‿◕。在OpenBSD上架设安全的小型网络。◕‿◕。
This translated document is an isfocus.net production. The copyrights of the original articles belong to Jacek Artymiak.
像世界上其它的东西一样,良好的安全建设需要一笔不菲的价格。道理其实很简单,因为现在没有那么多的技术高超的安全专家来照顾我们不堪一击的网络。人才短缺所造成的一个不幸的结果就是高的令人难以承受的专家佣金。这个问题将一些小型的网络交给到了一群没有多大经验的网络管理员的手中,这些管理员也许不知道如何去设计、配置和监视网络中的主机,使这些有缺陷的主机时时受到网络上那些试图寻找内部信息、免费储存空间或者用于DDoS的肉鸡的入侵者的威胁。
幸运的是,网络上不少好心的黑客(褒义)制作出了不少非常出色的安全产品供网管们免费使用。这篇文章就是概述如何使用一个分隔的专用网络/DMZ的设计来设计并运行一个小型网络,这将允许管理员在使其用户享受高水平保护的同时向外部网络提供一些服务。这个设计的执行和管理都相当的容易,就算初学者都可以很轻松的掌握,而且它还可以作为安全公司给客户的一个基础安全配置。
I. 设计部分
我们的目标就是达到对外部发起的攻击做到最大的保护。同时,我们不希望花费很多钱,这样我们所使用的软件就只能限于开放源代码的软件或者免费软件。这并不像听起来那么坏,因为大部分免费的操作系统几乎都自带有一套能达到一个小型企业标准的网络安全软件。同时,很多免费的安全解决方案都可以在一些商业产品里找到。
为了使事情变的更简单,我们先假设我们将要建造的这个网络只有一个对Internet的连接,并且它只有大概十几个内部用户。当然,你总是可以按你自己的意愿将它的规模变小或变大。这只在于添加更快的硬件,将网络规划成许多更小的网络来消除瓶颈现象,甚至增加更多的对外连接等。
最简单的设计莫过于使用保护内部专用网络的防火墙来建设并维护这个网络,这样的话就不会有任何外来的连接,这种网络被称为非军事区(demilitarized zone,简称DMZ),我们需要将它建设成以有一些对外开放的服务,同时使用相同的防火墙来进行保护的分隔网络的形式。这些服务可以是DNS, WWW, mail, FTP, 或者news,不过你完全有自由去限制或增加任何其它服务。DMZ可以包含一台主机或者很多主机,这都在于你想要这个网络的复杂性而定的。
所有到我们网络中的数据流都会被防火墙检查和过滤,在几个分别的主机上需要运行这三个网络接口:
· 接口A连接防火墙到Internet上。接口的IP地址将由ISP分配 (本文中将会使用x.x.x.x).
· 接口B连接防火墙到内部专用网络上。本文中这个接口的IP地址将会是 192.168.1.1。
· 接口C 连接防火墙到DMZ网络上。本文中这个接口的IP地址将会是 192.168.2.1。
防火墙将使用下面的规则来控制数据流:
1. 所有从内部专用网络发送到所有合法地址上的数据包都可以没有任何限制的通过防火墙。 (如有必要,这个规则可以做更大的限制)
2. 所有从Internet发到专用网络的数据包都应该被过滤,并且只有那些最初从内部专用网发送的请求包的有效回应包才应该被容许进入专用网络。
3. 所有从Internet发送到DMZ的数据包都应该被过滤,只给有那些发送到我们对Internet所开放的服务的数据包才能通过防火墙。 此外,最初从DMZ 发送的请求包的有效的回应包也容许进入DMZ。 (如有必要,这个规则可以做更大的限制 )
4. 最初从内部专用网络 发送到DMZ上的请求包的有效的回应包应容许进入专用网络。
5. 所有从DMZ 发送到Internet上(这不包括发送到DMZ上的)的数据包,应在没有任何限制的情况下通过防火墙。 (如有必要,这个规则可以做更大的限制)
6. 所有其它的数据流应该被丢弃。
除了我们上面说的这些数据包过滤规则以外,我们同时需要一个方法来让我们所提供给外部网络的服务在DMZ中的主机上运行。我们完全可以在装载防火墙的主机上运行这些服务,但是那么做的话就会出现很多麻烦,因为我们在防火墙上装载的服务越多,这个防火墙就会变的更弱。我们会通过重定位数据流到DMZ上,这样我们其实就把潜在的攻击目标从防火墙移到了DMZ上。这样的话,如果攻击者对我们的网络进行攻击,他们就是在攻击DMZ里的主机,而他们想攻击整个内部网络,则还要入侵防火墙和剩下的网络,这样会缓慢入侵者速度,从而让整个网络更安全了一些。(负责重定向数据包的主机有时被称为端口转发(port forwarding))。
因为一般的小型网络通常只有它们ISP所分配的一个单独的IP地址,所以防火墙同时需要运行一些“伪装”软件,这些软件使所有从内部网和DMZ那里发出的数据流好像是从一台主机上发出的一样。这是使我们的网络更难被攻破的另一个安全手段,因为在防火墙后面的机器的IP 地址永远不会被显示给外面的网络。
可以过滤数据包,重定向数据流到其它的地址和实现IP地址伪装的免费的防火墙产品有ipfilter, ipfw, ipchains, 和iptables。前面的两个软件包是使用于BSD家庭的,后两个则广泛用于Linux操作系统中。
II. 选择硬件及软件
我在本文中选择使用的防火墙软件是在OpenBSD 2.8上运行的Daren Reed的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盘或者Windows 95/98的救援盘。因为我不是太清楚微软对使用DOS或者Windows启动盘来装另外一个操作系统是怎么想的,所以我建议你最好是找一个合法的DOS或者MS Windows光盘来最备用,或者直接去买一个IBM的DOS,最好是去下载 FreeDOS,一个免费的DOS克隆版本。一但你有了一个DOS盘,创建一个启动盘,把里面不需要的程序删除掉,然后把需要的驱动程序装进去。
(请注意,你并不需要DOS或者Windows来装OpenBSD,我说的这种情况是当Windows已经是你电脑中的操作系统时的情况。)
III. 安装
OpenBSD的安装过程相当简单,你可以在OpenBSD FAQ 的第4部分中找到详细的安装说明。这样以来,我不会对设置进行详细的讲解,不过我会主要说明一些会让第一次使用OpenBSD的用户感到困惑的问题:
swap的最小空间(Minimum amount of swap space):使用大概你RAM内存的两倍就足够了。如果你不确定的话,可以使用OpenBSD FAQ 第四部分中列出的分割大小列表。
对大硬盘的支持(Large disk support): 当硬盘无法启动的时候,就算系统安装完全顺利,你也需要用硬盘或者电脑厂商的程序来让硬盘变的可启动。有些时候,特别是当电脑有一个很老的BIOS时,你的系统可能无法识别硬盘的大小。这种问题应该不会影响到OpenBSD的安装,但当安装结束以后,你必须去你电脑或者硬盘的厂商的网站上去下载驱动或者配置程序来让系统工作。如果你还有问题,阅读安装文档,那里非常详细的斤记录了一些不同的方法来解决大硬盘的问题。
网络接口地址(Network interface address): 当OpenBSD的安装程序询问你关于网络接口地址的时候,它是问你想要配置哪个接口。因为我们可以以后再对它进行配置,所以选择哪个并不是很重要。唯一一个要主要的地方就是,如果你是要配置连接到Internet上的接口的话,你必须要使用你的ISP分配给你的IP地址,同时你应该对在防火墙后的网络使用一个地址,对不连接到Internet的主机使用一个保留的地址。例如如果我们使用192.168.1.x,那么就应该把连接防火墙到其余的网络的那个接口设置为192.168.1.1,并要把连接防火墙到DMZ的接口设置为192.168.2.1 (192.168.2.x 是其它的网络)。你现在无法配置连接到串行端口的接口,因为它需要另外一个软件(pppd)。 不过我们可以呆会儿再完成这个步骤。
IRQ 冲突 (IRQ conflicts.): 为了避免IRQ冲突,我们需要拆掉所有不需要的硬件。第一个被拆掉的应该是声卡,因为在用于作为防火墙的电脑上不需要这样的东西。 电视/广播,扫描器控制器,和其它一些类似的多余的卡也该被拆掉。如果你的电脑已经预装了SCSI 盘的话,你只需要一个网卡和SCSI 控制卡。当然,你需要留下图形卡,因为我们在安装过程中还是要看显示器的。
当你遇到了与IRQ相关的网卡问题时,一般是由两中原因引起的。一种是因为网卡与其它设备使用的是同一个IRQ端口,因为冲突造成系统无法检测到设备。或者就是网卡不能在安装期间进行自行配置。如果你存在这些问题的话,经常会出现缺少对其它电脑的连接(使用ping命令测试专用网络或DMZ时,会报告数据包100%遗失),"device timeout"信息,或者系统会在启动期间崩溃等现象。这些问题可以简单的用适当的网卡配制程序和用户内核配置程序来解决。
当这种错误发生时,从DOS 或者Windows启动盘启动,运行网卡配置程序,关闭自动配置功能,把网络媒体类型设置为10BASE-T,并从可用中断列表中选择IRQ。对你系统中的每一个卡重复这个过程,退出配置程序,重新启动到OpenBSD中。
如果经过上面的配置后你的电脑还存在着同样的问题,你将需要通过UKC来配置你的内核。你可以由两个方法来进入UKC控制台:在启动的时候,当你看见boot>提示符时输入boot –c,或者以root身份输入config -e /bsd。当你看见UKC> 提示符后,你可以搜索设备,添加新设备,禁用或启动一个设备,和查找这些设备之间的IRQ冲突。如果你找到你为网卡所选的IRQ已经被另外一个设备所占用,你可能需要禁用那个设备,这是在如果它不是系统必须的设备的前提下。例如,我总是在防火墙机器上禁用鼠标,因为我不会在那台机器上使用X Windows,所以鼠标是完全不必要的。同样的,所有的音响设备也应该被禁用,因为它们在防火墙上没有任何作用。当你找到了一个可用的配置,把它写下来并用config -e /bsd(使用root身份)来建立和保存一个新的内核来代替默认的内核(这时保存一个默认内核的备份是个好主意)。你可以在config的手册中找一些额外的信息(man config 会成为你的好伙伴)。SCSI控制器上的IRQ相关问题也可以用类似的方法解决。想了解更多关于UKC的知识,请阅读OpenBSD F.A.Q的第四节。OpenBSD所支持的设备列表可以在http://www.openbsd.org/i386.html 找到。
为了测试网卡是否工作,你可以连接防火墙到专用网络及DMZ,并用ping 命令对这些网络中的任何一个可用IP地址进行测试。如果出现长时间的耽搁或数据包100%遗失的现象的话,说明系统还存在问题。
网络媒体选择问题:这些问题一般可以用两种方法解决:以适当的配制程序对卡进行配置,或者在”主机名.xxx”文件(这些文件一般在/etc目录里)中设置媒体选择选项来解决。你可以利用ifconfig –a来检查你的系统中有哪些接口,这个命令会显示接口设备的列表。之后你可以阅读一些适当的手册页(例如:对于ne 卡,阅读man ne)并找出哪些选项是负责媒体选择的。如果你无法从名称上识别网络设备的话,请去阅读OpenBSD网站上的Ethernet Adapters section。当你找到需要配置的接口后,去寻找”/etc/主机名.设备名” 文件(例如:设备ne1的/etc/hostname.ne1),如果必要的话,你可以编辑它。你可能需要创建这个文件,不过每一个以太网接口都应该有一个这种文件。(更多的信息,你可以去阅读hostname.if的手册)。
当安装结束并正常启动没有出现任何错误的后,适当的识别安装过的网卡,之后你可以开始编辑以下的文件(你必须以root身份登陆才能编辑以下文件):
· /etc/主机名.设备名 – 这些文件储存了一些系统需要用来配置网卡的基本信息。每一个网卡都应该有一个这样的文件。你可以在OpenBSD F.A.Q的第5节和man hostname.if中了解更多的信息。举个例子,一个连接防火墙到内部专用网络上的ne1 (NE1000/NE2000兼容)设备应该是这个样子:
· /etc/hosts – 这个文件是为防火墙准备的主机名数据库,它包含了所有防火墙“认识”的IP地址或主机名列表,它应该包含在内部专用网上和在DMZ 上所知的主机名称及地址的名单(一个主机完全可能同时在很多网络内,并拥有不同的主机名和地址),在我们的这个例子中,这个名单应该包含192.168.1.1 (内部专用网络)和192.168.2.1 (DMZ):
127.0.0.1 localhost
192.168.1.1 fireater.foo.com fireater
192.168.2.1 fireball.bar.com fireball
/etc/hosts中列出的防火墙接口应该和/etc/主机名.设备名中列出的IP地址相同。如果防火墙是通过一个以太网来连接到Internet的话,/etc/hosts中应该有另外一行注明ISP所分配的主机名及IP地址。记得把这些网络中的foo.com和bar.com改变成实际的域名。这些并不一定必须是登记过的域名。 我为内部专用网和DMZ 使用两个不同的域名,因为它帮助我区分两个不同网络, 但是你当然可以只使用一个域名( 或者你可以使用超过两个域名,完全由你决定)。
· /etc/resolv.conf – 这个配置文件应该包括以下几行:
search foo.com
nameserver 192.168.1.2
lookup file bind
search bar.com
nameserver 192.168.2.2
lookup file bind
注意到我假设域名foo.com和bar.com 的nameservers听在监听192.168.1.2 和192.168.2.1, 但是你的构造可能将十分不同,它应该被按照你的要求改变。
· /etc/rc.conf -- 主系统配置文件中应该激活以下的选项:
ipfilter=YES
ipnat=YES
在你做完所有这些修改之后,用sync 重启系统;重启并且检查那些网络接口是否在正确的运行(使用ping 对内部专用网或DMZ发送请求,如果报告没有任何数据包遗失就表示工作正常)。记住如果把防火墙连接到内部网络的网络接口是插在串行接口的话,你则需要配置pppd 守护进程(阅读man ppp)。这样的接口使用的设备名是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上的服务。
IV. 配置防火墙
一旦你设置好了你的OpenBSD系统和网络,你将需要去配置防火墙。我下面展示的这些防火墙规则非常具有限制性,可能很多管理员都不会同意这样设置,但我宁愿从简单开始,加强限制,以后再按要求来放松这些规则。
Ipfilter可以分为两个模块:网络地址转换(network address translator)简称NAT,和数据包过滤器(packet filter)。第一个是用于伪装(隐藏单个外部IP地址后面的内部IP地址)和重定向主机和端口之间的数据包。包过滤器会检查被NAT修改过的数据包是否可以允许通过防火墙后的网络。你可以在Daren Reed的ipfilter 官方网站上找到关于ipfilter 设计和语法规则的详细解释。man ipf 和 man ipnat 可以提供更多的额外信息。
因为NAT第一个接触数据包,所以我们将先配置它。网络地址转换及数据包重定向的规则储存在/etc/ipnet.rules文件里。用文本编辑器打开这个文件并输入以下的规则:
# private internal network NAT rules
map tun0 192.168.1.0/24 -> x.x.x.x/32 portmap tcp/udp 10000:20000
map tun0 192.168.1.0/24 -> x.x.x.x/32
# DMZ NAT rules
map tun0 192.168.2.0/24 -> x.x.x.x/32 portmap tcp/udp 20001:30000
map tun0 192.168.2.0/24 -> x.x.x.x/32
这些规则告诉NAT引擎去映射所有在端口10000-20000上,从内部专用网络到地址"x.x.x.x"上的连接。并映射所有在端口20001-30000上,从DMZ到地址"x.x.x.x"上的连接。"x.x.x.x"应该被替换为你的ISP分配给你的实际IP地址。tun0是Internet接口设备的名字,如果外部接口没有使用串行端口的话,把tun0替换为你所使用的网络设备名。
我们现在可以连接内部专用网和DMZ到Internet上了,不过外部的主机现在仍不能访问DMZ中的服务。我们需要做一个重定向,下面是一个简单的重定向HTTP数据流的规则:
# redirect HTTP requests from foreign hosts
rdr tun0 x.x.x.x/32 port 80 -> 192.168.2.254 port 8080 tcp
rdr tun0 x.x.x.x/32 port 80 -> 192.168.2.254 port 8080 udp
# redirect HTTP requests from the private internal net
rdr ne1 x.x.x.x/32 port 80 -> 192.168.2.254 port 8080 tcp
rdr ne1 x.x.x.x/32 port 80 -> 192.168.2.254 port 8080 udp
# redirect HTTP requests from the DMZ
rdr ne2 x.x.x.x/32 port 80 -> 192.168.2.254 port 8080 tcp
rdr ne2 x.x.x.x/32 port 80 -> 192.168.2.254 port 8080 udp
同样,"x.x.x.x" 是连接防火墙到Internet的外部接口的IP地址。192.168.2.254是DMZ中的HTTP服务器的IP地址。因为安全原因,服务器在一个无特权的端口8080上监听请求。注意这里必须要一个规则把每个接口上的数据包重定向到"x.x.x.x"的80号端口上,要不然有些数据包将无法到达正确的目的地。
重定向其它的服务,你可以复制HTTP的规则,并更改端口号码。例如,重定向邮件,将下面的规则加入/etc/ipnat.rules文件中:
# redirect SMTP requests from foreign hosts
rdr tun0 x.x.x.x/32 port 25 -> 192.168.2.253 port 25 tcp
rdr tun0 x.x.x.x/32 port 25 -> 192.168.2.253 port 25 udp
# redirect SMTP requests from the private internal net
rdr ne1 x.x.x.x/32 port 25 -> 192.168.2.253 port 25 tcp
rdr ne1 x.x.x.x/32 port 25 -> 192.168.2.253 port 25 udp
# redirect SMTP requests from the DMZ
rdr ne2 x.x.x.x/32 port 25 -> 192.168.2.253 port 25 tcp
rdr ne2 x.x.x.x/32 port 25 -> 192.168.2.253 port 25 udp
注意这里我使用了不同的IP地址,这个地址是我运行SMTP守护进程的机器。当然,如果你所有的服务都是运行在同一台主机上的话,这个地址则不需要更改。
一旦我们设置好了全部的NAT规则,我们就可以继续把包过滤规则加进去了。这些储存在/etc/ipf.rules 文件中。用文本编辑器打开它,并把下面这两行添加到最开头:
pass out quick on lo0 all
pass in quick on lo0 all
lo0 是一个回环接口,我们不需要去动它,因为在这里阻挡数据包会浪费大量的处理器周期。关键字quick指示防火墙在数据包匹配这个规则后立刻停止处理其它规则。这样可以减少大量的处理器周期,并且简化了规则的书写。这里没什么可加的了,所以我们继续进行到tun0接口规则,我们在这里需要阻拦所有到不合法地址的输出数据(一些入侵者喜欢使用这类反弹控制的方法,我们当然不想帮他们):
block out quick on tun0 from any to 192.168.0.0/16
block out quick on tun0 from any to 172.16.0.0/12
block out quick on tun0 from any to 127.0.0.0/8
block out quick on tun0 from any to 10.0.0.0/8
block out quick on tun0 from any to 0.0.0.0/8
block out quick on tun0 from any to 169.254.0.0/16
block out quick on tun0 from any to 192.0.2.0/24
block out quick on tun0 from any to 204.152.64.0/23
block out quick on tun0 from any to 224.0.0.0/3
在阻止了危险的数据包传播到Internet上以后,我们需要添加一些让合法的数据流出的规则。下面这三条规则将允许所有从内部专用网上的合法地址上发出的数据发送到Internet:
pass out quick on tun0 proto tcp from 192.168.1.0/24 to any keep state
pass out quick on tun0 proto udp from 192.168.1.0/24 to any keep state
pass out quick on tun0 proto icmp from 192.168.1.0/24 to any keep state
关键字keep state告诉ipfilter 去“记住”连接状态,这样便可以让那些发回给创建连接的那些主机的包能通过防火墙。关键字proto定义一个特别的规则将使用的协议。
我们同样希望所有从DMZ合法地址上发送的数据能顺利发送到Internet上去。所有我们需要做的只是复制内部专用网络的规则,并更换网络地址而已。(用192.168.2.0/24 代替192.168.1.0/24 -- /24 是netmask ):
pass out quick on tun0 proto tcp from 192.168.2.0/24 to any keep state
pass out quick on tun0 proto udp from 192.168.2.0/24 to any keep state
pass out quick on tun0 proto icmp from 192.168.2.0/24 to any keep state
所有其它试着通过tun0到达Internet上的数据应该被拦截,这是因为安全原因。
block out quick on tun0 all
我们现在有了一套定义哪些数据包可以离开我们的网络并尝试连接Internet上其它主机的规则。下来,我们将添加用来阻拦不受欢迎的数据包发送到我们网络里来的规则。
和刚才一样,我们需要丢掉所有从不合法地址上发来的数据包,因为他们总是被那些有着不好意图的人送来的。这个可以通过下面这套规则来实现:
block in quick on tun0 from 192.168.0.0/16 to any
block in quick on tun0 from 172.16.0.0/12 to any
block in quick on tun0 from 10.0.0.0/8 to any
block in quick on tun0 from 127.0.0.0/8 to any
block in quick on tun0 from 0.0.0.0/8 to any
block in quick on tun0 from 169.254.0.0/16 to any
block in quick on tun0 from 192.0.2.0/24 to any
block in quick on tun0 from 204.152.64.0/23 to any
block in quick on tun0 from 224.0.0.0/3 to any
block in log quick on tun0 from x.x.x.x/32 to any
block in log quick on tun0 from any to x.x.x.0/32
block in log quick on tun0 from any to x.x.x.255/32
关键字log告诉ipfilter去记录所有符合一个规则的数据包。
当所有非法数据包被丢弃以后,我们可以检查是否有任何去我们开放给公众的端口的数据包,如果有的话,我可以让它们通过。下面的规则检查送去端口80的数据包,这是一般的HTTP端口。
pass in quick on tun0 proto tcp/udp from any to x.x.x.x/32 port = 80 keep state
pass in quick on tun0 proto tcp/udp from any to 192.168.2.254/32 port = 8080 keep state
注意在ipf.rules文件中使用的地址/端口一定要符合ipnat.rules中使用的地址/端口。下面的规则允许所有到DMZ中的SMTP服务器的数据包:
pass in quick on tun0 proto tcp/udp from any to x.x.x.x/32 port = 25 keep state
pass in quick on tun0 proto tcp/udp from any to 192.168.2.253/32 port = 25 keep state
所有其它从Internet送到外部接口上的数据包都会被丢弃。
block in quick on tun0 all
我们的外部接口基本已经被保护的很好了,我们现在可以集中在到内部专用网络和DMZ的接口上了。假设内部专用网络连接在接口ne1上,我们可以写下下面这些阻拦所有尝试到达内部专用网络的数据包的规则:
block out quick on ne1 all
这个规则剪断访问内部专用网络DNS的权利,就是我们前面提到的列在/etc/resolv.conf 文件中的那个名字服务器。我们可以激活访问名字服务器的限权用:
pass out quick on ne1 proto tcp from 192.168.1.1 to 192.168.1.2/32 port = 53 keep state
pass out quick on ne1 proto udp from 192.168.1.1 to 192.168.1.2/32 port = 53 keep state
或者更好的, 使用外部名字服务器来代替内部名字服务器。这样的话,/etc/resolv.conf 将会像这样(“y.y.y.y” 和 “z.z.z.z”是外部名字服务器的地址,它应该是你的ISP分配给你的):
lookup file bind
nameserver y.y.y.y
nameserver z.z.z.z
值得记住的是,“out”规则定义了数据包离开防火墙并进入其它网络的过滤政策(在这里是内部专用网络),“in”规则定义了从外部送到防火墙的数据包的过滤政策。这些经常给初学者造成一些问题。
定义哪些从内部专用网络发来的数据包可以进入防火墙的规则与tun0 的“in” 规则非常相似,虽然不是一样的:
block in quick on ne1 from 172.16.0.0/12 to any
block in quick on ne1 from 10.0.0.0/8 to any
block in quick on ne1 from 127.0.0.0/8 to any
block in quick on ne1 from 0.0.0.0/8 to any
block in quick on ne1 from 169.254.0.0/16 to any
block in quick on ne1 from 192.0.2.0/24 to any
block in quick on ne1 from 204.152.64.0/23 to any
block in quick on ne1 from 224.0.0.0/3 to any
block in log quick on ne1 from x.x.x.x/32 to any
block in log quick on ne1 from any to x.x.x.0/32
block in log quick on ne1 from any to x.x.x.255/32
pass in quick on ne1 proto tcp from 192.168.1.0/24 to any keep state
pass in quick on ne1 proto udp from 192.168.1.0/24 to any keep state
pass in quick on ne1 proto icmp from 192.168.1.0/24 to any keep state
block in quick on ne1 all
不同与其它的内部专用网络,DMZ有一部分是对外开放的。这样以来,在我们丢掉所有尝试进入它的数据包之前,我们将需要让一些包进入。第一组规则将让所有从内部专用网络的数据包在没有约束的情况下进入:
pass out quick on ne2 proto tcp from 192.168.1.0/24 to 192.168.2.0/24 keep state
pass out quick on ne2 proto udp from 192.168.1.0/24 to 192.168.2.0/24 keep state
pass out quick on ne2 proto icmp from 192.168.1.0/24 to 192.168.2.0/24 keep state
下来,我们将阻拦所有送去不合法地址的数据包:
block out quick on ne2 from any to 192.168.0.0/16
block out quick on ne2 from any to 172.16.0.0/12
block out quick on ne2 from any to 127.0.0.0/8
block out quick on ne2 from any to 10.0.0.0/8
block out quick on ne2 from any to 0.0.0.0/8
block out quick on ne2 from any to 169.254.0.0/16
block out quick on ne2 from any to 192.0.2.0/24
block out quick on ne2 from any to 204.152.64.0/23
block out quick on ne2 from any to 224.0.0.0/3
最后,我们将让从外部发送到公开地址的数据包通过:
pass out quick on ne2 proto tcp from any to 192.168.2.254/32 port = 8080 keep state
pass out quick on ne2 proto udp from any to 192.168.2.254/32 port = 8080 keep state
pass out quick on ne2 proto tcp from any to 192.168.2.253/32 port = 25 keep state
pass out quick on ne2 proto udp from any to 192.168.2.253/32 port = 25 keep state
其它的数据包将因安全原因而拦截:
block out quick on ne2 all
对于从DMZ发送到Internet上的数据包,我们将让所有从合法地址发送的数据包通过:
block in quick on ne2 from 172.16.0.0/12 to any
block in quick on ne2 from 10.0.0.0/8 to any
block in quick on ne2 from 127.0.0.0/8 to any
block in quick on ne2 from 0.0.0.0/8 to any
block in quick on ne2 from 169.254.0.0/16 to any
block in quick on ne2 from 192.0.2.0/24 to any
block in quick on ne2 from 204.152.64.0/23 to any
block in quick on ne2 from 224.0.0.0/3 to any
block in log quick on ne2 from x.x.x.x/32 to any
block in log quick on ne2 from any to x.x.x.0/32
block in log quick on ne2 from any to x.x.x.255/32
pass in quick on ne2 proto tcp from 192.168.2.0/24 to any keep state
pass in quick on ne2 proto udp from 192.168.2.0/24 to any keep state
pass in quick on ne2 proto icmp from 192.168.2.0/24 to any keep state
block in quick on ne2 all
这些我们现在有的规则很有限制性,但也很安全。你可以使用下面的命令来关闭它们:
ipf -A -Fa -f /etc/ipf.rules -E
ipnat -FC -f /etc/ipnat.rules
我们的网络将对外部攻击有了一定的免疫能力,不过也有一些不方便之处:
我们不能使用traceroute – 解决方法是放松我们的规则。阅读ipfilter HOW-TO文件来得到更多关于放松规则的技巧。它将是一个很好的配置防火墙的练习。
· 从外部到我们网络的pings 和连接尝试将报告100%数据包遗失—这将是个问题当你想通过从外部发送pings来监视防火墙,来看机器是否在运行。你可以用到公开端口的连接来代替。
当你想打开一些额外的服务给外部用户时,记住在/etc/ipnat.rules和 /etc/ipf.rules文件中添加适当的条目。
V. 结语
你对什么服务对外开放由你决定。在DMZ里最多运行的是HTTP服务器。另外一个很受欢迎的选择是email服务器和用于提供虚拟域名服务的DNS服务器。
在市场上有很多可用的方案,但我建议你使用你最了解的,或者,如果你不知道如何管理软件的一个特殊部分,我的建议是从简单的东西开始。例如,如果你不知道如何配置和管理DNS,你可以使用/etc/hosts 文件直到你了解了更多关于DNS的知识。如果你需要用DNS来实现虚拟域名服务,使用外部DNS服务器。你可以以每月5美圆的低价来租用一个DNS服务器,或者你可以问你的ISP是否可以在他们的名字服务器上架设你的这些域名。
如果你想运行邮件服务,考虑一下postfix,一个可以用来替代 sendmail的免费邮件软件,它非常容易配置和管理,而且一直以比sendmail更加安全而闻名。
至于HTTP服务器软件,如果你从来没有用过Web服务器的话,考虑一下用thttpd来代替Apach。. thttpd 比较小,而且更容易来配置和管理,并且还可以教你一些好的管理习惯。如果你非常想运行公共名字服务器的话,试试djbdns。学习你想要用于公众访问的软件中的不同的配置功能,并学会如何用chroot来运行它们,这样可以大大的增加系统的安全性。
最后,尽可能的学习关于网络安全,防火墙,TCP/IP管理。我在文章中提到的设计在尽可能的情况下让安全和不方便之处平衡,但你不可能在没有任何麻烦的情况下使用它,而且它并不是最安全的设计。这只似乎个开始:你应该改进它来适应你自己的要求。阅读所有可用的HOW-Tos和指南。当出现疑问的时候,问一些老的和有更多经验的管理员们,并向他们学习。
« System Security Administration for NT工具光盘制作笔记 »
发表评论: