BGP、OSPF

边界网关协议(Border Gateway Protocol,简称BGP)和开放最短路径优先协议(Open Shortest Path First,简称OSPF)是两种最常见的动态路由协议,BGP在大型网络中具有动态路由优势,而OSPF具有更高效的路径选择和收敛速度。

OSPF和BGP路由协议之间最主要的区别是前者属于IGP(内部网关协议),而后者则属于EGP(外部网关协议)。OSPF是以链路状态为根据进行选路,一般运行在AS自治系统内部,而BGP协议是建立在IGP协议基础之上的高级路由选择协议,它被设计用于在完全不同的网络(被称为自治系统(ASes))之间共享路由信息。一般是由ISP服务提供商运用在各个AS自治系统之间。

OSPF是一种内部网关协议,在公司的私有局域网中最常使用。OSPF通常被认为比BGP更易于部署和管理,在大多数企业环境中,运行OSPF几乎不需要手动调整。

OSPF路由协议是用于网际层(IP)网络的链路状态路由协议。该协议使用链路状态路由算法的内部网关协议(IGP),在单一自治系统(AS)内部工作。基于IP,协议号是89。封装在IP报文中传输

1、OSPF路由协议是属于IGP(内部网关协议),各个ospf路由器维护一张全网的链路状态数据库。采用SPF算法(最短路径优先算法),通过发送Hellow来建立邻居关系并且更新自己的路由表。

OSPF维护一个本地派生和学习网络的数据库。如果到远端网络有多条OSPF路径,OSPF会根据计算出的成本或度量值选择一条路径。到远端网络的路径开销是根据计算的参考带宽除以接口带宽得出的。参考带宽是OSPF中用来量化链路速度的一个指标。

如何计算路径成本

数字越低,连接速度越快。例如,100mbps链路的OSPF参考带宽为10,1gbps链路的OSPF参考带宽为1,网络管理员可以根据需要调整这个计算。

路径开销=参考总带宽/接口带宽

OSPF使用路径带宽作为决定路径选择的主要因素,因此,与BGP相比,它更有可能根据网络性能选择最优路径。

与BGP不同的是,运行OSPF需要大量的CPU和内存,因此,它并不适合超大型网络。

虽然OSPF可以扩展到处理具有数百条路由的大型网络,但管理员必须注意使用手动调整来减少处理和内存开销,这一点比BGP更重要。

OSPF的收敛速度比BGP快。

网络收敛是指当网络中断时,路由器调整到目标网络的路径的速度。

由于其收敛速度和基于网络性能选择路径的能力,OSPF在企业局域网和私有数据中心中是一个更好的选择。

动态路由协议可以根据路由操作分为链路状态距离向量,它们之间的区别基于邻居如何通信、发送路由更新和收敛,最初,在 Internet 连接之前,网络域较小,RIP 等距离矢量协议就足够了,范式转变为纯 IP 互联网连接模型,具有更大的网络域和复杂的流量路由,为了可扩展性和性能,距离矢量路由协议正在被链路状态协议所取代。

距离矢量路由协议定期向所有连接的邻居通告其路由表,无论是否发生拓扑更改或邻居发送请求,都会发生这种情况,当出现链路故障时,整个网络域都会出现完整路由表的泛滥,这会导致收敛速度变慢,随着网络域变大,收敛速度会呈指数级恶化。由于路由器没有准确更新的路由信息,还存在路由不稳定和抖动。

OSPF 和 IS-IS 被认为是链路状态协议。RIP 确实是唯一剩下的纯距离矢量协议,并且已经更新了 RIPv2 增强功能。EIGRP 被归类为高级距离矢量协议,具有距离矢量和链路状态协议的特性。EIGRP 只有一个邻居拓扑表,而不是一个完整的网络拓扑数据库。与链路状态协议类似,EIGRP 确实形成邻居邻接并发送事件触发的更新,而不是定期的完整路由表更新。

BGP 是一种路径向量协议

几种基本的网络攻击原理

1.1 TCP SYN拒绝服务攻击

一般情况下,一个TCP连接的建立需要经过三次握手的过程,即:

1、 建立发起者向目标计算机发送一个TCP SYN报文;

2、目标计算机收到这个SYN报文后,在内存中创建TCP连接控制块(TCB),然后向发起者回送一个TCP ACK报文,等待发起者的回应;

3、 发起者收到TCP ACK报文后,再回应一个ACK报文,这样TCP连接就建立起来了。

利用这个过程,一些恶意的攻击者可以进行所谓的TCP SYN拒绝服务攻击:

1、 攻击者向目标计算机发送一个TCP SYN报文;

2、目标计算机收到这个报文后,建立TCP连接控制结构(TCB),并回应一个ACK,等待发起者的回应;

3、而发起者则不向目标计算机回应ACK报文,这样导致目标计算机一致处于等待状态。

可以看出,目标计算机如果接收到大量的TCP SYN报文,而没有收到发起者的第三次ACK回应,会一直等待,处于这样尴尬状态的半连接如果很多,则会把目标计算机的资源(TCB控制结构,TCB,一般情况下是有限的)耗尽,而不能响应正常的TCP连接请求。

1.2 ICMP洪水

正常情况下,为了对网络进行诊断,一些诊断程序,比如PING等,会发出ICMP响应请求报文(ICMP ECHO),接收计算机接收到ICMP ECHO后,会回应一个ICMP ECHO Reply报文。而这个过程是需要CPU处理的,有的情况下还可能消耗掉大量的资源,比如处理分片的时候。这样如果攻击者向目标计算机发送大量的ICMP ECHO报文(产生ICMP洪水),则目标计算机会忙于处理这些ECHO报文,而无法继续处理其它的网络数据报文,这也是一种拒绝服务攻击(DOS)。

1.3 UDP洪水

原理与ICMP洪水类似,攻击者通过发送大量的UDP报文给目标计算机,导致目标计算机忙于处理这些UDP报文而无法继续处理正常的报文。

1.4 端口扫描

根据TCP协议规范,当一台计算机收到一个TCP连接建立请求报文(TCP SYN)的时候,做这样的处理:

1、 如果请求的TCP端口是开放的,则回应一个TCP ACK报文,并建立TCP连接控制结构(TCB);

2、 如果请求的TCP端口没有开放,则回应一个TCP RST(TCP头部中的RST标志设为1)报文,告诉发起计算机,该端口没有开放。

相应地,如果IP协议栈收到一个UDP报文,做如下处理:

1、如果该报文的目标端口开放,则把该UDP报文送上层协议(UDP)处理,不回应任何报文(上层协议根据处理结果而回应的报文例外);

2、如果该报文的目标端口没有开放,则向发起者回应一个ICMP不可达报文,告诉发起者计算机该UDP报文的端口不可达。

利用这个原理,攻击者计算机便可以通过发送合适的报文,判断目标计算机哪些TCP或UDP端口是开放的,过程如下:

1、发出端口号从0开始依次递增的TCP SYN或UDP报文(端口号是一个16比特的数字,这样最大为65535,数量很有限);

2、如果收到了针对这个TCP报文的RST报文,或针对这个UDP报文的ICMP不可达报文,则说明这个端口没有开放;

3、相反,如果收到了针对这个TCP SYN报文的ACK报文,或者没有接收到任何针对该UDP报文的ICMP报文,则说明该TCP端口是开放的,UDP端口可能开放(因为有的实现中可能不回应ICMP不可达报文,即使该UDP端口没有开放)。

这样继续下去,便可以很容易的判断出目标计算机开放了哪些TCP或UDP端口,然后针对端口的具体数字,进行下一步攻击,这就是所谓的端口扫描攻击。

1.5 分片IP报文攻击

为了传送一个大的IP报文,IP协议栈需要根据链路接口的MTU对该IP报文进行分片,通过填充适当的IP头中的分片指示字段,接收计算机可以很容易的把这些IP分片报文组装起来。

目标计算机在处理这些分片报文的时候,会把先到的分片报文缓存起来,然后一直等待后续的分片报文,这个过程会消耗掉一部分内存,以及一些IP协议栈的数据结构。如果攻击者给目标计算机只发送一片分片报文,而不发送所有的分片报文,这样攻击者计算机便会一直等待(直到一个内部计时器到时),如果攻击者发送了大量的分片报文,就会消耗掉目标计算机的资源,而导致不能相应正常的IP报文,这也是一种DOS攻击。

