Linux下的NAT及防火墙的混合应用(很实用)
experienced
|
1#
experienced 发表于 2006-11-28 01:05
Linux下的NAT及防火墙的混合应用(很实用)
【摘要】
主要讲述Linux系统下的NAT(网络地址转换)和基于NAT的防火墙技术。 首先由Linux系统的安装引入,着重介绍LINUX下的NAT的网络配置(服务端和客户端),以及防火墙配置原则。 其次,从理论上阐述,“什么是NAT”和网络上的攻击方法。 【引言】 LINUX凭借其稳定性、安全性和代码开放在这几年中,风靡全球;作为一种类UNIX系统,Linux正在互联网的各 个层面得到应用,从科学计算到银行取款机,从网络web服务到高层的Oracle 数据库应用。都可以看到linux的 影子。而由于Linux遵循于GPL协议(公共软件许可证),任何人可以得到并且修改它的源代码,所以他的安全性 相较于其他的非开源系统来说要高的多;并且它可以从网络中免费下载。从这2点来说他非常适合用于网络信息 闸(软路由或网关)和自制防火墙(事实上国内的硬件防火墙厂商都是用工业X86硬件和linux来做他们的产品, 虽然那不是真正意义上的硬件防火墙)。现在学校过于注重对windows及其windows平台上的软件、开发工具的 学习。但是学生们没有意识到,真正撑起这个互联网的正是UNIX系统;就从我对Linux的见解为大家展示UNIX系 统的一角吧。 什么是NAT? NAT英文全称是Network Address Translation,称是网络地址转换,它是一个IETF标准,允许一个机构(包括多 个网络节点)以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可 以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还 帮助网络可以超越地址的限制,合理地安排网络中的公有Internet 地址和私有IP地址 的使用。 为什么要进行NAT 假设校园网提供园区Internet接入服务,为了方便管理,校园网络中心分配给园区用户的IP地址都是伪IP (内部ip),但是部分用户要求建立自己的WWW服务器对外发布信息,这时候我们就可以通过NAT来提供这 种服务了。我们可以在防火墙的外部网卡上绑定多个合法IP地址或端口,然后通过NAT技术使发给其中某一 个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。 实验环境介绍 本文所有到的实验环境如下: LINUX系统主机一台(服务端):双网卡 REDHAT 9.0 主机名:host WINDOWS 98 系统主机一台(客户端):单网卡 主机名:test 联想D-link 8口 10M/100M交换机一个 【正文】 网络拓扑结构: 一、 RED HAT 9.0安装和注意点 Linux是一个独立的操作系统,所以不能在其他操作系统下进行安装,他有自己的启动方式,可以采用以 下两种方法进行安装。 ● 从CD-ROM进行安装 ● 从FTP服务器进行安装 由于Linux系统安装(第一种方法),有随机参考手册,难度不大,所以我们着重介绍从ftp安装。 在安装之前制作启动盘: 1. 在windows操作系统下将安装盘放入光驱; 2. 运行 e:\dosutils\rawrite.exe(e盘为光驱) 3. 在运行后的界面中输入e:\images\bootnet.img 4. 指定目标盘,输入用户软盘盘符:a 这样一张安装程序的启动盘就建好了。 用软盘引导计算机,进入蓝色界面后,输入FTP服务器地址和ftp上的用户名及口令就可以下在安装了。 RED HAT 9.0安装界面为中文,安装中文说明基本可以完成系统定制,在此要强调的是,分区的时 候,/swap(交换分区)大小要是内存大小的2倍;既然是作NAT网关,要把/var(日志分区) 单分出来,并且不要少于500M,有充裕的空间存储日志,也为将来将来系统故障或受到攻击做到有据可查。 二.LINUX的网络设置和NAT原理 2.1网络设置 我们把Linux系统安装完后,整个设置平台算是搭建完毕,但是还要设置网络;设置网络之前,或者说 让linux上网前,应该把和这台服务器应该起到作用的无关服务关掉。 可以在命令行下敲入setup回车,会出现一个文本菜单,里面有“系统服务”一项,直接用空格键取消 服务前面的勾然后重新启动系统就行了。 假如是UNIX的熟练用户,可以在取消服务后,不用重新启动,在命令行侠打入 ps aux 会显示现在在后台运行的所有服务,看到要杀死的进程后,打入 kill -9 (-9代表强制杀掉进程)杀死进程。 然后进入/etc/sysconfig/network-scripts/目录 vi ifcfg-eth0会出现以下内容 device=eth0 onboot=yes bootproto=none IPADDR=192.168.0.1 #(内网网卡iP) netmask=255.255.255.0 TYPE=ETHERNET USERCTL=NO PEERDNS=NO NETWORK=192.168.0.0(网络号) Broadcast=192.168.0.255(广播号) 上面的设置的意思是:eth0对内的内网网卡,ip地址为192.168.0.1,子网掩码为:255.255.255.0; vi ifcfg-eth1会出现以下内容 device=eth1 onboot=yes bootproto=none IPADDR=202.204.208.5 #(外网网卡iP) netmask=255.255.255.128 TYPE=ETHERNET USERCTL=NO PEERDNS=NO NETWORK=202.204.208.0(网络号) Broadcast=202.204.208.127(广播号) 上面的设置的意思是:eth1是对外的外网网卡,ip地址为202.204.208.5。 网卡的设置就完成了 加入nat客户端ip和名称 vi /etc/hosts 格式为: ip地址 主机名 127.0.0.1 host 指定内网网关 vi /etc/sysconfig/network gateway=202.204.208.7 #(网关地址,假如服务端的外网为拨号,就不要指定) 设置DNS服务器 vi /etc/resolv.conf 格式为 nameserver ip地址 nameserver 202.106.196.115 都设置好后,从新启动系统,在命令行下打入 route -a #察看路由表,看一下默认网关是否为202.204.208.7 假如是的话,服务端的网络配置就已经全部完成。 下面是客户端的网络配置 因为是win 98系统,所以只给出配置参数,配置方法略 ip地址为192.168.0.2 子网掩码:255.255.255.0 域名服务器:202.106.196.115 网关:192.168.0.1 全部网络设置完成 2.2 NAT原理 2.2.1在进入NAT设置之前,我们要先讨论一下NAT的工作原理 在引言部分,我们已经提到了一个NAT应用实例,从这个实例中可以看出NAT和防火墙是一体的,换句话说, NAT就是防火墙。NAT对防火墙来说是子集的关系。 在本节,我们会深入讨论NAT的原理部分,为了更清晰的认识NAT,我们借用INTERNET标准化组织发布的RFC3022文 档的部分内容。 NAT有三种类型:静态NAT(Static NAT)、网络地址端口转换DNAT(destination- NAT)、动态地址 NAT(Pooled NAT)。我们主要讨论前面2种NAT. 静态nat解决问题的办法是:在内部网络中使用内部地址,通过NAT把内部地址翻译成合法的IP地址 在Internet上使用,其具体的做法是把IP包内的地址域用合法的IP地址来替换。NAT设备维护一个状态表 (路由表,所以也称NAT为软路由),用来把非法的IP地址映射到合法的IP地址上去。每个包在NAT设备中 都被翻译成正确的IP地址,发往下一级,这意味着给处理器带来了一定的负担。但对于一般的网络来说, 这种负担是微不足道的。 网络地址端口转换NAT,也叫做反向NAT,他解决问题的方法是:在内部网络中,使用内部地址的计算机开设了 网络服务(80,21等),当外部ip想访问这些服务时,NAT网关把外部访问ip翻译成内部ip,也就是说,把内 部开设的服务,映射到一个合法的ip和端口上,已供外部访问。 假如想进一步了解他的工作原理,NAT其实就是一种IP包欺诈,也可以说是对IP报头的修改,请看下表 4位版本 4位首部长度 8位服务类型 16位总长度(字节数) 16位标识 3位标志 13位片偏移 8位生存时间(ttl) 8位协议 16位首部校验和 32位源ip地址 32位目的ip地址 其他选项 携带数据 IP数据包格式和报头中的各字段 NAT网关(外202.204.208.5;内192.168.0.1)收到本地局域网内的客户机(192.168.0.2),发来的ip数据, 先判断是否是本地子网中发来的,假如通过,则按照她的目的ip地址查找本地路由表进行转发,NAT在包被继续 向前送出之前转换32位源地址192.168.0.1成202.204.208.5。相应的,IP包往回传时依据相同的地址进行转换。 2.2.2 NAT设置 我们知道了NAT的原理,就可以进行NAT的配置了,我们前面说过了NAT就是防火墙,在RED HAT 9.0下自 带防火墙 IPTABLES 我们在做好网络设置后,假如要实现客户端(win98)通过服务端上网(静态NAT),可以在命令行下直接 打入 iptables -t nat -A POSTROUTING -o eth1 -j SNAT - to 202.204.208.5 说明: -t nat : 调用NAT表,调用这个表说明遇到了产生新的连接的包。 -A :该命令将一条规则附加到链的末尾。 POSTROUTING:指定正当信息包打算离开防火墙时改变它们的规则。 -o eth1:输出接口为eth1 -j SNAT:跳转,也叫触发条件,当满足SNAT规则是便发生跳转 整条语句的意思为: 当防火墙遇到产生新的连接的包,则在他要离开防火墙时改变他的源ip为 202.204.208.5并且从eth1出口送出。 nat的规则指定完成后,还要打开ip转发功能: echo 1 > /proc/sys/net/ipv4/ip_forward 这样,客户端就可以通过208.5上网了。 假如208.5的客户端192.168.0.2开设了80端口的web服务,如何让外部访问到这个 局域网内部的服务呢? 这就用到了Dnat(也叫反向NAT,端口跳转),在命令行下打入: iptables -t nat -A PREROUTING -i eth1 -d 202.204.208.5 -p tcp -dport 80 -j DNAT -to-destination 192.168.0.2:80 语句说明:当有通过eth1接口的tcp协议访问202.204.208.5的80端口的时候, 则触发跳转,跳转至局域网的192.168.0.2的80端口。 但是这同时也出现一个问题,在同一局域网内的机器,无法访问202.204.208.5的80端口。以下是原因: 假设192.168.0.3不通过在命令行下打入: iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -d 192.168.0.2/32 -j SNAT -to 192.168.0.1 语句解释:当192.168.0.1-255这个范围的ip访问192.168.0.2这个ip的时候,当数据包离开的时候修改源ip地址 为192.168.0.1,这相当于在局域网内部,又作了一次NAT转换。局域网内部通过192.168.0.1作为转发,而不是 直接进行通信,这就避免了无法访问局域网内部ip的情况。 目前,nat的功能就已经实现,但是并没有对包进行过滤。 三.网络攻击和防火墙 3.1什么事网络攻击 当混乱的Internet和你良好的、有序的Linux服务器网络之间进行连接时,你最好能知道哪些东西可以进入 你的大门。这就需要制定包过滤策略,既然是包过滤,肯定是要过滤掉那些对网络有害的或者是无用的包, 但哪些包是有害的呢?我们既然是在防守,不妨听听敌人的想法。 作为一个老练的入侵者,他并不会盲目的展开攻击和入侵,他首先会确定自己的目标,当然,确定目标的方 法有2种,一是根据个人的好恶或审美观点确定目标,二是根据广义扫描器(反馈结果简单,但是速度很快 的扫描器)的反馈结果,选择整体安全性不高的网络作为攻击目标。 接下来要做的就是了解这个网络服务器,就象和人交往一样,你对那个人越了解,就越清楚那个人的弱点, 从而你对它的伤害就越致命。对人的了解通过交谈,对服务器的了解要通过扫描;首先要确定的是这台服务 器都开有什么服务,这很简单,通过tcp协议的3次握手: 1. 当请求端对要扫描的服务器端口送一个包含SYN标志的TCP报文,这个报文指明客户端使用的端口以及 TCP连接的初始端口。 2.服务器在接受到客户端的SYN包问候,假如客户端请求连接的端口存在,则返回一个SYN+ACK的报文,表 示客户端的请求被接受。同时TCP序号被加一。那么扫描器接受到SYN+ACK报文后,会向入侵者报告,扫描的 这个端口是打开的,从而使入侵者判断这是什么服务。 3. 客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。 4. 假如服务器的这个端口不存在,或者没有返回SYN+ACK报文,则扫描端发出一个FIN标志报文,撤销这 个TCP连接。 当确定了服务器开设了什么端口以后,有经验的入侵者可以从端口判断出这台服务器开设的具体服务,然后 就是按照不同的服务进行漏洞攻击或入侵了。 从以上攻击步骤看出,不要让服务器完全暴露在网络中,是非常重要的,也就是首先对端口进行过滤,只允 许指定的服务通过制定的端口穿越防火墙。这也就引出了RFC2979规定的互联网防火墙规则配置的基本准则 之一: 一切未被允许的就是禁止的。 基于该准则,防火墙应该封锁所有的信息流,然后对希望提供的服务逐项开放。这是一种非常实用的方法, 可以造成一种十分安全的环境,因为只有经过仔细挑选的服务才被允许实用。 3.2如何防御网络攻击 从我们上例来看,我们只开设了web服务使用标准的80端口。 那我们要在防火墙中进行如下设置: iptables -P INPUT -j DROP #我们用-P来拦截主机上所有通讯 iptables -A INPUT -p tcp -dport 80 -j ACCEPT #打开80端口的tcp协议 假如我们在将来还要还要添加适当端口,可以用上句的格式逐一添加 这样我们就实现了对网络服务器主机的端口过滤功能,这种方法也只是降低受到攻击的攻击,还要分别制 定防火墙策略。 1. 死亡之ping (ping of death) ping,这个软件是测试网络间是否畅通用的,他应用于icmp协议,但并不依赖于哪个端口,由于在早期的阶 段,路由器对包的最大尺寸都有限制,许多操作系统对TCP/IP栈的实现在ICMP包上都是规定64KB,并且在对 包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区,当产生畸形的,声称自 己的尺寸超过ICMP上限的包也就是加载的尺寸超过64K上限时,就会出现内存分配错误,导致TCP/IP堆栈崩溃, 致使接受方当机。 为了解决这个问题,我们可以在防火墙中加入以下内容 iptables -A INPUT -p icmp -icmp-type echo-request -i eth1 -j DROP 这句话的意思是,从接口eth1进入的icmp协议的请求全部丢弃。 2. SYN Flood (拒绝服务攻击) SYN Flood 是目前最流行的拒绝服务攻击与分布式拒绝服务攻击的方式之一,这是一种利用TCP协议缺陷, 发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽的攻击方式。 前面已经提过TCP的三次握手,问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后 突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成) ,这种情况下服务器一般会重试(再次发送SKY+ACK给客户端)并等待一段是句丢弃这个未完成的连接,这段时 间的长度我们称为(SYN Timeout),一般来说这个时间是分钟为单位(半分钟-2分钟);一个用户出现异常导致 服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端 将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也 会消耗很多的CPU资源与时间,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP 栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者 伪造的TCP连接请求而无暇理睬合法请求(客户端的正常请求相较于非法请求来说非常小),此时从正常连接的 角度来说,服务器失去了响应,这种情况我们称为服务器收到了洪水攻击。 从防御角度来说,可以缩短SYN-Timeout时间,由于SYN FLOOD攻击效果取决于服务器上保持的SYN半连接数, 这个值等于SYN攻击的频度* SYN Timeout,所以通过缩短从接受到SYN报文到区定这个报文物校并丢弃连接的 时间,,可以降低服务器的负荷。 我们可以在用IPTABLES执行如下语句: iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT 在所有的IPTABLES规则制定完后,可以用$ iptables-save > iptables-script把写入的全部的规则写入到文 件,然后 在 /etc/rc.d/rc.local 加入:iptables-restore iptables-script 这样每次重新启动系统将自动载入iptables设定好的规则。 【结论】 本设计实现了Linux服务器在局域网内的代理上网应用和网络防火墙应用,大量使用了Linux下的防火墙iptables。 并且对tcp/ip协议作了透彻的讲解,对网络的典型攻击方式进行了明确的阐述。证明Linux在作为网络网关服务器 有充分的方式,不仅系统强壮,并且配置性很强。希望给广大喜欢网络及网络管理的同学提供了新的思路。 |