一、地址转换
我们知道,Internet 技术是基于IP 协议 的技术,所有的信息通信都是通过IP包来实现的,每一个设备需要进行通信都必须有一个唯一的IP地址。因此,当一个网络需要接入Internet的时候,需要在Internet上进行通信的设备就必须有一个在全球Internet网络上唯一的地址。当一个网络需要接入Internet上使用时,网络中的每一台设备都有一个Internet地址,这在实行各种Internet应用上当然是最理想不过的。但是,这样也导致每一个设备都暴露在网络上,任何人都可以对这些设备攻击,同时由于Internet目前采用的IPV4协议在网络发展到现在,所剩下的可用的IP地址已经不多了,网络中的每一台设备都需要一个IP地址,这几乎是不可能的事情。
采用端口地址转换,管理员只需要设定一个可以用作端口地址转换的公有Internet 地址,用户的访问将会映射到IP池中IP的一个端口上去,这使每个合法Internet IP可以映射六万多台内部网主机。从而隐藏内部网路地址信息,使外界无法直接访问内部网络设备。
Cisco路由器提供了几种NAT转换的功能:
1、内部地址与出口地址的一一对应
缺点:在出口地址资源稀少的情况下只能使较少主机连到internet 。
2、内部地址分享出口地址
路由器利用出口地址和端口号以及外部主机地址和端口号作为接口。其中内部地址的端口号为随机产生的大于1024的号码,而外部主机端口号为公认的标准端口号。这样可以用同一个出口地址来分配不同的端口号连接任意数量的内部主机到外网。
具体配置:由于实验用的是ISDN拨号上网,在internet上只能随机获得出口地址,所以NAT转换的地址池设置为BRI口上拨号所获得的地址。
interface FastEthernet0/0
ip address 172.16.18.200 255.255.255.0
ip nat inside the interface connected to inside world
!
interface BRI0/0
ip address negotiated
ip nat outside the interface connected to outside network
encapsulation ppp
no ip split-horizon
dialer string 163
dialer load-threshold 150 inbound
dialer-group 1
isdn switch-type basic-net3
ip nat inside source list 1 interface BRI0/0 overload
access-list 1 permit 172.16.18.0 0.0.0.255
3、内部地址和外部地址出现交叠
当内部和外部用同一个网络段地址时,在地址没有重复的情况下,可以同时对内外接口进行NAT转换使之可以正常通讯。
4、用一个出口地址映射内部多台主机
应用于internet上的大型网站有多台主机对应同一个系统的同一个出口地址。
可以用sh ip nat translation 和debug ip nat 命令来检查NAT的状态。
二、基于上下文的访问控制(Context-based access control--CBAC)
CISCO路由器的access-list只能检查网络层或者传输层的数据包,而CBAC能够智能过滤基于应用层的(如FTP连接信息)TCP和UDP的session;CBAC能够在firewall access-list 打开一个临时的通道给起源于内部网络向外的连接,同时检查内外两个方向的sessions。
1、工作原理
比如当CBAC配置于连到internet的外部接口上,一个从内部发出的TCP数据包(telnet会话)经过该接口连出,同时CBAC的配置中已经包括了tcp inspection,将会经过以下几步:
(1)数据包到达防火墙的外部接口(设为s0);
(2)数据包由该接口outbound access-list检查是否允许通过(不通过的数据包在此被丢弃,不用经过以下步骤);
(3)通过access list检查的数据包由CBAC检查来决定和记录包连接状态信息,这个信息被记录于一个新产生的状态列表中为下一个连接提供快速通道;
(4)如果CBAC没有定义对telnet应用的检查,数据包可以直接从该接口送出;
(5)基于第三步所获得的状态信息,CBAC在s0的inbound access list中插入一个临时创建的access list入口,这个临时通道的定义是为了让从外部回来的数据包能够进入;
(6)数据包从s0送出;
(7)接下来一个外部的inbound数据包到达s0,这个数据包是先前送出的telnet会话连接的一部分,经过s0口的access list检查,然后从第五步建立的临时通道进入;
(8)被允许进入的数据包经过CBAC的检查,同时连接状态列表根据需要更新,基于更新的状态信息,inbound access list临时通道也进行修改只允许当前合法连接的数据包进入;
(9)所有属于当前连接的进出s0口数据包都被检查,用以更新状态列表和按需修改临时通道的access list,同时数据包被允许通过s0口;
(10)当前连接终止或超时,连接状态列表入口被删除,同时,临时打开的access list入口也被删除。
需要注意的是:对于配置到s0口outbound ip access list, accesslist必须允许所有需要的应用通过,包括希望被CBAC检查的应用;但是inbound ip access list必须禁止所有需要CBAC检查的应用,当CBAC被出去的数据包触发后,会在inbound access list中临时开放一个通道给合法的、正在传送的数据进入。
2、CBAC可提供如下服务
(1)状态包过滤:对企业内部网络、企业和合作伙伴互连以及企业连接internet提供完备的安全性和强制政策。
(2)Dos检测和抵御:CBAC通过检查数据报头、丢弃可疑数据包来预防和保护路由器受到攻击。
(3)实时报警和跟踪:可配置基于应用层的连接,跟踪经过防火墙的数据包,提供详细过程信息并报告可疑行为。
(4)无缝兼容性:整和防火墙和其它cisco IOS软件于一体;优化广域网利用率;提供强大的、可升级的路由选择etc。
(5)支持VPN:利用封装了防火墙版本的cisco Ios 软件和Qos特性来保证在公共网络上传输数据的安全性,同时节省费用。
(6)可升级配置:适用于大部分路由器平台,cisco带防火墙版本的IOS可升级来满足网络带宽和性能的需要。
3、CBAC受到的限制
(1)仅适用于IP数据流:只有TCP和UDP包被检测,其它如ICMP等不能被CBAC检测,只能通过基本的access lists过滤。
(2)如果我们在配置CBAC时重新更改access lists,要注意:如果access lists禁止TFTP数据流进入一个接口,我们将不能通过那个接口从网络启动路由器(netboot)。
(3)CBAC忽略ICMP unreachable 信息。
(4)当CBAC检查FTP传输时,它只允许目的端口为1024—65535范围的数据通道。
(5)如果FTP客户端/服务器认证失败,CBAC将不会打开一条数据通道。
(6)IPSec 和CBAC的兼容性:如果CBAC和IPSec配置于同一台路由器上,只要对数据包的检查是在内部网接口上进行的,而数据包加密是终止在外部网接口上的,那么IPsec和CBAC就能共存在该边界路由器上。在这种方式下,检查的是不加密的数据流。
4、CBAC所需的内存和性能
有一些参数会影响CBAC所需的内存和性能:
(1)CBAC对每条连接使用600 byte的内存;
(2)在检查数据包的过程中,CBAC使用额外的CPU资源;
(3)尽管CBAC通过对access lists的高效存储(对access list进行散列索引,然后评估该散列)来最小化其对资源的需求,它在access list检查过程中仍要使用一定的CPU资源。
5、配置CBAC
第一步,CBAC用timeout 和threshold值来管理会话,配置判断是否在会话还未完全建立的时候终止连接。这些参数全局性地应用于所有会话。具有firewall feature的cisco router12.0以上版本的IOS缺省是起了IP INSPECT 抵御DoS进攻的。当half-open会话数量大到一定的程度往往意味着正在有DOS攻击发生或某人正在做端口扫描,CBAC既监测half-open会话总数也监测会话企图建立的速率。以下是缺省配置:
HpXg_1#sh ip inspect all
Session audit trail is disabled(相关命令是ip inspect audit trail,是用来打开自动跟踪审计功能并将信息传送到console口,缺省是disabled.)
Session alert is enabled
one-minute thresholds are [400:500] connections(相关命令是ip inspect one-minute high 500和ip inspect one-minute low 400,是将引起或导致路由器开始或停止删除half-open会话的新增未建立会话的速率,即每分钟500/400个half-open会话)
max-incomplete sessions thresholds are [400:500](相关命令是ip inspect max-incomplete high 500,表示将引起路由器开始删除half-open会话的已经存在的half-open会话数500个;ip inspect max-incomplete low 400表示将导致路由器开始停止删除half-open会话的已经存在的half-open会话数)
max-incomplete tcp connections per host is 50. Block-time 0 minute.(相关命令:ip inspect tcp max-incomplete host 50 block-time 0表示将引起路由器开始丢弃到同一目的主机地址的超过50个的half-open会话。如果block-time值为0表示到某个目的主机的每条连接请求,CBAC会删除到该主机的最老的已存在的half-open会话,并让该SYN包通过;如果block-time值大于0表示CBAC将删除到该目的主机的所有已存在的half-open连接,并阻拦所有新的连接请求直到block-time值超时)。
tcp synwait-time is 30 sec(ip inspect tcp synwait-time 30:表示路由器在阻断会话前等待TCP会话达到连接建立状态的时间)
tcp finwait-time is 5 sec(ip inspect tcp finwait-time 5:表示防火墙检测到一个FIN标志后仍继续管理TCP会话的时间长度)
tcp idle-time is 3600 sec(ip inspect tcp idle-time 3600:在没有TCP连接后仍继续管理TCP会话的时间长度)
udp idle-time is 30 sec(ip inspect udp idle-time 30:在UDP会话停止后仍继续管理UDP会话信息的时间长度)
dns-timeout is 5 sec(ip inspect dns-timeout 5:DNS名字查询停止后仍继续被管理的时间)
设置timeout值可以通过丢弃超过时限的会话来有效阻止DoS攻击释放系统资源,设置threshold值可以通过限制half-open会话的数量来阻止DoS攻击。CBAC提供三种threshold值来抵御DOS攻击:1、最大half-open 的TCP或UDP会话的数量。2、基于时间的half-open会话数量。3、每个host可以打开的TCP half-open会话的数量。对于超过threshold值的连接,CBAC会初始化旧的half-open连接,释放资源接受新的要求同步的数据包。
第二步:配置access list
access-list 101 permit icmp any any echo
access-list 101 permit icmp any any echo-reply
access-list 101 permit icmp any any unreachable
access-list 101 permit icmp any any time-exceeded
access-list 101 permit icmp any any packet-too-big
access-list 101 permit icmp any any traceroute(以上命令允许ping包通过,主要用来排错,如果没有必要上述命令可以不做)
access-list 101 permit any any eq smtp(允许在邮件服务器上的安全验证)
access-list 101 deny ip any any log(CBAC要求禁止其他所有进入的ip包)
第三步:根据实际环境定义一个检查规则。
ip inspect name CBAC fragment maximum 256 timeout 1 (此命令12.1以后的版本出现,防止分段攻击)
ip inspect name CBAC smtp
ip inspect name CBAC ftp
ip inspect name CBAC http
ip inspect name CBAC tcp (进入的数据包必须与先前流出的数据包有相同的源/目的地址和端口号(源和目的对调),否则就被丢弃)
ip inspect name CBAC udp timeout 5(如果配置了timeout值,那么应答数据包是在最后的UDP请求包被送出后的预定时间范围内收到的,就被允许通过防火墙返回)
第四步:把检查规则定义到一个接口上。
interface BRI0/0
ip address negotiated
ip access-group 101 in
ip nat outside
ip inspect CBAC out
做完以上配置后,实际运行中路由器显示的log如下:
04:20:27: %FW-6-SESS_AUDIT_TRAIL: http session initiator (172.16.18.1:1426) sent 656 bytes -- responder (202.108.36.156:80) sent 30740 bytes
04:20:39: %SEC-6-IPACCESSLOGP: list 101 denied tcp 202.104.128.164(2933) -> 202.104.47.135(80), 1 packet
04:20:48: %SEC-6-IPACCESSLOGP: list 101 denied tcp 64.4.13.87(1863) -> 202.104.47.135(1026), 1 packet
04:22:52: %SEC-6-IPACCESSLOGP: list 101 denied tcp 202.104.128.164(2933) -> 202.104.47.135(80), 1 packet
04:23:03: %FW-6-SESS_AUDIT_TRAIL: tcp session initiator (172.16.18.1:1433) sent 77 bytes -- responder (202.108.44.205:110) sent 45379 bytes
04:23:09: %FW-6-SESS_AUDIT_TRAIL: tcp session initiator (172.16.18.1:1435) sent 61 bytes -- responder (202.104.32.234:110) sent 1056 bytes
04:23:22: %FW-6-SESS_AUDIT_TRAIL: udp session initiator (172.16.18.1:1431) sent 29 bytes -- responder (202.96.128.68:53) sent 240 bytes
04:23:35: %SEC-6-IPACCESSLOGP: list 101 denied tcp 202.104.180.199(1262) -> 202.104.47.135(80)!
最后,可以用debug ip inspect detail来调试CBAC。