1.6 SYN比特和FIN比特同时设置

在TCP报文的报头中,有几个标志字段:

1、 SYN:连接建立标志,TCP SYN报文就是把这个标志设置为1,来请求建立连接;

2、 ACK:回应标志,在一个TCP连接中,除了第一个报文(TCP SYN)外,所有报文都设置该字段,作为对上一个报文的相应;

3、 FIN: 结束标志,当一台计算机接收到一个设置了FIN标志的TCP报文后,会拆除这个TCP连接;

4、 RST:复位标志,当IP协议栈接收到一个目标端口不存在的TCP报文的时候,会回应一个RST标志设置的报文;

5、 PSH:通知协议栈尽快把TCP数据提交给上层程序处理。

正常情况下,SYN标志(连接请求标志)和FIN标志(连接拆除标志)是不能同时出现在一个TCP报文中的。而且RFC也没有规定IP协议栈如何处理这样的畸形报文,因此,各个操作系统的协议栈在收到这样的报文后的处理方式也不同,攻击者就可以利用这个特征,通过发送SYN和FIN同时设置的报文,来判断操作系统的类型,然后针对该操作系统,进行进一步的攻击。

1.7 没有设置任何标志的TCP报文攻击

正常情况下,任何TCP报文都会设置SYN,FIN,ACK,RST,PSH五个标志中的至少一个标志,第一个TCP报文(TCP连接请求报文)设置SYN标志,后续报文都设置ACK标志。有的协议栈基于这样的假设,没有针对不设置任何标志的TCP报文的处理过程,因此,这样的协议栈如果收到了这样的报文,可能会崩溃。攻击者利用了这个特点,对目标计算机进行攻击。

1.8 设置了FIN标志却没有设置ACK标志的TCP报文攻击

正常情况下,ACK标志在除了第一个报文(SYN报文)外,所有的报文都设置,包括TCP连接拆除报文(FIN标志设置的报文)。但有的攻击者却可能向目标计算机发送设置了FIN标志却没有设置ACK标志的TCP报文,这样可能导致目标计算机崩溃。

1.9 死亡之PING

TCP/IP规范要求IP报文的长度在一定范围内(比如,0-64K),但有的攻击计算机可能向目标计算机发出大于64K长度的PING报文,导致目标计算机IP协议栈崩溃。

1.10 地址猜测攻击

跟端口扫描攻击类似,攻击者通过发送目标地址变化的大量的ICMP ECHO报文,来判断目标计算机是否存在。如果收到了对应的ECMP ECHO REPLY报文,则说明目标计算机是存在的,便可以针对该计算机进行下一步的攻击。

 1.11 泪滴攻击

对于一些大的IP包,需要对其进行分片传送,这是为了迎合链路层的MTU(最大传输单元)的要求。比如,一个4500字节的IP包,在MTU为1500的链路上传输的时候,就需要分成三个IP包。

在IP报头中有一个偏移字段和一个分片标志(MF),如果MF标志设置为1,则表面这个IP包是一个大IP包的片断,其中偏移字段指出了这个片断在整个IP包中的位置。例如,对一个4500字节的IP包进行分片(MTU为1500),则三个片断中偏移字段的值依次为:0,1500,3000。这样接收端就可以根据这些信息成功的组装该IP包。

如果一个攻击者打破这种正常情况,把偏移字段设置成不正确的值,即可能出现重合或断开的情况,就可能导致目标操作系统崩溃。比如,把上述偏移设置为0,1300,3000。这就是所谓的泪滴攻击。

1.12 带源路由选项的IP报文

为了实现一些附加功能,IP协议规范在IP报头中增加了选项字段,这个字段可以有选择的携带一些数据,以指明中间设备(路由器)或最终目标计算机对这些IP报文进行额外的处理。

源路由选项便是其中一个,从名字中就可以看出,源路由选项的目的,是指导中间设备(路由器)如何转发该数据报文的,即明确指明了报文的传输路径。比如,让一个IP报文明确的经过三台路由器R1,R2,R3,则可以在源路由选项中明确指明这三个路由器的接口地址,这样不论三台路由器上的路由表如何,这个IP报文就会依次经过R1,R2,R3。而且这些带源路由选项的IP报文在传输的过程中,其源地址不断改变,目标地址也不断改变,因此,通过合适的设置源路由选项,攻击者便可以伪造一些合法的IP地址,而蒙混进入网络。

1.13 带记录路由选项的IP报文

记录路由选项也是一个IP选项,携带了该选项的IP报文,每经过一台路由器,该路由器便把自己的接口地址填在选项字段里面。这样这些报文在到达目的地的时候,选项数据里面便记录了该报文经过的整个路径。

通过这样的报文可以很容易的判断该报文经过的路径,从而使攻击者可以很容易的寻找其中的攻击弱点。

1.14 未知协议字段的IP报文

在IP报文头中,有一个协议字段,这个字段指明了该IP报文承载了何种协议,比如,如果该字段值为1,则表明该IP报文承载了ICMP报文,如果为6,则是TCP,等等。目前情况下,已经分配的该字段的值都是小于100的,因此,一个带大于100的协议字段的IP报文,可能就是不合法的,这样的报文可能对一些计算机操作系统的协议栈进行破坏。

1.15 IP地址欺骗

一般情况下,路由器在转发报文的时候,只根据报文的目的地址查路由表,而不管报文的源地址是什么,因此,这样就可能面临一种危险:如果一个攻击者向一台目标计算机发出一个报文,而把报文的源地址填写为第三方的一个IP地址,这样这个报文在到达目标计算机后,目标计算机便可能向毫无知觉的第三方计算机回应。这便是所谓的IP地址欺骗攻击。

比较著名的SQL Server蠕虫病毒,就是采用了这种原理。该病毒(可以理解为一个攻击者)向一台运行SQL Server解析服务的服务器发送一个解析服务的UDP报文,该报文的源地址填写为另外一台运行SQL Server解析程序(SQL Server 2000以后版本)的服务器,这样由于SQL Server 解析服务的一个漏洞,就可能使得该UDP报文在这两台服务器之间往复,最终导致服务器或网络瘫痪。

 1.17 Land攻击

LAND攻击利用了TCP连接建立的三次握手过程,通过向一个目标计算机发送一个TCP SYN报文(连接建立请求报文)而完成对目标计算机的攻击。与正常的TCP SYN报文不同的是,LAND攻击报文的源IP地址和目的IP地址是相同的,都是目标计算机的IP地址。这样目标计算机接收到这个SYN报文后,就会向该报文的源地址发送一个ACK报文,并建立一个TCP连接控制结构(TCB),而该报文的源地址就是自己,因此,这个ACK报文就发给了自己。这样如果攻击者发送了足够多的SYN报文,则目标计算机的TCB可能会耗尽,最终不能正常服务。这也是一种DOS攻击。

1.19 Smurf攻击

ICMP ECHO请求包用来对网络进行诊断,当一台计算机接收到这样一个报文后,会向报文的源地址回应一个ICMP ECHO REPLY。一般情况下,计算机是不检查该ECHO请求的源地址的,因此,如果一个恶意的攻击者把ECHO的源地址设置为一个广播地址,这样计算机在恢复REPLY的时候,就会以广播地址为目的地址,这样本地网络上所有的计算机都必须处理这些广播报文。如果攻击者发送的ECHO 请求报文足够多,产生的REPLY广播报文就可能把整个网络淹没。这就是所谓的smurf攻击。

除了把ECHO报文的源地址设置为广播地址外,攻击者还可能把源地址设置为一个子网广播地址,这样,该子网所在的计算机就可能受影响。

 1.20 虚拟终端(VTY)耗尽攻击

这是一种针对网络设备的攻击,比如路由器,交换机等。这些网络设备为了便于远程管理,一般设置了一些TELNET用户界面,即用户可以通过TELNET到该设备上,对这些设备进行管理。

