快速查找PPPOE攻击源的方法随着宽带接入服务器和PPPOE协议在电信运营商宽带网中的大量应用,一种针对PPPOE协议的病毒攻击也随之产生。此类攻击主要利用PPPOE协议的特点,采用类似DOS攻击的方式,不断发送PPPOE连接请求包,导致宽带接入服务器处理能力饱和,无法及时响应正常的PPPOE呼叫请求,造成用户无法拨号上网,对宽带网络质量影响较大。下面以REDBACK生产的SE800设备为例,介绍一下如何快速定位攻击源并制止攻击对网络通信的影响。在此之前,首先对PPPOE协议的原理和建立过程。一、PPPOE协议简介PPPoE协议全称PointtoPointProtocoloverEthernet(以太网上的点对点协议),简单地说,就是将以太网和PPP协议结合后的协议,目前广泛应用在ADSL接入方式中。通过PPPoE技术和宽带调制解调器(比如ADSLModem),可以实现高速宽带网的个人身份验证访问,为每个用户创建虚拟拨号连接,这样就可以高速连接到Internet。二、PPPOE连接的建立PPPOE协议会话的建立包括两个阶段:发现阶段(Discovery)和PPP会话阶段。1、Discovery阶段在Discovery过程中用户主机以广播方式寻找可以连接的所有接入设备,获得其以太网MAC地址。然后选择需要连接的用户主机并最后获得所要建立的PPP会话的SESSION_ID。在Discovery过程中节点间是客户端-服务器关系,一个用户主机(客户端)最终要发现一个接入设备(服务器)。在网络拓朴中,一般有不止一个的接入设备可以通信,Discovery阶段允许用户主机发现所有的接入设备,并从中选择一个。当Discovery阶段结束时,用户主机和接入设备之间都获得了可供以太网上建立PPP连接的全部信息。Discovery阶段保持无连接状态直到一个PPP会话的建立。一旦PPP连接建立,则用户主机和接入设备都必须为PPP虚拟端口分配资源。典型的发现(Discovery)阶段共包括4个步骤:(1)用户主机发出PPPOE有效发现初始(PADI)包。以太网目的地址为广播地址0xffffffff,CODE字段为0x09,SESSION_ID为0x0000。PADI包必须至少包含一个服务名称类型(Service-Name)的标签(标签类型字段为0x0101),向接入设备提出所要求提供的服务。一个完整的PADI(包括PPPOE头)不能超过1484字节,以留下充足的预留给agent设备增加Relay-Session-Id标识。(2)接入设备收到在服务范围内的PADI包后,发送PPPOE有效发现提供(PADO)包以响应请求。其CODE字段为0x07,SESSION_ID仍为0x0000。PADO包必须包含一个接入设备名称类型(AC-Name)的标签(标签类型字段为0x0102)以及一个或多个服务名称类型标签,表明可向用户主机提供的服务种类。(3)用户主机在可能收到的多个PADO包中选择一个合适的接入设备,选择的原则是根据PADO中接入设备名称类型标签和服务名称类型标签的内容。然后向所选择的接入设备发送PPPOE有效发现请求(PADR)包。其CODE字段为0x19,SESSION_ID仍为0x0000。PADR包必须包一个服务名称类型标签,确定向接入设备请求的服务种类。当一个用户主机在确定时间没有收到PADO,他会重发一个PADI,同时等待两倍的时间。这种过程可以根据需要重复多次。(4)接入设备收到PADR包后准备开始PPP会话,它发送一个PPPOE有效发现会话确认(PADS)包。其CODE字段为0x65,SESSION_ID为接入设备所产生的一个唯一的PPPOE会话标识号码。0xffff作为预留资源,目前不能被使用作SESSION_ID。PADS包也必须包含一个服务名称类型的标签确认向用户主机提供的服务。当用户主机收到PADS包确认后,双方就进入PPP会话阶段。如果接入设备不能识别PADR中的服务名称类型的标签,则会回一个包含服务名称错误(Service-Name-Error)标签的PADS,其SESSION_ID仍然是0x0000。如果用户主机在确定时间没收到PADS包,与没收到PADO作同样处理。2、PPP会话阶段用户主机与在发现阶段确定的接入设备进行PPP协商。这个协商过程与标准的PPP协商并没有任何区别。在PPP会话阶段节点间是对等关系。3、PPPOE有效发现终止包PPPOE有效发现终止包(PADT),可以在PPP会话建立后的任何时候发送,来终止PPPOE会话。在一个PPP会话建立后,PADT包随时可由用户主机或接入设备中任何一方发送,指示PPP会话已终止。PADT包不需要任何标签,其CODE字段为0xa7,SESSION_ID为需要终止的PPP会话的会话标识号码。在发送或接收PADT后,即使正常的PPP终止分组也不必发送。PPP对端应该使用PPP协议自身来终止PPPOE会话,但是当PPP不能使用时,可以使用PADT。Host接入服务器PADIPADOPADRPADSPADTPPPDataPPPOE通信流程图三、PPPOE攻击原理PPPOE攻击是利用合理的PPPOE服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。假设一台用户主机在发送PPPOE有效发现初始(PADI)包后突然死机或掉线,接入服务器在发出PPPOE有效发现提供(PADO)包响应后无法收到客户端的PADR包或PADT包,这种情况下服务器一般会重试并等待一段时间后丢弃这个未完成的连接,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源,即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的PPPOE连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,用户无法建立PPPOE连接,这种情况我们认为服务器端受到了PPPOE攻击。四、SE800上如何定位攻击源1、如何判断是否受到攻击通常情况下,SE800遭到PADIDOS攻击时,有如下特点:大量用户报拨号错误678,此时察看showsusuall发现处于认证状态的用户很少且用户上线总数明显低于正常时的水平。同时查看pppoe计数器可以看到PADI/PADR的比例超过正常值很多。一般PADI/PADR的数值约为下联线路的条数。在遭到PADI攻击时PADI的数量大大增多。查看pppoe计数器的方法如下:Clearpppoecounter将计数器清零Showpppoecounterdetail查看计数器数值如下是遭到PADI攻击时的例子,此时PADI/PADR值接近20:[local]se01#showpppoecountersdeCurrenttime:FriAug1010:31:022007--当前时间Lastcleared:FriAug1010:29:452007--计数器清零的时间PPPoEPADcounters:----------------------------------------------------------------recvpackets:6467sentpackets:6560dropinpackets:85dropoutpackets:0PADIpackets:6085PADOpackets:6085PADRpackets:275PADSpackets:270PADMpackets:0PADNpackets:0PADTpacketsrecv:107PADTpacketssent:205Droppacketincounters:----------------------------------------------------------------PADR,maxsessreached:0PADR,samemacstarting:3invalidversion/type:0invalidlength:0unknowncode:0badpacket:0invalidtagname:0badencaps:0PADIsnon-zerosess-id:0PADRsnon-zerosess-id:0PADIsnosvcname:0PADRsnosvcname:0socketerror:0processrestart:0circuitnotcreated:0circuitnotup:0packetonvirtualcircuit:0nonsubscribercircuit:0socketdrops:0unknownvcct:0badaccookie:0noaccookie:0zeromacaddress:0sessionisdown:0invalidtaglength:0throttle:0PADOdelaymaxreached:0Droppacketoutcounters:----------------------------------------badpacket:0badencap:0unknownvcct:0sendsocketerror:0toolongMOTMs:0memoryallocfailures:0PPPoEvirtualcircuitcounters:----------------------------------------virtualcircuitscreated:272virtualcircuitsdeleted:231combinedcircuitsused:0combinedcircuitsreset:0createfailed:0deletefailed:0createfail,rcctused:0createfail,nocct:0createfail,cctinit:0circuitlookupfailures:231PPPoEPADMerrorcounters:----------------------------------------malformedURLs:0toolongexpandedURLs:0toolongMOTMs:0badexpansionchar:02、如何确定攻击源对于PADI攻击,在SE800上可以通过debug的方式来查找确定攻击源的MAC地址。具体步骤如下:打开Debug步骤如下:terminalmonitordebugpppoediscovery关闭debug的步骤:nodebugall注意:打开debug会对设备造成一定影响,打开debug后应及时关闭。如下蓝色部分为PADI的源MAC,大量发送PADI的MAC地址通常就是攻击源。Sep1114:06:01:[1/2:1023:63/3/2/4]:%PPPOE-7-DISC:[0]ReceivedPADI:localmac:ff:ff:ff:ff:ff:ffremotemac:00:17:9a:9f:fb:57Sep1114:06:01:[1/2:1023:63/3/2/4]:%PPPOE-7-DISC:[0]addanyservice,tlen=4Sep1114:06:01:[1/2:1023:63/3/2/4]:%PPPOE-7-DISC:[0]SentPADOSep1114:06:01:[3/3:1023:63/3/2/226]:%PPPOE-7-DISC:[0]ReceivedPADI:localmac:ff:ff:ff:ff:ff:ffremotemac:00:17:9a:9f:fb:57Sep1114:06:01:[3/3:1023:63/3/2/226]:%PPPOE-7-DISC:[0]addanyservice,tlen=4Sep1114:06:01:[3/3:1023:63/3/2/226]: