send_tcp.tcp.check = 0; send_tcp.ip.check = 0;
/* calculate the ip checksum */
send_tcp.ip.check = in_cksum((unsigned short *)&send_tcp.ip, 20); /* set the pseudo header fields */
pseudo_header.source_address = send_tcp.ip.saddr; pseudo_header.dest_address = send_tcp.ip.daddr; pseudo_header.placeholder = 0;
pseudo_header.protocol = IPPROTO_TCP; pseudo_header.tcp_length = htons(20);
bcopy((char *)&send_tcp.tcp, (char *)&pseudo_header.tcp, 20);
send_tcp.tcp.check = in_cksum((unsigned short *)&pseudo_header, 32); sinlen = sizeof(sin);
sendto(tcp_socket, &send_tcp, 40, 0, (struct sockaddr *)&sin, sinlen); }
close(tcp_socket); }
unsigned short in_cksum(unsigned short *ptr, int nbytes) {
register long sum; /* assumes long == 32 bits */ u_short oddbyte;
register u_short answer; /* assumes u_short == 16 bits */ /*
* Our algorithm is simple, using a 32-bit accumulator (sum), * we add sequential 16-bit words to it, and at the end, fold back * all the carry bits from the top 16 bits into the lower 16 bits. */
sum = 0;
while (nbytes > 1) { sum += *ptr++; nbytes -= 2; }
/* mop up an odd byte, if necessary */ if (nbytes == 1) {
oddbyte = 0; /* make sure top half is zero */
*((u_char *) &oddbyte) = *(u_char *)ptr; /* one byte only */ sum += oddbyte; } /*
* Add back carry outs from top 16 bits to low 16 bits. */
sum = (sum >> 16) + (sum & 0xffff); /* add high-16 to low-16 */
31
sum += (sum >> 16); /* add carry */
answer = ~sum; /* ones-complement, then truncate to 16 bits */ return(answer); }
unsigned int host2ip(char *hostname) {
static struct in_addr i; struct hostent *h;
i.s_addr = inet_addr(hostname); if(i.s_addr == -1) {
h = gethostbyname(hostname); if(h == NULL) {
fprintf(stderr, \exit(0); }
bcopy(h->h_addr, (char *)&i.s_addr, h->h_length); }
return i.s_addr; }
32
实验5 防火墙原理及其基本配置
1 实验目的
学习安全网络的基本组成结构,学习防火墙的基本原理,了解用Linux 2.4 系统实现包 过滤防火墙的基本配置。
2 实验原理
当一个机构将其内部网络连接到Internet 之后,网络安全就立即成为一个需要得到重
视的问题。为了提供各种级别的安全保护,应当设置相应的安全策略来阻止对机构网络资源 的非法利用,防范各类网络攻击事件的发生,并应防止机构内部用户向外界提供一些不合适 的网络服务。
2.1 布置基本的网络结构
计算机网络的安全很大程度上依靠合理的网络组成结构以及相应的控制策略来保障。网 络提供给外部访问的范围和内容应是有限的,并且是加以制约的。一个体现安全策略的网络 结构通常应该包括以下部分: ", 防火墙(firewall):分隔内部网(Intranet)和外部网(Internet)的关口,用来阻 止外部未经授权的用户访问内部网。防火墙通常是软件和硬件的结合体。一种典型的防 火墙是网络地址转换(NAT)设备。例如,IP 伪装(masquerade)就是一种地址转换技 术,它借助保留IP 地址来缓解当前IPv4 地址迅速枯竭的局面——使用保留地址的内部 网主机通过防火墙时,源地址均按规则转换成防火墙对外的正式IP。NAT 带来的安全好 处是外界只能看到防火墙对外的正式IP,内部网络对外界而言不可见,这起到了一种 屏蔽或隔离的作用,所以NAT 设备就是一种典型的防火墙。也可以表达为,防火墙是进 行NAT 的理想位置。 ", 非军事区(demilitarized zone,缩写为DMZ,又叫停火区等):供外部网访问的专门 区域,用于发布信息、提供服务。通常情况下,外部Internet 以及内部Intranet 都应 可以访问此区域。 ", 内部网(Intranet,或者private network):供机构内部使用的网络。在内部网通常集 中放置了员工的客户机,以及那些仅供内部访问的重要服务器等。需要指出的是,内部 网用户不一定就必须使用保留地址(如192.168.*.*等),内部网用户经过防火墙访问 外界时也不一定就必须进行地址转换。例如,内部网用户可以使用正式IP 地址,并且 防火墙也可以对使用正式IP 地址的内部主机进行地址转换。 ", 外部网(Internet):一个存在大量有用信息但又不安全的大网,例如,国际互联网。 外部网中既有普通的来访者,又可能存在形形色色的不怀好意者。外部网同时又是一个 巨大的资源集,应该允许内部网用户便利地访问到外界。在这个实验中,我们笼统地使 用国际互联网的名称Internet 来指代外部网。
2.2 基本的网络安全策略
防火墙是保障网络安全的关键设施,根据具体的应用环境,它可以是单一系统,也可以 是一组系统。网络管理员在防火墙上设置策略,防火墙则按安全策略对网络实施出入控制。 例如,按照地址转换规则而实现内外网的“安全隔离”就是一种基本的策略,其附加好处还 在于可以节省全局IP 地址。防火墙应是网络整体安全策略的一部分,如果没有合理的部署
33
安全策略,性能再高的防火墙也未必能对网络提供多少实际的保护作用。
一般来说,要使一个防火墙起作用,则所有来自和去往Internet 的IP 分组都必须经过
防火墙这道关卡并接受检查。防火墙应只允许授权的网络分组通过。此外,防火墙自身要能 抵抗渗透,因为,倘若防火墙系统万一被攻击者突破或是绕开,它也就不能向内部网以及 DMZ 提供保护了。
对防火墙而言,它应行使保护内部网及DMZ 的使命,具体来讲: (1)要允许内部网能几乎不受限地访问Internet 及DMZ,
(2)向外界提供DMZ 的公开服务,如web 访问、匿名ftp 等, (3)必须阻止外界访问内部网及防火墙自身, (4)出于安全考虑,不应允许DMZ 访问内部网。
最后一点乃是鉴于DMZ 原则上已成为外界可访问到的唯一区域,有必要保证DMZ 本身不 被成为入侵者的跳板(从而进一步实施对内部网甚至防火墙本身的攻击)。也正是出于类似 考虑,只要条件允许,防火墙自身也不宜对Internet 或内部网开放各种服务(如www),以 免因www 服务器软件的漏洞等可能存在的安全隐患而导致防火墙自身被入侵。一个好的方案 是购买商用硬件防火墙产品。本实验中将采用安装Linux 2.4 操作系统的PC 来充当防火墙。 图1 所示的防火墙拥有三个网络接口,分别连接内部网、外部网和停火区。停火区中只 放置了一台服务器,主要用于向外界发布消息。这台防火墙的三个网络接口就是安全策略的 实施点,或者形象地说,它们就是三个网络过滤器,每个过滤器不但要检查进入方向的网络 分组,还可以检查出去方向的网络分组。
Ethernet DMZ
Internet Intranet
图1 用防火墙隔离内外网络
2.3 根据安全策略改变网络布局
如果需要实施更复杂的安全策略(例如,防范来自内部的可能的非法访问等),还可把 网络改造为拥有内外双重DMZ(添加多台firewall 进行分隔)等更为安全的网络结构。图2 说明了设置多级防火墙的例子,该结构把信息发布区域分隔为内外两个DMZ,并且可以在防 火墙上分别进行配置,使得外部DMZ 只供Internet 访问,而内部DMZ 只供Intranet 访问。 在图2 的例子中我们也看到,在一个大的网络机构中,可能需要使用内部防火墙将机构 网络再进行多层次的划分或者说隔离。注意图2 中Intranet 用户访问Internet 时要经过三 道防火墙,并且也只经过三道防火墙;供外界访问的服务器放在外DMZ 中,供内部访问的服 务器放在内DMZ 中,这些服务器仅仅是连接到DMZ 网络中(例如通过二层交换机),Internat 用户访问Internet 时并不经过这些服务器。
Internet outter DMZ inner DMZ
Intranet
图2 设计双重停火区
另一方面,安全策略也可以根据实际情况作相应的调整。例如,在现实的局域网比如一 个小型公司的子网中,为了各种便利,往往降低安全要求,采用一些简化的替代方案。方案
34
之一是防火墙仍然配置为一个网络分组过滤设备,但与图1 相比它减少了一个网络接口,并 且供外界访问的服务器被挪至内部网。这样DMZ 实际上就撤消了。物理的内部网中这台可以 供外界访问的服务器通常称为堡垒主机(bastion host)。堡垒主机应是物理内部网中唯一 可供外界访问到的区域,如图3 所示,严格来说,堡垒主机就不再属于逻辑内部网了。这种 结构仍然要结合一定的安全策略才能真正实现。在图3 的例子中,内部网(包括private network 中的主机和bastion host)可以采用外部地址,也可以采用内部地址,两种情况下 防火墙所要配置的安全策略是有所不同的。
Internet
private network bastion host
图3 堡垒主机
这种网络结构把堡垒主机配置在内部网中,而防火墙则放置在内部网和Internet 之间。
在防火墙上定制规则,使外部只能访问到堡垒主机,而去往内部系统其它主机的分组全部被 滤除。进一步,还可以把堡垒主机也配置成一个防火墙,并且这只需要配置一个代理服务器 软件就可以做到。由于内部主机与堡垒主机处于同一网段,是否允许内部系统直接访问 Internet,或着强制要求通过使用堡垒主机上的代理服务来访问外部,就可以由机构的安全 策略来决定。对网络防火墙的过滤规则进行配置,使得其只接受来自堡垒主机的数据包,就 可以强制内部用户使用代理服务访问Internet。这种情况下,堡垒主机就成为名副其实的 应用层防火墙。
由于图3 中堡垒主机是唯一能从Internet 上直接访问的内部区域,所以有可能受到攻
击的主机理论上也就只有堡垒主机本身。但是,如果允许用户登入到堡垒主机(即堡垒主机 提供远程登陆),那么整个内部网络上的主机都存在潜在的威胁了。例如,一台被成功入侵 并夺取管理员权限的BSD 系统是可以轻易地用来向更多的主机发动攻击的。为了防范黑客以 堡垒主机作为跳板攻击内部网,必须确保堡垒主机本身是一套安全可靠的系统。
更简化的方案是连堡垒主机也撤消,而把需要向外部发布信息的服务项目全都集中于防 火墙一身,或者说,防火墙就充当诸如www 和ftp 服务器这样的实体。把防火墙当作部署 www 等服务的地点,并对防火墙进行配置,允许Internet 访问上述服务,而禁止外部对受 保护的内部网络中其它系统的访问。这样的做法至少也是可行的,并且在实际当中还普遍结 合NAT 等网络功能一并实施,得到了广泛的应用。显然这样的做法很节省费用,但却算不上 是一种合理的安全网络结构。
3 实验内容
本实验的主要内容是用Linux 2.4 系统实现包过滤防火墙。Linux 2.4.21 于2003 年6 月13 日发布,而上一个版本是2002 年11 月28 日发布的Linux 2.4.20。在Linux 2.4 系 统中,内核防火墙以netfilter 模块的形式出现,其配置界面则是iptables。我们也常把 netfilter/iptables 笼统地称为iptables。
3.1 理解包过滤防火墙
防火墙通常有包过滤路由器、应用层网关(例如前面介绍的堡垒主机)和电路层网关(针 对特定连接的中继设备)等形式。其中包过滤(packet fitering)路由器是最简单也最常 用的防火墙。例如,一台运行Linux 操作系统的PC 机,根据内核的发行版本(2.0、2.2、 2.4),可使用ipfwadm、ipchains 或iptables 等工具进行网络分组过滤。策略配置可以有
35