一般情况下,这些设备的TELNET用户界面个数是有限制的,比如,5个或10个等。这样,如果一个攻击者同时同一台网络设备建立了5个或10个TELNET连接,这些设备的远程管理界面便被占尽,这样合法用户如果再对这些设备进行远程管理,则会因为TELNET连接资源被占用而失败。

1.21 路由协议攻击

网络设备之间为了交换路由信息,常常运行一些动态的路由协议,这些路由协议可以完成诸如路由表的建立,路由信息的分发等功能。常见的路由协议有RIP,OSPF,IS-IS,BGP等。这些路由协议在方便路由信息管理和传递的同时,也存在一些缺陷,如果攻击者利用了路由协议的这些权限,对网络进行攻击,可能造成网络设备路由表紊乱(这足可以导致网络中断),网络设备资源大量消耗,甚至导致网络设备瘫痪。

下面列举一些常见路由协议的攻击方式及原理:

1.21.1 针对RIP协议的攻击

RIP,即路由信息协议,是通过周期性(一般情况下为30S)的路由更新报文来维护路由表的,一台运行RIP路由协议的路由器,如果从一个接口上接收到了一个路由更新报文,它就会分析其中包含的路由信息,并与自己的路由表作出比较,如果该路由器认为这些路由信息比自己所掌握的要有效,它便把这些路由信息引入自己的路由表中。

这样如果一个攻击者向一台运行RIP协议的路由器发送了人为构造的带破坏性的路由更新报文,就很容易的把路由器的路由表搞紊乱,从而导致网络中断。

如果运行RIP路由协议的路由器启用了路由更新信息的HMAC验证,则可从很大程度上避免这种攻击。

1.21.2 针对OSPF路由协议的攻击

OSPF,即开放最短路径优先,是一种应用广泛的链路状态路由协议。该路由协议基于链路状态算法,具有收敛速度快,平稳,杜绝环路等优点,十分适合大型的计算机网络使用。OSPF路由协议通过建立邻接关系,来交换路由器的本地链路信息,然后形成一个整网的链路状态数据库,针对该数据库,路由器就可以很容易的计算出路由表。

可以看出,如果一个攻击者冒充一台合法路由器与网络中的一台路由器建立邻接关系,并向攻击路由器输入大量的链路状态广播(LSA,组成链路状态数据库的数据单元),就会引导路由器形成错误的网络拓扑结构,从而导致整个网络的路由表紊乱,导致整个网络瘫痪。

当前版本的WINDOWS 操作系统(WIN 2K/XP等)都实现了OSPF路由协议功能,因此一个攻击者可以很容易的利用这些操作系统自带的路由功能模块进行攻击。

跟RIP类似,如果OSPF启用了报文验证功能(HMAC验证),则可以从很大程度上避免这种攻击。

1.21.3 针对IS-IS路由协议的攻击

IS-IS路由协议,即中间系统到中间系统,是ISO提出来对ISO的CLNS网络服务进行路由的一种协议,这种协议也是基于链路状态的,原理与OSPF类似。IS-IS路由协议经过扩展,可以运行在IP网络中,对IP报文进行选路。这种路由协议也是通过建立邻居关系,收集路由器本地链路状态的手段来完成链路状态数据库同步的。该协议的邻居关系建立比OSPF简单,而且也省略了OSPF特有的一些特性,使该协议简单明了,伸缩性更强。

对该协议的攻击与OSPF类似,通过一种模拟软件与运行该协议的路由器建立邻居关系,然后传颂给攻击路由器大量的链路状态数据单元(LSP),可以导致整个网络路由器的链路状态数据库不一致(因为整个网络中所有路由器的链路状态数据库都需要同步到相同的状态),从而导致路由表与实际情况不符,致使网络中断。

与OSPF类似,如果运行该路由协议的路由器启用了IS-IS协议单元(PDU)HMAC验证功能,则可以从很大程度上避免这种攻击。

1.22 针对设备转发表的攻击

为了合理有限的转发数据,网络设备上一般都建立一些寄存器表项,比如MAC地址表,ARP表,路由表,快速转发表,以及一些基于更多报文头字段的表格,比如多层交换表,流项目表等。这些表结构都存储在设备本地的内存中,或者芯片的片上内存中,数量有限。如果一个攻击者通过发送合适的数据报,促使设备建立大量的此类表格,就会使设备的存储结构消耗尽,从而不能正常的转发数据或崩溃。

下面针对几种常见的表项,介绍其攻击原理:

1.22.1 针对MAC地址表的攻击

MAC地址表一般存在于以太网交换机上,以太网通过分析接收到的数据幀的目的MAC地址,来查本地的MAC地址表,然后作出合适的转发决定。

这些MAC地址表一般是通过学习获取的,交换机在接收到一个数据幀后,有一个学习的过程,该过程是这样的:

a) 提取数据幀的源MAC地址和接收到该数据幀的端口号;

b) 查MAC地址表,看该MAC地址是否存在,以及对应的端口是否符合;

c) 如果该MAC地址在本地MAC地址表中不存在,则创建一个MAC地址表项;

d) 如果存在,但对应的出端口跟接收到该数据幀的端口不符,则更新该表;

e) 如果存在,且端口符合,则进行下一步处理。

分析这个过程可以看出,如果一个攻击者向一台交换机发送大量源MAC地址不同的数据幀,则该交换机就可能把自己本地的MAC地址表学满。一旦MAC地址表溢出,则交换机就不能继续学习正确的MAC表项,结果是可能产生大量的网络冗余数据,甚至可能使交换机崩溃。

而构造一些源MAC地址不同的数据幀,是非常容易的事情。

 1.22.2 针对ARP表的攻击

ARP表是IP地址和MAC地址的映射关系表,任何实现了IP协议栈的设备,一般情况下都通过该表维护IP地址和MAC地址的对应关系,这是为了避免ARP解析而造成的广播数据报文对网络造成冲击。ARP表的建立一般情况下是通过二个途径:

1、主动解析,如果一台计算机想与另外一台不知道MAC地址的计算机通信,则该计算机主动发ARP请求,通过ARP协议建立(前提是这两台计算机位于同一个IP子网上);

2、被动请求,如果一台计算机接收到了一台计算机的ARP请求,则首先在本地建立请求计算机的IP地址和MAC地址的对应表。

因此,如果一个攻击者通过变换不同的IP地址和MAC地址,向同一台设备,比如三层交换机发送大量的ARP请求,则被攻击设备可能会因为ARP缓存溢出而崩溃。

针对ARP表项,还有一个可能的攻击就是误导计算机建立正确的ARP表。根据ARP协议,如果一台计算机接收到了一个ARP请求报文,在满足下列两个条件的情况下,该计算机会用ARP请求报文中的源IP地址和源MAC地址更新自己的ARP缓存:

1、 如果发起该ARP请求的IP地址在自己本地的ARP缓存中;

2、 请求的目标IP地址不是自己的。

可以举一个例子说明这个过程,假设有三台计算机A,B,C,其中B已经正确建立了A和C计算机的ARP表项。假设A是攻击者,此时,A发出一个ARP请求报文,该请求报文这样构造:

1、 源IP地址是C的IP地址,源MAC地址是A的MAC地址;

2、 请求的目标IP地址是A的IP地址。

这样计算机B在收到这个ARP请求报文后(ARP请求是广播报文,网络上所有设备都能收到),发现B的ARP表项已经在自己的缓存中,但MAC地址与收到的请求的源MAC地址不符,于是根据ARP协议,使用ARP请求的源MAC地址(即A的MAC地址)更新自己的ARP表。

这样B的ARP混存中就存在这样的错误ARP表项:C的IP地址跟A的MAC地址对应。这样的结果是,B发给C的数据都被计算机A接收到。

1.22.3 针对流项目表的攻击

有的网络设备为了加快转发效率,建立了所谓的流缓存。所谓流,可以理解为一台计算机的一个进程到另外一台计算机的一个进程之间的数据流。如果表现在TCP/IP协议上,则是由(源IP地址,目的IP地址,协议号,源端口号,目的端口号)五元组共同确定的所有数据报文。

