| 各公司都有各自的FIREWALL产品,而且在各平台下都有不同的FIREWALL。我们不可能接触到所有类型的FIREWALL,因此我在此就FIREWALL的原理与大家讨论讨论。 各公司的FIREWALL之间有一定的差异,但原理是相通的。现有的FIREWALL大致分为两种:基于包过滤方式的;基于应用级别的(比如PROXY)。下面分别就这两种FIREWALL做一些说明。 基于包过滤方式的FIREWALL: 在Internet上走的基本上是IP包,FIREWALL都是对IP包进行过滤的,TCP、UDP、ICMP等都是封装在IP包之内的,所以基于IP包过滤的FIREWALL能够很好的控制进出站的TCP、UDP、ICMP包。 IP包通过基于包过滤方式的FIREWALL时并没有被隔断(这是与PROXY的最大区别),过滤的法则只能控制某个IP包能否进站或出站。 配置基于包过滤方式的FIREWALL,需要对IP、TCP、UDP、ICMP等各种协议有一定程度的了解(更确切的说是需要有很深入的了解)。下面我们就一个例子来说明基于包过滤方式的FIREWALL是怎么工作的: 假设我们希望在FIREWALL内部的安全网络的用户能TELNET到FIREWALL外部的非安全网络,而不希望非安全网络的用户TELNET到安全网络。 首先我们看看一个TELNET连接是怎样建立的: 在CLIENT端发起一个TELNET连接到SERVER端,首先CLIENT端打开一个大于1023的TCP端口,向SERVER端23端口发出一个连接请求(SYN),如果SERVER端允许23端口连接,那么SERVER端的23端口向CLINET端的大于1023的TCP端口发出一个允许连接的回应(SYN/ACK),最后CLIENT端的大于1023的端口向SERVER端的23端口发出一个确认连接的数据包(ACK)。这称为TCP的三步握手。上面的ACK标志说明前一个TCP包已经被接收到;SYN的意思是表示这一次的连接是新建的。 FIREWALL正是利用这两个标志来限制某些连接的。我们用下面的方式来定义一个TCP连接: "lt; Source Address,Source Port,Destination Address,Destination Port"gt; 要注意的是:建立TCP连接的第一个包没有ACK标志,接下来的回应包有ACK标志,这就可以决定一个TCP连接的方向。 我们打算让FIREWALL内部的安全网络的CLIENT端能够用TELNET访问FIREWALL外部的非安全网络的SERVER端,而不允许非安全网络TELNET进安全网络,那我们可以建立以下的法则来实现: 1 拒绝所有的TCP连接 2 允许源IP地址为安全网段的TCP端口大于1023,目的IP地址为0.0.0.0(所有IP地址)TCP端口等于23的TCP包从FIREWALL内部经FIREWALL出站。 3 允许源IP地址为0.0.0.0、TCP端口等于23,目的IP地址为安全网段IP、目的TCP端口大于1023的TCP/ACK包从FIREWALL外部经FIREWALL进站。 这样我们就可以很霸道的使用Internet了,我能TELNET你,而你不能TELNET我。 UDP和TCP类似。 ICMP叫做消息控制协议,这个协议的主要应用是察看目标主机的信息(PING),还有目标网络的信息(TRACEROUTE)。ICMP对应用程序来说并不重要,当然有一小部分的应用程序用PING来察看目标主机是否活动。但ICMP对暴露我们的网络结构有很大的威胁。我们也能像过滤TCP包一样过滤ICMP包,做到我能PING你,而你不能PING我。 包过滤是基于IP地址,各种协议端口(TCP、UDP、ICMP)来过滤包的,它可以防止IP欺骗,半开扫描等等攻击。 基于应用级别的FIREWALL(PROXY),也许更为大家所熟悉。IP包在FIREWALL中是断开的,当内部网络向外部网络申请一个连接时,PROXY截断了这个申请,并以自己的身份向目标申请连接,最后把结果返回内部网络。PROXY的最大缺点是不支持UDP(我没见过哪个PROXY支持UDP)。 我所见过的PROXY有HTTP,HTTPS,FTP,TELNET,SMTP,SOCK等等。 SOCK代理能用于任何应用,但必须在CLIENT端加装SOCK CLIENT,这在WINDOWS下很容易实现,但是在UNIX中就有点麻烦了,我一直找不到UNIX下的SOCK CLIENT。而且SOCK PROXY还和一些应用不兼容----微软建议:不要把EXCHANGE SERVER和MS PROXY CLIENT端装在一台NT机上。 以上是对两种常见的FIREWALL的简略说明,下面是对FIREWALL的一些问题的讨论: (一)DMZ(非军事区) 通常的说法是FIREWALL与ROUTER之间的区域。 ROUTER DMZ FIREWALL \ \ __\_______ ___\_________ ____| |_______________| |_________________ SECURE NETWORK |__________| |_____________| 有一种新的架构,FIREWALL用三块网卡。 ROUTER FIREWALL \ \ __\_______ ___\_________ ____| |_______________| |_________________ SECURE NETWORK |__________| |_____________| | ______|______ | | | DMZ | |_____________| 我个人认为,第二种DMZ才象真正的DMZ。但是这种配置较复杂,FIREWALL的效率也低。 (二)NAT(网络地址转换) 为什么要用NAT? 一般来说,FIREWALL内部的安全网络的IP为RFC定义的三段保留IP,但是这种IP是不能直接路由出去的。所以我们会在FIREWALL中用NAT把保留IP转换成注册IP。 NAT存在的主要问题是FTP的问题。FTP的一些命令会把源IP地址作为参数发给SERVER,但是这个IP地址是作为数据封装在IP包内的,NAT不会转换,这就会造成错误。解决办法是用PASV命令。我所接触的FIREWALL的NAT号称能够识别FTP命令,转换这种IP地址。 我想知道的是: 有没有别的解决方案? (三)MAIL SERVER的位置 在一些有SMTP代理的FIREWALL,建议把MAIL SERVER放在FIREWALL安全网络一侧;但是在MS PROXY这种环境下好象只能把EXCHANGE放在MS PROXY外部,因为微软建议不要在EXCHANGE SERVER上装MS PROXY CLIENT。那这又如何来控制EXCHANGE的安全呢? (四)WEB SERVER的位置 WEB SERVER是最容易受到攻击的服务器,它的位置是个难题:放在安全网段必须在FIREWALL上开80端口,如果WEB SERVER被黑掉,会成为黑客攻击内部安全网络的基地;如果WEB SERVER放在外部网络,又得不到保护。我认为,可以放在第二种DMZ中,既能过滤端口,又能保证内部网络的安全性,但是配置复杂。 我一直坚持尽量把服务器放在FIREWALL内部,就是想给服务器加上一层屏障,过滤一些不必要的端口。像一台NT IIS架成的WEB SERVER,默认情况有21、70、80、139等端口,如果我只想使用它的WEB SERVER,可以把21、70端口关闭,但是139端口我不知怎么关闭,而139端口是一个很危险的端口,我们应当关闭它,可以在NT上安装一些过滤软件,把139过滤掉。 (五)过滤法则 基于包过滤的FIREWALL的过滤法则该设置些什么? 下面是我觉得有必要的法则,各位有什么补充,给我来信。 deny 192.168.1.1 255.255.255.0 0 0 all any 0 any 0 non-secure both inbound l=y f=h deny 0 0 192.168.1.1 255.255.255.0 all any 0 any 0 non-secure both outbound l=n f=y deny 172.16.0.0 255.240.0.0 0 0 all any 0 any 0 non-secure both inbound l=n f=y deny 192.168.0.0 255.255.0.0 0 0 all any 0 any 0 non-secure both inbound l=n f=y deny 10.0.0.0 255.0.0.0 0 0 all any 0 any 0 non-secure both inbound l=n f=y deny 0 0 0 0 udp any 0 eq 514 both both both l=n f=y deny 127.0.0.0 255.0.0.0 0 0 all any 0 any 0 both both both l=y f=y deny 0 0 0 0 all any 0 eq 200 non-secure both inbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 eq 80 secure route inbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 eq 80 non-secure route outbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack eq 80 gt 1023 non-secure route inbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack eq 80 gt 1023 secure route outbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 icmp eq 8 eq 0 both both both l=n f=y permit 0 0 192.168.1.0 255.255.255.0 icmp eq 0 eq 0 both both both l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 eq 21 secure route inbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 eq 21 non-secure route outbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack eq 21 gt 1023 non-secure route inbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack eq 21 gt 1023 secure route outbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp eq 20 gt 1023 non-secure route inbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp eq 20 gt 1023 secure route outbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp/ack gt 1023 eq 20 non-secure route outbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp/ack gt 1023 eq 20 secure route inbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack gt 1023 gt 1023 non-secure route inbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack gt 1023 gt 1023 secure route outbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 gt 1023 secure route inbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 gt 1023 non-secure route outbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 eq 23 secure route inbound l=n f=y permit 192.168.1.0 255.255.255.0 0 0 tcp gt 1023 eq 23 non-secure route outbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack eq 23 gt 1023 non-secure route inbound l=n f=y permit 0 0 192.168.1.0 255.255.255.0 tcp/ack eq 23 gt 1023 secure route outbound l=n f=y 这份文档完全是我对FIREWALL的一些理解和配置FIREWALL的一些经验,其中有不少疑问,希望大家能够给我解答。 | |
浙公网安备 33010602011771号