一个流缓存表一般由该五元组为索引,每当设备接收到一个IP报文后,会首先分析IP报头,把对应的五元组数据提取出来,进行一个HASH运算,然后根据运算结果查询流缓存,如果查找成功,则根据查找的结果进行处理,如果查找失败,则新建一个流缓存项,查路由表,根据路由表查询结果填完整这个流缓存,然后对数据报文进行转发(具体转发是在流项目创建前还是创建后并不重要)。

可以看出,如果一个攻击者发出大量的源IP地址或者目的IP地址变化的数据报文,就可能导致设备创建大量的流项目,因为不同的源IP地址和不同的目标IP地址对应不同的流。这样可能导致流缓存溢出。

泛洪(flooding) 交换机和网桥使用的一种数据流传递技术,将某个接口收到的数据流从除该接口之外的所有接口发送出去。
  SYN泛洪攻击。SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。我们可以利用路由器的TCP拦截功能,使网络上的主机受到保护(以Cisco路由器为例)。
  DHCP报文泛洪攻击
  DHCP报文泛洪攻击是指:恶意用户利用工具伪造大量DHCP报文发送到服务器,一方面恶意耗尽了IP资源,使得合法用户无法获得IP资源;另一方面,如果交换机上开启了DHCP Snooping功能,会将接收到的DHCP报文上送到CPU。因此大量的DHCP报文攻击设备会使DHCP服务器高负荷运行,甚至会导致设备瘫痪。
  ARP报文泛洪攻击
  ARP报文泛洪类似DHCP泛洪,同样是恶意用户发出大量的ARP报文,造成L3设备的ARP表项溢出,影响正常用户的转发。

STP生成树协议的作用

【网桥】早期的网桥就是用来连接两个由集线器构成的网络,因此说网桥可以隔离冲突域。可以将网桥看成只有两个端口的交换机,同样的,若交换机使用两个端口连接着两个网络,则也可以说这个交换机的两个端口实现了一个网桥。所以常将网桥与交换机混为一谈

【STP】它通过选择一条主干链路,将其它冗余链路置为阻塞状态,从而避免数据包在网络中产生环路。实际应用中为了使链路更加稳定,用户总是使用多条路径来实现链路以达到的目的,或网络相当复杂时就会产生一个或数个环路。环路的产生易导致广播风暴、多帧复制和MAC地址表抖动等副作用,为了解决这些问题就产生了“生成树协议”。生成树将复杂的网络拓扑看成是一棵树,选取其中一个交换机作为树根称为“根桥”,与之相连的交换机选取一个“根端口”用于接收来自根方向的数据,选取一个“指定端口”用于发送来自根方向的数据,并将其他端口阻塞。实现了数据从根出发后可到达网络中所有设备但不会出现环路和重复接收的情况,同样,数据从任意设备出发到达另一设备的路径都是唯一的。

STP适用于较小规模的网络,但它的收敛速度较慢,对网络中的拓扑变化反应不够迅速

为了改善STP的收敛速度和性能,RSTP(快速生成树协议)被引入。RSTP是STP的改进版本,它在保持STP基本原理的同时,引入了一些新的机制来加快网络的收敛速度。

RSTP的主要改进包括:

  • 端口状态的改变:RSTP将端口状态划分为三种:指定(designated)、根(root)和备份(alternate),相比STP的端口状态,RSTP减少了状态切换的次数,从而加快了收敛速度。
  • 快速收敛:RSTP通过减少BPDU的发送间隔和超时时间来加快收敛速度。当网络拓扑发生变化时,RSTP可以更快地重新计算生成树。
  • 持续监听:RSTP通过定期发送BPDU消息来持续监听网络状态。当RSTP设备在一定时间内没有收到BPDU消息时,它会假设网络中的链路出现故障,并快速重新计算生成树,以确保网络的稳定性。

RSTP相对于STP来说,具有更快的收敛速度和更好的性能。它适用于中等规模的网络,并能够更好地适应网络拓扑的变化。RSTP与STP协议兼容,可以在STP和RSTP混合的网络环境中工作,如果某个树结构中,两台交换机用RSTP协议,第三台使用STP协议,那么两台交换机与第三台连接的端口会向下兼容使用STP工作模式,但是两台交换机之间仍然采用RSTP协议进行通信。

MSTP(Multiple Spanning Tree Protocol)

在一些大规模的网络中,需要同时支持多个VLAN(虚拟局域网),而STP和RSTP只能为整个网络构建一个生成树。为了解决这个问题,MSTP(多生成树协议)被引入。MSTP允许在一个网络中为每个VLAN构建独立的生成树,从而提供更好的灵活性和可伸缩性。

  1. 多生成树实例:MSTP允许在一个网络中创建多个生成树实例,每个实例负责不同的VLAN。
  2. 负载均衡:通过将不同的VLAN分配到不同的生成树实例,MSTP可以实现链路资源的负载均衡。
  3. 向后兼容RSTP和STP:MSTP与RSTP和STP协议兼容,可以在混合的网络环境中工作。

下表对比了STP、RSTP和MSTP在功能方面的特点:

功能STPRSTPMSTP
环路消除
快速收敛
支持多VLAN
拓扑可扩展适用于小规模网络适用于中等规模网络适用于大规模网络和多VLAN环境

在华为设备上配置STP,可以使用以下命令:

<Huawei> system-view
[Huawei] stp mode stp
[Huawei] stp enable

为了优化拓扑结构,可以通过以下命令调整STP的优先级:

[Huawei] stp priority <priority>

【环路的危害】环路主要导致三个问题,广播风暴、多帧复制和MAC地址表抖动。

    广播风暴:简单的讲是指当广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪,这就发生了“广播风暴”。假设AB两点成环,位于同一交换机。A发出未知地址的广播包,B接收到后由于交换机中无此MAC,重新发起一个广播,此广播包又到达A,由于目标无法从MAC表中匹配,A会再次发一起个广播,这样不停循环下去,就产生了广播风暴。

    多帧复制:单播的数据帧可能被多次复制传送到目的站点。很多协议都只需要每次传输一个拷贝。多帧复制会造成目的站点收到某个数据帧的多个副本,不但浪费了目的主机的资源,还会导致上层协议在处理这些数据帧时无法选择,严重时还可能导致不可恢复的错误。

    MAC地址表抖动:也就是MAC地址表不稳定,这是由于相同帧的拷贝在交换机的不同端口上被接收引起的。如果交换机将资源都消耗在复制不稳定的MAC地址表上,那么数据转发的功能就可能被消弱了

1、BPDU报文格式

    交换机之间使用BPDU(Bridge Protocol Data Unit网桥协议数据单元)来交换STP(生成树协议)信息,BPDU报文分为配置BPDU和TCN BPDU两类分别对应STP的两种应用场景(STP工作在数据链路层)。

帧头Data(BPDU报文)FCS

配置BPDU(Configuration BPDU)报文:用来进行生成树计算和维护生成树拓扑。

Protocol IDProtocol Version IDBPDU TypeFlagsRoot IDRoot Path Cost
2字节1字节1字节1字节8字节4字节
Bridge IDPort IDMessage AgeMax AgeHello TimeFonward Delay
8字节2字节2字节2字节2字节2字节

TCN BPDU(Topology Change Notification BPDU)报文:当拓扑结构发生变化时用来通知相关设备的报文。

Protocol IDProtocol Version IDBPDU Type
2字节1字节1字节

Protocol ID:协议类型,固定为0x0000,表示生成树协议。

Protocol Version ID:协议版本号,生成树目前有三个版本,0x00代表STP。

BPDU Type:BPDU类型,这个值用来区分该报文是配置BPDU还是TCN BPDU。

Flags:BPDU标志位,由8位组成,其中最低位(0位)为TC(Topology Change,拓扑改变)标志位,最高位(7位)为TCA(Topology Change Acknowledge,拓扑改变确认)标志位,其他6位保留不使用。

Root ID:根桥ID,标识已被选为根桥的设备标识,前2字节代表优先级,后6字节为其MAC地址。

Root Path Cost:根桥路径开销,到根桥的路径开销。

Bridge ID:发送网络桥ID,发送该BPDU的网桥信息,前2字节代表优先级,后6字节为其MAC地址。

Port ID:端口ID,发送该BPDU的网桥端口ID,包含该端口的编号和优先级。

Message Age:BPDU在网络中传播的生存期,代表该BPDU报文在网络中已传播了多久。

Max Age:超时时间,若超过该时间还没有收到根桥发出的BPDU数据包,则交换机将向其他所有的交换机发出BPDU数据包,重新计算生成树。

Hello Time:根网桥连续发送BPDU的时间间隔。

Fonward Delay:传输时延,交换机端口状态迁移所用时间。当网络发生故障导致生成树重新计算时,重新计算得到的新配置消息无法立刻传遍网络,如果端口状态立刻迁移的话可能会产生暂时性的环路。所以生成树协议采用状态迁移机制,保证新的配置消息已传遍整个网络。

2、交换机端口状态

    运行生成树协议的交换机在正常工作期间其端口总是处于转发或阻塞状态,当设备识别到网络拓扑结构发生变化时,交换机自动进行状态转换,期间端口暂时处于监听和学习状态。

    Listening:监听,交换机启动、接入网络或识别到网络拓扑结构发生变化时所有端口都切换到监听状态,此状态下不会接收和转发数据,但可以接收和发送BPDU。监听状态下各设备和端口将确定自己的角色,选举出根桥、根端口、指定桥和指定端口。随后根据选举结果将部分端口转为Learning状态,部分端口转为Blocking状态。

    Learning:学习,选举完成后交换机参与工作端口的将转为学习状态,主要是学习并完善MAC地址表。该状态下不会接收和转发数据,但可以接收和发送BPDU。

    Forwarding:转发,MAC地址表学习完成后交换机就可以开始工作,参与工作的端口就进入转发状态。该状态下可以接收和转发数据、学习MAC地址、接收和发送BPDU。

    Blocking:阻塞,选举完成后交换机部分端口进入阻塞状态,并在工作期间保持该状态。该状态下不能接收或转发数据,不能发送BPDU,只能接收BPDU。

3、STP的工作过程

    选举根桥:开启STP协议的交换机启动后默认自己为根桥,此时所有端口进入监听状态并向端口上相连的其他交换机发送配置BPDU报文。该报文中根桥ID就是发送设备自己的ID,交换机发出BPDU的同时也会接收到来自其他设备的BPDU,它会将这两个BPDU报文进行对比。先比较根桥ID中的优先级,数值越小则优先级越高。该优先级可由用户设置,若用户没有设置则所有交换机的默认优先级都是一样的,此时就比较根桥ID中的MAC地址,也是数值越小的优先级越高。若设备发现自己收到的BPDU中根桥ID的优先级较自己当前发送的BPDU高,则设备开始转发优先级较高的BPDU。通过这种方式整个网络很快地就只会发送根桥ID优先级最高的BPDU,同时大家也都知道了那台设备的BPDU优先级最高,并认同该设备为根桥。

技术分享

    在上图所示的网络中,由于交换机的默认优先级一致,所以比较其MAC地址得到SW1的优先级最高,故应选取SW1为根桥。

    选举根端口:选举出根桥后,网络中所有设备都只会转发根桥发出的BPDU。根桥发出的BPDU中有一个“根路径开销”字段,BPDU从某端口进入交换机时该字段会累加该端口的“开销值”,于是交换机向其他设备转发根桥的BPDU时,根路径开销字段会不断累加各交换机接收端口的开销值,此值可由用户设置,若不设置则默认都是一样的(一般设置时会将链路两端的开销值设置为一样)。网络中某交换机可能从多个端口都收到来自根桥的BPDU,他比较所有的BPDU中路径开销字段的值,并认为路径开销字段值最小的BPDU为最佳,接收到该BPDU的端口为根端口。若多个端口收到的BPDU中路径开销字段值都一样,交换机就将端口ID最小的那个指定为根端口,若端口ID也一样则MAC地址值较小的为根端口。根端口在同一台交换机上不同端口中选出,其意义在于若根桥发送一段数据到该设备,则通过根端口进来的路径是最佳的。根桥没有根端口。

技术分享

    上图所示的网络中,以SW1为根桥,交换机的各端口收到来自根桥的BPDU的路径开销计算和根端口选举如下表所示:

交换机端口路径开销根端口
SW2sw2-019sw2-0
sw2-119+4+19 = 42
SW3sw3-019+19 = 38sw3-1
sw3-119+4 = 23
SW4sw4-019sw4-0
sw4-119+19+4 = 42

    选举指定端口:选举出根桥后,交换机SW2和SW3会在各自端口收到不同方向发来的BPDU,其中sw2-1会收到sw3-0转发的BPDU,而sw3-0也会收到sw2-1从另一方向发来的BPDU。交换机SW2和SW3各自收到后就会对这两个BPDU进行比较,根路径开销字段值较小的那个为优,若值一致则编号较小的那个为优,若编号也一致则MAC地址值较小的为优,发送该BPDU的端口就选为指定端口。指定端口从两台不同设备的两个互连端口中选出,其意义在于从两台互相发送BPDU的设备中选出最优的发送方向。

技术分享

    上图所示的网络中,交换机各端口发出的BPDU的路径开销计算和指定端口选举如下表所示,由于所有BPDU都是从根桥即SW1发出的,所以根桥端口发出的BPDU路径开销为0:

交换机端口路径开销指定端口
SW1 – SW2sw1-00sw1-0
sw2-019+4+19 = 42
SW1 – SW4sw1-10sw1-1
sw4-019+19+4 = 42
SW2 – SW3sw2-119sw2-1
sw3-019+4 = 23
SW3 – SW4sw3-119+19 = 38sw4-1
sw4-119

    阻塞端口:选举出指定端口和根端口后,各交换机就有了最佳接收端口和最佳发送端口,此时将非指定端口、非根端口阻塞,则整个网络的环路消失,同时根桥到各交换机的路径为最优。

BPDU报文攻击的原理

在多个网桥(交换机也是网桥的一种)互联时,当一台网桥接入网络、撤出网络(可能因为损坏或断电)时,生成树需要重新计算、重新生成,而在重新生成的过程中,整个网络时不转发数据的,按照最基本的的要求,这个时间可能长达40秒,也就是说这段时间内网络是瘫痪的,当然各个厂家对此都有一定的改进,时间会缩短,起码正常工作的部分受影响会大大减小。

BPDU报文攻击时会发送BPDU报文,通知网络内的交换机,生成树发生变化,需要重新计算,这样就会造成网络暂时中断,如果这种现象出现很频繁,那么整个网络也就不可用了。

原理:利用rstp中flages位中的Proposal与Agreement来进行协商,从而快速从 discarding 转成 forwarding而不用等待30秒超时。

RSTP端口状态:

discarding

listening

learning

bpduguard安全特性

  • 作用:防止黑客DOS攻击(短时间内发送大量的BPDU或ARP请求),一般应用于portfast接口
  • DOS攻击(简单理解):此时SW1为根桥;PC1为黑客,短时间内它向SW3发送大量BPDU报文且优先级小于32768,这就导致生成树重新收敛,PC1成为根桥;PC1成为根桥以后,它会继续向SW3发送BPDU报文且优先级大于32768,生成树又一次重新收敛,SW1成为根桥;就这样生成树一直处于收敛状态,而生成树在收敛过程中不转发用户数据帧,导致网络瘫痪
  • SW3(config)#int f0/0
    SW3(config-if)#spanning-tree bpduguard enable
    SW3(config-if)#exit
    接口下配置bpduguard,此接口(如上面0/0接口)一旦收到BPDU报文会自动把此接口置为Err-disable状态,Err-disable相当于接口down状态, 如果想把此接口重新启用需要进入这个接口先执行shutdown再执行no shutdown;此命令一般用在连接PC或者服务器的接口上面启用
  • sw3(config)#spanning-tree portfast bpduguard default   //全局模式 —– 在所有Portfast接口启用bpduguard特性

RSTP对STP保证机制

  1.根端口保护:如果黑客用一台优先级比较高的交换机连接到树里,那么会导致整个网络的流量都被黑客

所控制,为了防止交换机的端口角色发生改变,可以在交换机里配置根保护,配置了根保护的交换机

的某个端口如果收到比现有根桥更忧的BPDU会主动把端口状态置为 discading 直到黑客的交换机撤离

   2.边缘端口保护:如果对交换机的某个端口设置了边缘端口,而这个边缘端口却收到了BPDU会导致

边缘端口的功能失效,甚至从边缘端口发来一些TC报文来刷新网络交换机的MAC地址攻击网络,

为了防止这一情况,可以对边缘端口做保护配置,相当于绑定边缘端口。保护后收到BPDU的边缘端口就

会直接置为 err-down (直接关闭,需要管路员手动恢复) 。因此不能再非边缘端口配置此保护

    3.环路保护:如果阻塞端口可以发BPDU 却一直收不到别人的BPDU,这样会导致BPDU超时,从而使得

阻塞状态转变成转发状态,从而造成树结构有转变成环形结构。因此可以在AP端口配置环路保护,配置环路

保护后AP端口如果持续收不到 BPDU 就会认为链路故障单方向故障,从而使端口状态保持 discarding

交换高级特性 —— DHCP snooping(DHCP欺骗泛红攻击

一、DHCP欺骗泛洪攻击
(1)钓鱼网站简介:
“钓鱼网站”的页面与真实网站界面基本一致,欺骗消费者或者窃取访问者提交的账号和密码信息。钓鱼网站一般只有一个或几个页面,和真实网站差别细微 。通常伪装成银行及电子商务、窃取用户提交的银行账号、密码等私密信息的网站。
(2)DHCP中继技术简介:
一般情况下,DHCP Server和DCHP Client都必须处于同一个网络中,这是因为DHCP的报文有些是以广播的形式发送,如果不位于同一个网络,则这些广播的报文就无法跨越三层路由设备传输。而在有些情况下,DHCP服务必须跨越不同的网络,这时,我们就可以配置DHCP中继服务。DHCP中继,其实就是在与DHCP Server不同而又需要申请DHCP服务的网络内,设置一个中继器,中继器在该网络中代替DHCP Server服务器接收DHCP Client的请求,并将DHCP Client发给DHCP Server的DCHP报文,以单播的形式发送给DHCP Server。DHCP Server在收到由DHCP发送来的DHCP 报文后,同样会把响应的DHCP报文发送给DHCP 中继。这样,DHCP其实是充当了一个中间人的作用,起到了在不同的网络中运行DHCP的目的。
(2-1)核心交换机DHCP中继配置命令:
interface Vlan 20
ip address 192.168.20.254 255.255.255.0
ip helper-address 192.168.10.1//将广播包变成单播单播包发给DHCP server
exit
(3)dhcp欺骗详解:

正常情况下:PC1通过DHCP Server获取到IP、网关、DNS,当PC1访问www.123.com的时候会首先会把域名朝着DNS发送,然后DNS查询公网IP地址,把公网IP地址发给pc1,然后pc1会朝着100.1.1.1发起页面请求,正常访问Web服务器。
黑客恶意行为目的:当PC1访问外网正常的服务器时,使其访问这个钓鱼网站窃取他人信息。
第一步:pc2作为恶意攻击者会耗尽DHCP Sever的地址池,让DHCP Server不能给pc1分配地址池
首先,DHCP Server 是根据不同的mac地址分配IP地址,基于这一特性,pc2作为恶意攻击者,会创建一个discover报文:

discover报文到达核心交换机以后,经过核心交换机的中继路由,提交给DHCP Server服务器,然后服务器根据这个网关地址从自己众多地址池里,找到对应网段的地址池,给pc2分配IP地址。
每个mac分配一个ip,然而核心交换机关心的是处于discover报文里的mac地址。所以恶意攻击者可以伪造大量的discover报文在极短的时间内耗尽地址池(随机产生discover报文中的mac地址)
第二步:pc2充当DNS和DHCP 欺骗pc1
当全部耗尽以后,pc2可以充当DHCP和DNS(一般是在Linux系统里开启)
所以当pc1再次发送discover报文的话,pc2肯定可以收到,所以现在由pc2给pc1分配
IP:192.168.20.1 网关:192.168.20.4 DNS:192.168.20.4 ,此时pc1发送的,上网流量、DNS请求都发给了pc2(pc2作为DNS会做一个映射:www.123.com对应公网IP地址为200.1.1.1)
所以当pc1访问www.123.com的时候会把域名发给pc2 做一个域名解析,而pc2做出的域名解析结果为200.1.1.1,200.1.1.1对应的是钓鱼网站,所以你在访问www.123.com时,实际访问的是钓鱼网站(你在钓鱼网站上输入的所有用户名、密码……黑客都可以窃取到)
注:当大量产生BPDU报文时,就造成了泛洪攻击

二、防御——DHCP snooping
(1)开启DHCP SNOOPING之后的效果:
3560全局配置:
3560(config)#ip dhcp snooping //全局开启
3560(config)#ipdhcp snooping vlan 100 //VLAN100启用

3550配置:
3550(config)#ipdhcp snooping //全局开启
3550(config)#ipdhcp snooping vlan 100 //VLAN100启用
1、交换机启用DHCP snooping ,所有vlan接口默认为untrust非信任状态,无法接受来自DHCP server的offer报文和ACK报文,除非把此接口置为trust信任接口

sw-3550(config)#int f0/2
sw-3550(config-if)#ip dhcp snooping trust
sw-3550(config-if)#exit
2、检查二层数据帧源MAC地址和discover里面的PC MAC地址是否匹配,如果不匹配则丢弃(但是如果黑客可以设计算法使这两个同步变化,则还可以在接口启用端口安全技术)(DHCP根据discover 里面MAC地址报文分配IP,耗尽地址池主要就是根据discover报文里面的MAC地址)

3、可以在接口下针对DHCP报文进行限速,防御黑客利用DHCP报文进行广播泛洪攻击

针对DHCP报文进行限速:每秒这个接口可以发送DHCP报文10个
sw-3550(config)#int f0/6
sw-3550(config-if)#ipdhcp snooping limit rate 10
sw-3550(config-if)#exit
4、检查从PC收到的DHCP报文,如果PC发送的DHCP报文含有option 82(主要体现pc连接到那台交换机的哪个接口下)的话(违规行为)则丢弃此报文,因为只有交换机采用权限在DHCP报文里面插入option 82选项(交换机还会在discover报文里面插入对应VLAN的gateway ip地址)

5、检查是否有PC替代其他PC恶意退租IP地址(pc2发送恶意退租指令给DHCP server,让server回收pc1 IP地址,所以当DHCP server给其他pc分配IP地址的时候,分配的是pc1的IP,则会形成IP地址冲突,导致不能上网),以及检查从这个接口收到的DHCP报文是否合乎DHCP的报文规矩

6、配置DHCP snooping之后,交换机能够感知到DHCP server给PC分配的IP,于是系统自动一张扩展的CAM(mac)地址表(条件是必须有dhcp server和client及交换机开启dhcp snooping,如果没有dhcp server可以自己写,但是交换机必须开启dhcp snooping)将IP地址和传统的mac地址表及IP地址租期关联起来。当用以其他的高级安全应用;这个IP分配给了那个MAC,这个MAC连接在我的那个接口,这个接口属于那个VLAN,这个IP地址的租期多少时间。

( 扩展mac(CAM)地址表格式:IP — MAC — 接口 — VLAN — 租期)

(2)配置案列

3560全局配置:
3560(config)#ip dhcp snooping //全局开启
3560(config)#ipdhcp snooping vlan 100 //VLAN100启用

3550配置:
3550(config)#ipdhcp snooping //全局开启
3550(config)#ipdhcp snooping vlan 100 //VLAN100启用
观察PC2无法重新获取IP地址 ?

原因是:两台交换启用了DHCP snooping功能,默认启用此功能的交换机所有接口会拒绝接受来自DHCP serve的报文,需要把连接DHCP server的F0/2接口置为trust状态,可以接受offea和ACK报文

sw-3550(config)#int f0/2
sw-3550(config-if)#ip dhcp snooping trust
sw-3550(config-if)#exit
发现打上trust命令,PC2任然无法获取IP地址,为什么?

PC2发出discover报文,在经过3550的时候被插入了option 82选项,带有option82选项的报文传给3560的时候被拒绝接受

解决方案:
1、3550不插入option 82选项
sw-3550(config)#no ip dhcp snooping information option
2、3560允许option82选项从untruste接口进来
3560(config)#ip dhcp snooping information option allow-untrusted
针对DHCP报文进行限速:每秒这个接口可以发送DHCP报文10个

sw-3550(config)#int f0/6
sw-3550(config-if)#ipdhcp snooping limit rate 10
sw-3550(config-if)#exit
手工定义扩展的CAM表(交换机开启必须dhcp snooping):

ip source binding mac地址 VLAN ID IP地址 接口
基于源MAC和源IP地址的过滤

Ip dhcp snooping
Ip dhcp snooping vlan 10
ip source binding 0001.0001.0001 vlan10 192.168.1.101 interface Fa0/7
启用端口安全:

Int f0/7
Switchport port-security(启用端口安全)
Ip verity source port-secuity ————检查源IP
Exit
对从F0/7接口进入的报文,根据源IP地址和源MAC地址进行认证审查,是否满足扩展的CAM表

防御 IP 地址欺骗攻击 ,mac地址欺骗攻击

ARP欺骗攻击(争对PC)防御:

ip dhcp snooping vlan 10
ip arp inspection vlan 10
ip arp inspection limit 15
默认1秒15个包,超过down,

判断ARP广播是否满足扩展的CAM表,满足通过,不满足丢弃


原文链接有图:https://blog.csdn.net/qq_62311779/article/details/126340075

echo命令-Linux简单脚本编写及应用

Echo在windows下的命令的语法很简单。以下是Echo命令的基本语法:

echo string

其中,string是要输出的任意文本。Echo命令可以输出任何纯文本,包括数字、字母、标点符号等。

输出计算机用户名

echo My Name is %username%

输出当前时间

echo The time is %time%

关闭回显,且不显示命令行本身(另存为.bat运行)

@echo off

echo 这是第一行

将输出重定向到文件

echo “Hello World!” > d:\output.txt

如果您想要将输出附加到现有文件的末尾,则可以使用“>>”运算符。

echo “This is a second line!” >> d:\output.txt

echo在liunx下命令类似

命令格式:

echo [参数] [字符串]

常见参数:

-n:不自动换行,输出字符串后不跟随回车符。

-e:允许输出字符串中的转义字符,如“\n”表示换行符、“\t”表示制表符等。还有一些转义符可以用-h查看

-E        明确禁止反斜杠转义

常见用法:

1. 输出字符串:

echo “Hello world”

2. 输出变量值:

name=”Linux”

echo “The operating system is $name”

3. 向文件写入文本:

echo “This is a test” > test.txt

4. 输出多行文本:

echo -e “line1\nline2\nline3”

此处就是用-e参数来使后面的转义字符\n生效了,才会输出多行,

echo -e “line1\nline2\nline3”

[root@server dir]# echo -e 'aaa\bbbb'
aabbb
此处就是用-e参数来使后面的转义字符\b生效了,\b表示退格,也就是向左删除一个字符

还可以设置颜色,命令:echo -e “\e[背景颜色;文字颜色;显示方式m字符串\e[0m” ,也可以\033来代替\e

注意事项:

1. 如果字符串中包含空格或特殊字符,需要使用引号将字符串括起来,以避免被解析为命令参数。

2. 如果需要将命令的执行结果作为字符串输出,在命令前面加上“$”符号即可,如:

echo “The date is $(date)”

下面我们来写一个liunx下的脚本 设定ens33网卡

  • IP:192.168.1.100/24
  • 网关:192.168.1.254
[root@localhost Desktop]# vim fixip.sh ——创建新的文件
 
  1 #!/bin/bash
  2 cd /etc/sysconfig/network-scripts/
  3 echo
  4 echo "DEVICE=ens33" > ifcfg-ens33
  5 echo "TYPE=Ethernet" >> ifcfg-ens33
  6 echo "ONBOOT=yes" >> ifcfg-ens33
  7 echo "BOOTPROTO=static" >> ifcfg-ens33
  8 echo "IPADDR=192.168.1.100" >> ifcfg-ens33
  9 echo "NATMASK=255.255.255.0" >> ifcfg-ens33
 10 echo "GATEWAY=192.168.1.254" >> ifcfg-ens33
 11 ifdown ens33
 12 ifup ens33
 

添加运行权限(+x):

[root@localhost Desktop]# chmod +x fixip.sh

此时ls文件的颜色会由白色变成蓝色

下面来执行命令

[root@localhost Desktop]# ./fixip.sh
./fixip.sh: line 2: cd: etc/sysconfig/network-scripts/: No such file or directory

Device ‘ens33’ successfully disconnected.
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/18)
[root@localhost Desktop]#

此时IP就会设置好,下面再来优化下脚本为交互式脚本,给变量赋值,使其更加人性化

先了解下变量赋值

[root@localhost Desktop]# A="hello" ——为变量A赋值
[root@localhost Desktop]# echo A 
A
[root@localhost Desktop]# echo $A ——通过$A 调出它所表示的值(字符串)
hello
[root@localhost Desktop]# echo "$A world"
hello world
[root@localhost Desktop]# 

再来了解下利用read -p输入

-p参数允许在read命令行中直接指定一个提示如:

read -p “输入网站名:” website

echo “你输入的网站名是 $website”

exit 0

运行并按提示输入 xtaa.cn

结果会是:你输入的网站名是 xtaa.cn

所以上面的配置文件可以优化为:

[root@localhost Desktop]# vim fixip.sh
 
  1 #!/bin/bash
  2 read -p "please input ipddr:" IP
  3 read -p "please input netmask" MASK
  4 read -p "please input gateway:" WAY
  5 cd /etc/sysconfig/network-scripts/
  6 echo
  7 echo "DEVICE=ens33" > ifcfg-ens33
  8 echo "TYPE=Ethernet" >> ifcfg-ens33
  9 echo "ONBOOT=yes" >> ifcfg-ens33
 10 echo "BOOTPROTO=static" >> ifcfg-ens33
 11 echo "IPADDR=$IP" >> ifcfg-ens33
 12 echo "NATMASK=$MASK" >> ifcfg-ens33
 13 echo "GATEWAY=$WAY" >> ifcfg-ens33
 14 ifdown ens33
 15 ifup ens33

下面进一步学习If语句

Linux 中 大于: -gt 小于: -lt 等于: -eq 

————单分支——判断3是否小于5:

[root@localhost Desktop]# vim if.sh
 
  1 #!/bin/bash
  2 if [ 3 -lt 5 ]
  3 then echo "yes"
  4 fi
[root@localhost Desktop]# chmod +x if.sh
[root@localhost Desktop]# ./if.sh
yes

—多分支语句:利用输入变量判断

[root@localhost Desktop]# vim if.sh
 
  1 #!/bin/bash
  2 read -p "please input a num:" NUM
  3 if [ $NUM -lt 5 ]
  4 then echo "lt"
  5 elif [ $NUM -eq 10 ]
  6 then echo "eq" 
  7 else echo "gt"
  8 fi
[root@localhost Desktop]# ./if.sh
please input a num:10
eq
[root@localhost Desktop]# ./if.sh
please input a num:30
gt
[root@localhost Desktop]# ./if.sh
please input a num:5
gt

最后写一个脚本来检测内网主机存活状态(语句:if+for+while)

先来看下ping 操作的修饰:

  • -c 指定其发送几个包
  • -i 发间隔时间
  • -w 等待响应时间
  • &> 文件 将前面的输出结果导入到别的地方(我们要将其输出的结果不显示)

ping -c2 -i0.2 -w2 12.34.56.78 &> /dev/null

好,接下来来ping单个主机

[root@localhost poem]# vim ping.sh ——创建编写文件
  1 #!/bin/bash
  2 if `ping -c2 -i0.2 -w2 192.168.123.124 &> /dev/null`
  3 then echo "yes"
  4 else echo "no"
  5 fi  
[root@localhost poem]# chmod +x ping.sh ——赋权
[root@localhost poem]# ./ping.sh ——执行
no ——输出结果
[root@localhost poem]# 

输出结果为 no ,表示该主机不存在或未开启(未存活)

接下来我想IP由我输入

  1 #!/bin/bash
  2 read -p "please input ipaddr:" IP
  3 if `ping -c2 -i0.2 -w2 $IP &> /dev/null`
  4 then echo "yes"
  5 else echo "no"
  6 fi

接下来我想要扫描整个网段要用到for或者while

  • for 根据循环的次数(取值列表)
  • 循环 while 根据条件循环

for用法为:

for 变量 in 取值列表

do

子语句

done

while用法为:

while 条件

do

子语句

done

下面用for来实现

[root@localhost poem]# vim ping.sh
  1 #!/bin/bash
  2 NET=10.168.1.
  3 for IP in {100..115}
  4 do
  5   if `ping -c2 -i0.2 -w2 $NET$IP &> /dev/null`
  6   then echo -e "$NET$IP is \033[31mup\033[0m" (修改输出颜色)
  7   else echo -e "$NET$IP is \033[32mdown\033[0m" (修改输出颜色)
  8   fi
  9 done

可以用于网络嗅探

用whilt实现

[root@localhost poem]# vim ping.sh
  1 #!/bin/bash
  2 NET=10.168.1.
  3 IP=100
  4 while [ $IP -lt 115 ]
  5 do
  6   let IP++
  7   if `ping -c2 -i0.2 -w2 $NET$IP &> /dev/null`
  8   then echo -e "$NET$IP is \033[31mup\033[0m"
  9   else echo -e "$NET$IP is \033[32mdown\033[0m"
 10   fi
 11 done

电信光猫获取宽带账号密码

进光猫后

找到的密码是星号隐藏的,

需要在浏览器按 F12 进入开发者调试器,对着“密码”框右键选择检查,进行选择 HTML 元素,在开发者调试器内的 HTML 元素内,找到 type=password 代码,双击删除掉 password,或者选择删除 type=password 代码,操作完成就可以看到自己电信光猫的宽带密码了,然后把宽带密码保存下来,电信猫的宽带密码很多都是 32位 小写 MD5 加密的,可以通过MD5解密https://www.cmd5.com获得真正的密码

通过网络唤醒(WOL)实现语音开机-思路

如今大多数电脑、笔记本、NAS、甚至是打印机等设备都支持「网络唤醒」(WOL / Wake On Lan) 功能,直接通过发送网络命令,即可实现远程开机操作,平时自己的电脑做的很隐蔽,每次开机不方便,就利用 OpenWRT 提供的网络唤醒实现手机语音远程开机。

首先把你的电脑在BIOS上设置好网络唤醒(设置时记住mac地址,一般还会有唤醒使用的命令)

使用 SSH 登录到OpenWRT终端,执行以下命令进行安装网络唤醒所需的程序依赖和 luci 界面,提供的 WOL 和 Etherwake 是实现网络唤醒的主要依赖,luci-app-wol 与 luci-i18n-wol-zh-cn 分别为主程序和汉化包

opkg update
opkg install wol etherwake
opkg install luci-app-wol luci-i18n-wol-zh-cn

进入LUCI管理界面找到网络唤醒,在网络唤醒插件处选择网络接口是指设备连接路由的 LAN 口,接着根据 MAC 地址选择要唤醒的设备,选择完成点击“唤醒主机”,成功提示 Sendto worked ! 116

设置好后尝试唤醒没有问题后,再设置手机上语音唤醒

苹果手机 上设置 Siri 语音唤醒,打开快捷指令,新建通过 SSH 运行脚本(SSH连接openwrt),设置快捷指令名称,比如:打开电脑,并将 /usr/bin/etherwake 整句命令复制粘贴到第一行,主机地址设置路由地址,端口默认,填写用户和密码,然后点击右下角的三角形运行测试,正常也会提示:Sendto worked ! 116

唤醒命令:/usr/bin/etherwake -D -i "br-lan" "你设备的MAC地址"
主机地址:路由器地址
端口默认:22
用户默认:root
密码:你路由器的密码,没有设置,去设置一个

现在你可以在手机上语音说上面设置的指令名称“打开电脑”来开机了。

机顶盒到ubuntu-nas

论坛https://bbs.histb.com/官网https://www.ecoo.top/

支持的机顶盒列表https://www.ecoo.top/histb.html

装socket5: 需要自行准备节点!没有正确的节点配置文件是无法联通的。
安装下面的脚本后盒子打开了 Socks5 的代理服务功能, 端口号10808
你在浏览器或者系统自行设置通过盒子的IP192.168.12.106代理 Socks5 上网即可

1234567install-v2ray.sh --version v5.1.0       # 终端输入这句命令自行安装systemctl status v2ray      # 查看运行状态是否正常curl --socks5 127.0.0.1:10808 google.com  # 返回 301 字样则成功install-v2ray.sh --remove   # 终端输入命令即可卸载 v2ray# 节点配置文件在 /usr/local/etc/v2ray/config.json# 注意:需要自行准备节点!没有正确的节点配置文件是无法联通的。

装好系统后里面有alist等

装docker部署OpenWRT-(装上后旁路由实测无法科学上网)

hi3798mv100型号,其它型号自行测试。

  • 设置网络
    把网卡混杂模式打开
  • sudo ip link set 你自己的网卡名称 promisc on
    ifconfig
    ##以下是我的网卡名称,每台设备可能不一样,要注意!!!!
    sudo ip link set eth0 promisc on
    打开后为eth0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
  • 创建 docker 网卡
    IP地址和网关根据自己的情况设置
    docker network create -d macvlan --subnet=192.168.1.67/24 --gateway=192.168.1.1 -o parent=eth0 macnet

-OpenWrt 标准镜像
原项目地址:https://github.com/SuLingGG/OpenWrt-Docker
一般情况下阿里云镜像仓库比较快
armv7
DockerHub———sulinggg/openwrt:rpi1
阿里云镜像仓库—–registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi1

arm8/aarch64
DockerHub———sulinggg/openwrt:armv8
阿里云镜像仓库—–registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv8

x86_64/amd64
DockerHub———sulinggg/openwrt:x86_64
阿里云镜像仓库—–registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64

查看系统架构 uname -a

##以下是hi3798mv100系统架构是armv7

创建并启动docker 镜像
docker run --restart always --name openwrt -d --network macnet --privileged registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv7 /sbin/init
其它系统架构只需更改registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi1

  • 设置Openwrt容器 ip


点击进入bash命令控制台
输入 vim /etc/config/network
其它设置不用改,自行设置config interface ‘lan’下边 option ipaddr为OpenWRT的IP,geteway是主路由IP(网关)
如果报错重启容器再试。

  • 重启网络
    /etc/init.d/network restart

重启网络, 重启完成后便可以通过浏览器访问了

网心云
docker run -d \
–name=wxedge \
–restart=always \
–privileged \
–net=host \
–tmpfs /run \
–tmpfs /tmp \
-v /mnt/sda1:/storage:rw \
onething1/wxedge
1.-v 冒号前半部分改成自己本地路径,该路径重装时保持不变,则节点不变
2.安装完成后,使用IP:18888,登录后管界面,使用网心云APP扫描页面下方的二维码绑定

下面是在海纳斯上面装上tailscale

#停止固件自带的tailscale
systemctl stop tailscaled
#关闭固件自带的tailscale的开机自启
systemctl disable tailscaled
#删除执行文件和服务文件
rm -rf /usr/bin/tailscaled
rm -rf /etc/systemd/system/tailscaled.service
#执行官方的安装脚本
curl -fsSL https://tailscale.com/install.sh | sh
#启动软件并设为自启
systemctl start tailscaled
systemctl enable tailscaled
#启动软件,并在链接中登录账号
tailscale up

另外说下服务器做流量出口节点设置

在服务器上打开forword

 echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

再设置可以做出口节点sudo tailscale up -advertise-exit-node

最后在https://login.tailscale.com/admin/machines的节点最右边编辑路由设置里打开Use as exit node,

其它的节点设置exit node为这个服务器,就可以这个服务器为出口代理来上网了。