DNS域名解析服务描述我们在平时访问网站时，IP地址并不好记忆，一般需要输入一个域名，例如www.baidu.com。而DNS就是负责域名向IP地址转换的系统。注意，浏览器上方的输入框里一般为URL，包含协议头和资源定位，例如https://www.baidu.com，其中https表示协议，www.baidu.com才是域名。我们可以在命令行使用ping命令来查询域名对应的服务器的IP。但需要注意的是，IP地址可能不唯一，这是因为大部分厂商会使用CDN，将域名解析道CDN服务器，CDN服务器会缓存一个源服务器站点的副本，用户请求的时候实际上是从最近的CDN服务器获取的。（这样有利于不同地区的用户实现较低延迟的访问）域名我们还是以百度www.baidu.com为例，com叫做根，根不只com一种，通常com用于商业网站，org表示非盈利组织，net表示网络服务机构等。而baidu.com为顶级域名，类似的还有csdn.net、google.com等。www.baidu.com叫做二级域名，类似的还有img.baidu.com等等。除此之外，还有三级域名account.www.baidu.com（这个域名并不一定能访问只是举例）在二级域名中，有一类特殊的，它们通常以www开始，它是万维网World Wide Web的简称。万维网是一个通过互联网访问的，由许多互相连接的超文本组成的系统。为了表示以浏览器超文本的方式访问，许多网站前面都会带www，用于区分其他服务如FTP等。但是随着互联网发展，越来越多的网站不再尊循这个不成文的规范，www就逐渐淡化了。二级域名在搜索引擎的权重往往不如顶级域名，例如在搜索引擎中查询某个字段，所列出的网页通常是顶级域名靠前。但是www开头是个例外，有些搜索引擎会将其视为顶级域名。域名服务器根域名服务器根服务器接受包含域名的递归解析器的查询，根域名服务器根据该域的扩展名（.com、.net、.org 等），通过将递归解析器定向到顶级域名服务器进行响应。根域名服务器由一家名为 Internet 名称与数字地址分配机构（ICANN）的非营利组织进行监督。顶级域名服务器（TLD）TLD域名服务器维护共享通用域扩展名的所有域名的信息，例如 .com、.net 或 url 中最后一个点之后的任何内容。例如，.com TLD 域名服务器包含以“.com”结尾的每个网站的信息。权限域名服务器权限域名服务器，又叫权威性域名服务器。权威性域名服务器通常是解析器查找 IP 地址过程中的最后一步。权威名称服务器包含特定于其服务域名的信息（例如，google.com）权威性域名服务器包含特定于其所服务的域名的信息（例如 www.google.com）。域名解析记录域名解析记录主要分为以下几种：A记录：用来指定域名对应的IP地址MX记录：可以将域名下的邮件服务指向自己的邮件服务器。假设MX记录地址为111.111.111.111，域名为example.com，则邮件xxx@example.com会经路由发送到111.111.111.111所在的服务器。CNAME记录：别名解析，可为一个域名设置一个或多个别名。NS记录：为某个域名指定DNS解析服务器，也就是这个域名由指定的IP地址的DNS服务器解析。TXT记录：为某个主机名或域名设置说明。域名解析过程我们在网络中访问一台主机是需要网络地址的，我们上面提到过，DNS负责将域名转换成IP地址。注意：如果是浏览器访问网站，现在的浏览器通常会有缓存功能，如果浏览器缓存有这个记录的话就通常不会进行以下过程本机首先会根据系统缓存来解析域名，在Windows下为HOST文件，这个文件记录了部分域名解析，如果文件中存在相应的记录，则直接使用记录中的IP地址，不用向远程服务器查询。如果系统缓存中没有找到记录，则会向本地服务器进行查询。本地服务器通常为局域网内的某个DNS服务器，家庭的话一般为路由器或者路由器指定一个远程的DNS服务器。本地服务器若查询到记录则返回给主机，若未找到则按照以下方式继续查找。当然主机也能自己指定这个DNS服务器，而不是路由器下发。例如在Windows下，右键网络中网络适配器的属性->Internet协议版本4(TCP/IPv4)->配置DNSDNS查询过程分为两种，即递归查询和迭代查询。如果是递归查询，本地服务器会作为客户端继续向根域名服务器请求，根域名服务器又会作为客户端向对应的顶级域名服务器查询，顶级域名服务器作为客户端继续向权限域名服务器查询，权限域名服务器记录经由顶级域名服务器、根域名服务器、本地域名服务器，以此顺序返回给主机。如果是迭代查询，本地域名服务器会请求根域名服务器，根域名服务器会把相关顶级域名服务器的IP地址返回给本地域名服务器，然后本地域名服务器再按照同样的方式请求顶级域名服务器获取权限域名服务器的IP地址，最后权限域名服务器被请求，然后将DNS记录返回给本地域名服务器，经由本地域名服务器将记录发送给主机。由此可见上述查询过程是比较繁琐而去伴随一定性能开销的，为了提高速率，通常主机或者各DNS服务器都会有相应的高速缓存，如果缓存中存在该记录就直接从当前服务器（或主机）缓存中获取。
链路层安全扩展——L2TP协议PPP协议协议概念说到数据链路层的安全协议，我们不得不先提一下PPP协议，后面的PAP、CHAP与L2TP协议都是围绕它展开的。（PPP不是本文重点，很多细节没有提到，到时候会专开一篇文章讲PPP）PPP（Point-to-point Protocol，点到点协议）协议是为同等单元之间传输数据包设计的，主要是用来通过拨号或专线方式建立点对点连接发送数据，使其成为各种主机、网桥和路由器之间简单连接到一种共同的解决方案。点对点网络中，一个数据帧的接收者就是固定的对等端。PPP规定了以下内容：帧格式以及成帧方法用于建立、配置和测试PPP链路的链路控制协议（Link Control Protocol, LCP），以及通信双方可通过LCP包协商一些选项。一组用于建立和配置网络层协议的网络控制协议（Network Control Protocol，NCP）。在PPP链路上可以传输不同网络协议的数据，NCP用于对这些网络协议相关的参数进行配置。但NCP只是一个统称，如果传输的是IP数据，则“NCP”是指IP控制协议（IPCP）。不同类型的NCP充分说明了PPP具有良好的通用性。鉴于IP的通用性，随后都以IPCP为例进行说明。协议封装格式PPP协议的封装格式如下：协议字段分为三种：如果是0xC021，则数据部分是PPP的链路控制数据；如果为0x0021，数据部分就是IP数据报；如果是0x8021，则表示这是网络控制数据。协议流程PPP协议流程如下：在建立PPP链路前，发送方和回应方必须建立一条物理连接。双方首先利用LCP建立PPP链路。用PAP或CHAP验证身份。用IPCP配置IP层参数。通信完成后，利用LCP断开PPP链路。断开物理连接。整个过程包括5个阶段：链路不可用阶段：链路状态的起始点和终止点。链路建立阶段：双方用LCP建立链路。认证阶段：回应方发起身份验证。网络层协议阶段：回应方给发起方分配IP地址（毕竟是对等方式连接的）。链路终止阶段：PPP链路终止。PAP和CHAP认证协议PPP协议有两种认证协议，分别是PAP协议和CHAP协议。PAP协议PAP（Password Authentication Protocol）是基于口令认证的方法，被认证方发送Authenticate-Request报文（类型1），其中包含了身份（通常是账号或者说用户名）和口令信息。若认证通过，认证方返回Authenticate-Ack（类型2），否则返回Authenticate-Nak（类型3）。PAP协议以明文方式传输身份和口令给网络接入服务器（Network Access Server，NAS）。因此安全性较差，容易被第三方窃取用户名和口令。另外，PAP在PPP身份认证过程中，由被认证方发起认证，并且仅在建立链路阶段使用，在数据传输过程中不能用。下面是PAP两次握手的具体过程：CHAP协议基于挑战认证的协议（Challenge-Handshake Authentication Protocol）通过三次握手完成身份认证，我们记认证方为S，其用户名为SU，被认证方为U其用户名为UU，随机数为R，口令为PW，则认证成功的工作过程如下（部分字段没有体现在下文中，详细请参考包格式）：$$ S\to U:0x0001,ID,R,SU \\ U\to S: 0x0002,ID,Hash(PW || R),UU \\ S\to U: 0x0003,ID,Message $$数据包格式如下图所示：Challenge和Response报文的类型编号分别为1和2，Success和Failure报文类型分别为3和4随机数和散列值长度可变，内容在值字段体现。名字字段描述发送方身份信息。消息字段包含描述信息，比如认证失败的原因。CHAP协议相比PAP协议较安全，它由认证方发起挑战，使用Hash函数来避免连接时传输明文，随机数可避免重放攻击，而且不定时重复呼叫用户提供口令来避免第三方冒充。但CHAP也有许多安全隐患：服务器明文存放口令单向认证，不能判断服务器是否假冒重复呼叫周期过长容易被攻击，周期过短计算量增加影响性能L2TP协议了解以上情况后，终于该本文主角登场了！概念第二层隧道协议（Layer 2 Tunnel Protocol, L2TP）是PPTP协议与Cisco L2F协议联合版本，有一部分采用PPTP，但可以在多种网络传输，突破了PPTP只能在IP网络上的局限性。我们来看下L2TP相关术语：LAC：L2TP接入控制器。作为L2TP隧道端点，位于一个LNS和一个远程系统之间，并在两者之间发数据包。从LAC发往LNS的数据包需要用L2TP协议进行隧道传输，从LAC到远程系统之间的连接或是本地的或是一个PPP连接。LNS：L2TP网络服务器。一次PPP会话的逻辑端结点，能处理PPP协议和L2TP协议分组。AVP：属性值对。用于构造PPTP的控制消息。控制连接：一个控制连接是LAC和LNS之间的一条连接，用以建立、维护和关闭L2TP会话和控制连接本身隧道：隧道存在于一个<LAC,LNS>对之间。隧道包括一个控制连接和零个或多个L2TP会话。隧道在LAC和LNS之间传输被封装的PPP数据包和控制消息。一条隧道对应一个控制连接，并可承载多个会话。LAC和LNS通过协商建立控制连接后，意味着隧道建立成功，随后即可承载会话。LAC每收到一个来自远程系统的呼叫，就为该呼叫建立一个会话。实现模式L2TP有两种实现模式，分别是强制模式和自愿模式。强制模式强制模式如上图中的1用户所示。提供L2TP服务的网络访问服务器作为LAC。对用户透明，只需向LAC拨号建立PPP连接，由LAC建立一条通向目的LNS的隧道。远程系统只需加载TCP/IP协议及普通的远程拨号软件即可。可同时建立多条隧道，与多个公司同时通信。缺点是隧道的建立依赖于支持L2TP协议的服务者强制模式下，考虑远程用户对公司总部内联网进行访问的情况，其建立L2TP会话的过程主要包括建立控制连接和建立会话：远程用户通过PSTN/ISDN网，向LAC发起PPP请求。LAC接受此连接，建立远程用户到LAC的PPP连接。在建立PPP连接的过程中，远程用户与LAC之间交换了LCP配置信息，并可能实现了如CHAP身份认证信息的交换。认证信息交换的过程是LAC向远程用户进行CHAP呼叫，远程用户对此呼叫进行应答。ISP的LAC根据CHAP中的应答信息，确定此用户实现直接的Internet访问控制还是虚拟的拨号访问服务。如果需要进行虚拟拨号访问，则确定用户访问的目的地，即目的LNS如果LAC与该LNS之间没有建立隧道，则由LAC向LNS发起建立隧道的请求，并为该隧道分配隧道号。LAC与LNS之间的隧道建立完成后，在隧道中为该用户的呼叫分配ID。之后LAC向LNS发出入站呼叫请求。该请求中可能包括LAC对远程用户收集的认证信息以及其他配置信息。如果LNS接受此入站呼叫，则LNS为此呼叫产生一个虚拟接口，该虚拟接口就是L2TP隧道的终点，同样，在LAC上也有一个虚拟接口。此时，LAC和LNS之间的会话已经建立。远程用户发来的PPP分组成帧到达LAC后，LAC上的L2TP虚拟接口剥去帧的同步序列位等，将余下的数据部分用L2TP进行封装，发送至LNS后，L2TP头被剥去，剩余分组将和本地分组一样被送到相应的接口进行处理。当用户想断开链接时，可以向LNS发送终止请求分组，请求断开PPP连接。该分组同其他分组一样，封装在L2TP隧道中传输给LNS。LNS在收到该分组后，发送终止确认分组以终止链路。LNS知道用户已经终止了本次会话后，发送L2TP呼叫关闭分组给LAC，释放会话连接。自愿模式自愿模式如上图的2用户所示，要求机器上必须具备LAC客户端。由连接到Internet的主机（LAC客户）自己建立、控制、管理VPN。客户只需在其主机上安装LAC客户软件即可与LNS建立连接。适合远程办公用户与自己公司相连的情况，隧道的建立不依赖服务提供者。隧道不能分用/复用，LNS需要大量隧道来满足连接请求，并且每个用户同时只能开通一条隧道。协议消息L2TP使用两种消息类型：控制消息，数据消息。均由首部（头）和主体两部分组成。控制消息用于建立、维护、清除隧道和呼叫，主体部分描述了控制报文类型，以及与报文类型相关的信息，这些信息都以属性值对（AVP）的形式出现。数据消息用于封装在隧道上传输的PPP帧，主体是PPP帧。L2TP分组报文首部格式如下：T(ype)比特：类型标识，“0”表示数据消息，“1”表示控制消息。L(ength)比特：长度字段标识，“1”表示首部包含“长度”字段。对控制字段必须为1.长度：消息总长度，包括L2TP头、PPP分组等隧道ID：此次会话所属隧道号会话ID：表示一个隧道内一次会话的标识符Ns和Nr：在数据消息中是可选项，在控制消息中必须出现。分别代表当前分组序列号和希望接收的下一个分组序列号。偏移量：在数据消息中可选，在控制消息中不出现。最高位置1时，表示紧接L2TP头后（从该字段开始）应跳过多少字节才是用户数据偏移填充：为0，为了使L2TP头与填充字节的总长度达到一定长度的整数倍，使协议的处理更高效。Ver：L2TP的版本，目前取值为2对于L2TP控制消息格式如下：L2TP控制消息=L2TP头+AVP（1|n）IETF定义的所有AVP，从功能上可分为6大类：适用于所有控制消息的AVP用于报告结果和错误代码的AVP用于控制连接管理的AVP用于呼叫管理的AVP用于认证的AVP用于显示呼叫状态的AVPAVP格式如下图所示：M:强制位,说明接收方在收到无法识别的AVP时应怎样处理。M取1会话将被中断，取0则忽略。H：隐藏位。表示AVP中的属性值是否被想隐写为密文。此功能可在AVP中传输口令等敏感数据。长度：字段长为10位，表示AVP所包含的字节数。厂商ID：字段长为16位，不同软/硬件厂家被分配的一个SMI（structure of management information，管理信息结构）即为厂商ID。属性类型：2个字节，表示AVP类型。属性值：对应属性的取值，长度随不同属性类型而不同。L2TP对属性值做加密处理之前首先生成隐藏AVP子格式（Hidden AVP Subformat, HAS），其中包含2B的“原属性值长度”以及任意长度的“原属性值”和“填充”字段。加密处理时首先将HAS划分为16B的分组，依次为（p1,p2,….,pi）随后加密过程如下：其中，AV是2B的属性类型；S是通信双方的共享秘密，这个秘密和双方实施CHAP时所使用的共享秘密相同；RV是随机向量。最终的属性值字段是c1|c2|….|ci。由于加密属性值需使用RV，所有每个包含隐藏AVP的L2TP报文中都应该包含“随机向量AVP”，且在所有隐藏AVP之前出现。多个隐藏AVP可共用同一RV，每个隐藏AVP都使用其前面最近的RV。控制连接连接建立L2TP封装分组在IP网络中是通过UDP报文方式传送的，所以不需建立TCP连接。LAC和LNS都可发起控制连接，各自分配唯一的隧道ID。同一LAC-LNS对可建立多条隧道，以区分不同的服务质量。通过在SCCRQ或SCCRP消息中包含Challenge AVP,要求对方提供身份认证信息；对方回复时必须包含相应的Challenge Response AVP。隧道认证用共享密钥完成。隧道维护隧道没有收到任何消息，则可以小于1分钟/次的频率发送Hello消息探测隧道是否存活。接收方收到Hello消息后应立即进行确认。若发送方在一定时间内没有收到接收方的确认，可在一定时间后重发。重发一定次数后仍没有收到确认，则关闭隧道连接。隧道关闭关闭原因：系统出错、资源不足、认证失败、用户挂断等。一方将关闭隧道时给对方发送一个StopCCN(Stop-Control-Connection-Notification)消息。收到StopCCN的一方应发送零长度消息(zero-length-body,ZLB)，以确认接收，之后将等待一个重发周期的时间，防止ZLB消息丢失而重发StopCCN的情况。L2TP呼叫呼叫建立控制连接建立后就可以进行会话建立的协商、维护和管理。会话建立有方向性，分为出站呼叫和入站呼叫。总部主机希望同远程用户通信，LNS向用户所在LAC发起出站呼叫。远程用户向总部主机发起访问时，用户所在LAC向LNS发起入站呼叫。出站呼叫和入站呼叫都是三次握手的过程。会话维护两个消息控制用于会话维护：LAC向LNS发送WEN(WAN-Error-Notify)消息，报告本地会话处理中出现错误的统计情况。LNS向LAC发送SLI(Set-Link-Information)消息通知LAC修改异步控制字符映射ACCM。会话关闭LAC与LNS都可以作为会话关闭的发起方。举例来讲，当用户希望终止会话时，他使用PPP Terminate-Request消息通知LAC。LAC并不理解该消息，像其他分组一样封装后发送给LNS。LNS发送Call-Disconnect-Notify 通知LAC，并清除本地与该会话有关的状态量LAC收到CDN后，也清除相应的状态量，会话终止。安全性分析L2TP不提供对PPP数据的机密性和完整性保护，若使用CHAP，则可体现端点身份认证的功能。CHAP依赖共享秘密，但L2TP并未讨论秘密的生成和更新方法；由于不提供对每个报文的认证功能，所以无法抵抗插入攻击和地址欺骗。攻击者可能会伪造一些假冒的控制信息，使得隧道和底层链路断开，造成拒绝服务攻击。L2TP应被看成一个隧道协议。从安全的角度考虑，L2TP应与IP或传输层的安全协议结合使用。
IPv4 NAT（含Cisco配置）IPv4私有空间地址类RFC 1918 内部地址范围前缀A10.0.0.0 - 10.255.255.25510.0.0.0/8B172.16.0.0 - 172.31.255.255172.16.0.0/12C192.168.0.0 - 192.168.255.255192.168.0.0/16这些私有地址可在企业或站点内使用，允许设备进行本地通信。但是，由于这些地址并不代表任何公司或组织机构，因此私有IPv4地址不能在互联网上路由。为了使具有私有 IPv4 地址的设备能够访问本地网络之外的设备和资源，必须首先将私有地址转换为公有地址。NAT 提供了私有地址到公有地址的转换，NAT的类型。这样做可以使拥有私有IPv4地址的设备可以访问私有网络外部的资源，比如互联网上的资源。NAT的概念NAT 有很多作用，但其主要作用是节省了公有 IPv4 地址。它通过允许网络在内部使用私有 IPv4地址，而只在需要时提供到公有地址的转换，从而实现这一作用。NAT还在一定程度上增加了网络的隐私性和安全性，因为它对外部网络隐藏了内部IPv4地址。可以为启用 NAT 的路由器配置一个或多个有效的公有 IPv4 地址。这些公有地址称为 NAT 地址池。当内部设备将流量发送到网络外部时，启用 NAT 的路由器会将设备的内部 IPv4 地址转换为NAT 池中的一个公有地址。对外部设备而言，所有进出网络的流量好像都有一个取自所提供地址池中的公有 IPv4 地址。NAT 路由器通常工作在末端网络边界。末节网络是指这一个或多个网络与它的邻居网络之间只有单条连接，网络流量只有单条路入、单条路出。在图中的示例中，R2 为边界路由器。对 ISP 来说，R2 构成末端网络。当末端网络内的设备想要与其网络外部的设备通信时，会将数据包转发到边界路由器。边界路由器会执行 NAT 过程，将设备的内部私有地址转换为公有的外部可路由地址。NAT术语由于本文主要讲IPv4的NAT，“地址”一词如果没有特殊说明默认指IPv4地址。内部本地地址：内部网络设备看到的源IPv4地址。内部全局地址：网络外部看到的源IPv4地址。当发至外部的数据包经过NAT网关时，源IPv4地址会变成内部全局IPv4地址。外部本地地址：外部设备看到的目的IPv4地址。这通常是分配给互联网主机的全局可路由地址。大多数情况，外部本地地址与外部全局地址是一样的。外部全局地址：网络内部设备看到的目的IPv4地址。在决定使用哪一种地址时，重要的是记住NAT术语始终是从具有转换后地址的设备的角度来应用的：内部地址：经过NAT转换的设备IP地址外部地址：目的设备的IP地址关于地址，NAT还会使用全局或本地的概念：本地地址：出现在网络内部的IP地址全局地址：出现在网络外部的IP地址静态NAT静态NAT使用本地地址和全局地址一对一映射，由管理员进行配置，保持不变。在图中，R2 上配置了 Svr1、PC2 和 PC3 的内部本地地址的静态映射。这些设备在向互联网发送流量时，它们的内部本地地址会转换为管理员配置的内部全局地址。对外部网络的设备而言，这些设备使用的是公有IPv4地址。如果Web服务器或设备必须拥有固定的地址，以便能够让其他设备从互联网发起访问的话 比如公司的Web服务器），静态NAT就尤为有用。静态NAT也适用于这种情况：只有拥有授权的人员才能够从互联网对设备进行访问，发起访问的并不是互联网上一般的公有设备。举例来说，网络管理员可以从PC4上使用SSH来访问SRV1的内部全局地址 209.165.200.226）。R2会把这个内部全局地址转换为内部本地地址192.168.10.10，然后把会话连接到SRV1。为了满足所有同时发生的用户会话需要，静态 NAT 要求有足够的公有地址可用。动态NAT动态 NAT 使用公有地址池，并以先到先得的原则分配这些地址。内部设备请求访问外部网络时，动态 NAT 分配该池中的可用公共 IPv4 地址。如图所示，PC3使用的是动态NAT池中第5个可用地址连接的互联网。而其他地址仍可供使用。与静态 NAT 类似，为了满足所有同时发生的用户会话需要，动态 NAT 要求有足够的公有地址可用。端口地址转换PAT端口地址转换（PAT），也称为NAT过载，可以可以将多个地址映射到一个或少数几个地址，因为每个私有地址也会用端口号加以跟踪。当设备发起 TCP/IP 会话时，它会生成一个 TCP 或 UDP源端口号，或专门为 ICMP 分配的查询 ID，用来唯一地标识这个会话。当 NAT 路由器收到来自客户端的数据包时，将使用其源端口号来唯一确定特定的 NAT 转换。当 R2 处理各数据包时，它使用端口号 本例中为 1331 和 1555）来识别发起数据包的设备。源地址（ SA）为内部本地地址，再加上TCP/UDP分配的端口号。目的地址 （DA）为外部全局地址，再加上服务器端口号。在本示例中，HTTP 服务端口为 80。对于源地址，R2会将内部本地地址转换为内部全局地址，并添加端口号。当Web服务器回复的时候，路径相反。下一可用端口上图中，启用NAT的路由器上客户端的端口号没有改变，这种情况不太常见。因为这些端口可能被其他服务所占用。PAT会尝试保留原始的源端口，但是端口若被占用，PAT就会从相应的端口组（0-511、512-1023或1024-65535）中分配第一个可用的端口号。如果地址池外部地址多于一个，则PAT会进入下一地址并尝试重新分配原始端口号。不包含传输层数据段的数据包如果IPv4数据包不包含传输层数据段，这些数据包将不包含传输层端口号。PAT 可以转换 IPv4 承载的大多数常用协议，这些协议不会将 TCP 或 UDP 用作传输层协议。其中最常见的一种就是 ICMPv4。对于每种类型的协议，PAT 会以不同方式进行处理。例如，ICMPv4 查询消息、响应请求和响应应答会包含一个查询 ID。ICMPv4 使用查询 ID 来识别响应请求及其相应的响应应答。每发送一个响应请求，查询 ID 都会增加。PAT 将会使用查询 ID 而不是传输层端口号。Cisco配置命令静态NAT配置以上图为例，内部网络中包含一台Web服务器，它使用了私有IPv4地址。路由器R2上配置了静态NAT，允许外部网络上的设备能够访问这台Web服务器。外部网络中的客户端使用公网IPv4访问Web服务器。首先，建立内部本地地址与内部全局地址的映射关系。我们使用下面的命令，在R2上将192.168.10.254这个内部本地地址映射到209.165.201.5上。R2(config)# ip nat inside source static 192.168.10.254 209.165.201.5接下来，将参与转换的接口配置为内部或外部接口（对于NAT而言）。上图中的R2的S0/1/0就是内部接口，而S0/1/1为外部接口。R2(config)# interface serial 0/1/0 R2(config-if)# ip address 192.168.1.2 255.255.255.252 R2(config-if)# ip nat inside R2(config-if)# exit R2(config)# interface serial 0/1/1 R2(config-if)# ip address 209.165.200.1 255.255.255.252 R2(config-if)# ip nat outside在PC上访问Web服务器资源，其过程如下图所示：此外，我们可以在R2路由器上特权模式下使用命令，来显示活动的NAT转换。R2# show ip nat translations由于该示例是静态NAT配置，因此无论是何种配置，转换都会在NAT表里Pro Inside global Inside local Outside local Outside global --- 209.165.201.5 192.168.10.254 --- --- Total number of translations: 1如果在活跃会话过程中执行了上述命令，命令输出中就会显示外部设备的地址：Pro Inside global Inside local Outside local Outside global tcp 209.165.201.5 192.168.10.254 209.165.200.254 209.165.200.254 --- 209.165.201.5 192.168.10.254 --- --- Total number of translations: 2如果想要查看活动转换总数、NAT配置参数、地址池地址数量、已分配地址数量，可用以下命令：R2# show ip nat statistics动态NAT图中描述了一对一的 NAT 转换。内部网络中有两台 PC 连接到路由器 R1，两台 PC 分别位于192.168.10.0/24和192.168.11.0/24网络中。其中一台PC的IP地址是192.168.10.10，另一台PC的IP地址是192.168.11.10。R1通过S0/1/0接口连接路由器R2。R2通过S0/1/1接口连接互联网，互联网上有一台服务器IP地址为209.165.200.254。R2通过动态NAT来实现内部网络和外部网络之间的转换。这个公有 IPv4 地址池（内部全局地址池）根据先到先得的原则，分配这些地址给内部网络中的任何设备。使用动态 NAT 时，单个内部地址将转换为单个外部地址。在使用这种类型的转换时，地址池中必须有足够的地址，才能满足所有内部设备访问外部网络的需求。如果地址池中的所有地址都被使用了，其他设备必须等到有可用地址时，才能访问外部网络。注意：在公有和私有IPv4地址之间执行转换，是当前NAT最常见的用途。不过，我们也可以使用NAT在任意一对IPv4地址之间执行转换。首先，定义用于转换的地址池。该地址池通常是一组公有地址。这些地址是通过指明池中的起始 IPv4 地址和结束 IPv4 地址而定义的。netmask 或 prefix-length 关键字指示出哪些地址位属于网络部分，哪些地址位属于这个地址范围中的主机部分。R2(config)# ip nat pool NAT-POOL1 209.165.200.226 209.165.200.240 netmask 255.255.255.224然后配置一个标准 ACL，用于仅标识（允许）那些将要进行转换的地址。范围太宽的 ACL 可能会导致意料之外的后果。要记住在每个ACL的末尾都有一条隐式 deny all 语句。R2(config)# access-list 1 permit 192.168.0.0 0.0.255.255把ACL绑定到地址池：R2(config-if)# ip nat inside source list 1 pool NAT-POOL1指定NAT转换接口R2(config)# interface serial 0/1/0 R2(config-if)# ip nat inside R2(config)# interface serial 0/1/1 R2(config-if)# ip nat outsidePAT单个PAT要在配置PAT时只使用单个IPv4地址，只需要把关键字 overload 添加到ip nat inside source命令中即可。其他配置与静态或动态NAT配置类似，只是在PAT配置中，多台主机可以使用相同的公有IPv4地址来访问互联网。在本例中，网络192.168.0.0/16中的所有主机（匹配ACL 1）在通过路由器R2向互联网发送流量时，数据包的源地址会被转换为IPv4地址209.165.200.225 （S0/1/1接口的IPv4地址）。由于配置了 overload 关键字，路由器会使用NAT表中的端口号来识别通信流量。R2(config)# ip nat inside source list 1 interface serial 0/1/1 overload R2(config)# access-list 1 permit 192.168.0.0 0.0.255.255 R2(config)# interface serial0/1/0 R2(config-if)# ip nat inside R2(config-if)# exit R2(config)# interface Serial0/1/1 R2(config-if)# ip nat outside配置PAT来使用地址池ISP 可以向组织机构分配多个公有 IPv4 地址。在这种场景中，组织机构可以配置PAT来使用一个IPv4公有地址池进行转换。如果某个站点发出了多个公有 IPv4 地址，这些地址可能是 PAT 使用的地址池的一部分。如果让较多的设备共享一个较小的地址池，那么就会有多台设备使用相同的公有IPv4地址访问互联网。要在配置PAT时使用动态NAT地址池，只需要把关键字 overload 添加到ip nat inside source 命令中即可。在本例中，NAT-POOL2中绑定了一个ACL，其中限定了要转换的地址是192.168.0.0/16。因为命令中使用关键字 overload 启用了PAT，因此这些主机可以共享地址池中的IPv4地址。R2(config)# ip nat pool NAT-POOL2 209.165.200.226 209.165.200.240 netmask 255.255.255.224 R2(config)# access-list 1 permit 192.168.0.0 0.0.255.255 R2(config)# ip nat inside source list 1 pool NAT-POOL2 overload R2(config)# R2(config)# interface serial0/1/0 R2(config-if)# ip nat inside R2(config-if)# exit R2(config)# interface serial0/1/1 R2(config-if)# ip nat outside关于IPv6的NAT简要说明由于很多网络同时使用了IPv4和IPv6，因此需要有一种方法能够在IPv6环境中使用NAT。在 IPv6环境中集成 NAT。具有 128 位地址的 IPv6 可以提供 340 涧 10 的 36 次方）个地址。因此，不会出现地址空间耗尽问题。IPv6的开发初衷，就是为了免除公有和私有IPv4地址之间的IPv4 NAT转换。但IPv6中也确实有自己的IPv6私有地址空间，也就是唯一本地地址 ULA）。IPv6中的唯一本地地址 ULA）与RFC 1918规范中的IPv4私有地址类似，但它们的用途不同。ULA地址只用于一个站点内部的本地通信。ULA地址并没有提供额外的IPv6地址空间，也没有提供安全性。IPv6在IPv4和IPv6之间提供的协议转换称为NAT64。用于 IPv6 的 NAT 与用于 IPv4 的 NAT 使用背景大不相同。用于IPv6的NAT是为了在纯IPv6和纯IPv4网络之间提供透明传输，如图所示。而不是用作一种私有 IPv6 到全局 IPv6 的转换。图中描述了 NAT64 或 IPv6 NAT 转换。名为NAT64的路由器连接着IPv4互联网、IPv6互联网和纯IPv6网络。原生的IPv6流量显示在IPv6网络中，NAT64转换后的流量显示在IPv4网络中。理想情况下，只要有可能，IPv6 就应当在本地运行。这意味着 IPv6 设备将通过 IPv6 网络相互通信。但是，为了帮助实现从 IPv4 到 IPv6 的转移，IETF 已经开发了多项过渡技术以满足各种IPv4 到 IPv6 的转移情景，包括双堆栈、隧道和转换。双栈是指设备上同时运行与IPv4和IPv6相关联的协议。IPV6 隧道是指将 IPv6 数据包封装到IPv4 数据包中的过程。这将使 IPv6 数据包能够通过仅支持 IPv4 的网络传输。我们不应该把IPv6 NAT作为一种长期策略使用，但它可以作为临时机制来协助从IPv4到IPv6的迁移。多年来，已经开发了多个用于 IPv6 的 NAT 的类型，包括网络地址转换-协议转换 (NAT-PT)。IETF 已弃用 NAT-PT，开始倾向于其替代者 NAT64。
IPSec协议簇（含Cisco实验配置）什么是IPSec早期的网络并不像现在这样，使用者大部分都是科学家并且一般是组织内部成员进行通信，所以在设计之初并没有考虑其安全性。但对于现在的网络，保障通信安全是非常重要的，而IPSec协议簇可以保障网络层的安全性。IPSec是一组基于网络层的应用密码学的安全通信协议簇。它是VPN中常用的一种技术。设计目标：为IPv4和IPv6提供客户操作的、高质量的、基于密码学的安全保护。功能：工作在网络层，提供身份认证、机密性、完整性三个安全服务，并防止重放攻击和提供有限通信流机密性保护。IP协议是唯一一个由所有高层协议共享的协议。在IP层实现安全可以为上层应用提供安全保障，各种应用程序可共享IP层提供的安全服务和密钥管理，不必设计自己的安全机制，减少密钥协商的开销，有利于降低安全漏洞产生的可能。IPSec有四种典型应用：端到端安全基本的VPN支持保护移动用户访问内部网嵌套式隧道IPSec架构IPSec VPN体系结构如下图：DOI：将IPSec与RFC文档联系一起，批准加密和认证算法标识、运行参数等。密钥管理：IPSec密钥管理主要由IKE完成。定义了通信实体间进行身份认证、协商加密算法以及生成共享的会话密钥的方法。IKE将密钥协商的结果保留在安全关联（SA）中，供AH和ESP以后通信使用。AH协议：使用认证报文包格式和一般性问题。ESP协议：使用ESP进行包加密的报文包格式和一般性问题，以及可选的认证。IPSec工作模式IPSec工作模式分为两种：传输模式隧道模式传输模式传输模式将IPSec协议头插入到原IP头部与传输层头部之间，只对有效载荷进行加密或认证。即使在子网内部中的其他用户也不能理解上面拓扑中两台主机之间的通信内容。由于每个需要实验传输模式的 主机都必须安装并实现IPsec协议，因此不能实现对端用户的透明服务。用户为了获得IPsec提供的安全服务，必须消耗内存、花费处理时间。由于传输模式仅对有效载荷进行保护，而对于原IP包头部不会进行修改（缺乏保护），所以会暴露内网拓扑结构。隧道模式隧道模式会创建新的IP包头部，并把原来的部分都当作有效载荷封装。如此，子网内部所有用户都可以享受网关提供的安全保护，不会暴露内网拓扑结构，而且主机可以使用私有IP地址。但子网内部以明文方式进行，无法控制内部发生的安全性问题。而且，由于IPSec主要集中在网关上（解封装更换IP头部等），增加了网关的负担，容易造成通信瓶颈。注意上图不讨论所使用的协议，示意图是抽象的。实际来讲，对于ESP协议，上图的数据包还包含一个ESP尾部，这个请看下文。AH协议工作原理工作原理是在每个数据包上添加一个身份验证报头。此报头包含一个带密钥的hash散列，此hash散列在整个数据包中计算，因此对数据的任何更改将致使散列无效，这样就提供了完整性保护。AH协议对整个数据包进行验证，但本身不提供任何形式加密。在计算认证数据时，AH会把前面的IP首部中的部分字段也包含在内。必须保证计算认证数据时，输入在传输中不变，或者变化但可以预测。变化的字段不考虑，不变的字段加入，变化但可预测的的字段则使用预测到的、到达目的端后变化的值。AH协议下的IPSec头部为AH头部，其结构如下图。认证数据：变长字段，是AH使用消息认证码（MAC）对IP数据包进行认证，生成认证数据即完整性校验值ICV。（顺带提一点，原IP协议的校验和对于数据完整性能力有限）序列号：对于一个包，外出情况，则外出SA计数器增加1；接收的话，则进入SA计数器增加1。用于抗重放攻击。处理过程处理过程主要讨论设备在拿到一个包的时候，对于外出和进入时的数据包的处理。外出处理检索SPD，查找应用于该数据包的策略：以选择符为索引查找对应的SA：SPD通过SPI指向SAD中的一个相应SA，从SA中得到相关安全参数；若SA尚未建立，则调用IKE协商一个SA，并将其连接到该SPD条目上。构造AH载荷：按照SA中给出的处理模式填充AH载荷的各个字段（复制IP头、计算载荷长度、填入SPI值、产生或增加序列号值、计算ICV并填入）为AH载荷添加IP头：传输模式添加原IP头；隧道模式构造新的IP头其他处理：重新计算外部IP头校验和；若分组长度大于MTU（Maximum Transmission Unit）则进行IP分段。 处理完的数据包交给数据链路层（传输模式）发送或IP层（隧道模式）重新路由。进入处理分段重组，检查MF位，若存在分段，则重组。查找对应的SA：使用外部IP头中的<SPI，目的IP地址，协议号>作为索引检索SAD，以找到处理该分组的SA。若查找失败，则丢弃。抗重放处理：若启用了抗重放功能，则使用SA的抗重放窗口检查是否是重放包。若是重放，则丢弃。完整性检查：使用SA指定的MAC算法计算数据包的ICV，将它与认证数据字段中的值进行比较。若不匹配，则丢弃。嵌套处理：若是嵌套包则返回第二步，循环处理。检验策略的一致性。使用IP头（隧道模式中是内部头）中的选择符进入SPD查找一条与选择符匹配的策略，检查该策略与SA指向的SPD条目的安全策略是否一致；若不匹配则丢弃。传输流程传输流程主要关注数据包在网络中的传递和处理数据包的设备。而这个设备，其处置数据包的方式细节为上文中的处理过程。传输模式在传输模式下（通常P2P），数据包格式如下：处理流程如下图所示：隧道模式隧道模式数据包格式如下：其传输流程如下图：ESP协议工作原理AH协议不提供加密。而ESP协议提供数据完整性、数据源发认证、抗重放攻击、机密性和有限的传输流机密性。报文内容机密性保护通过密码算法加密数据包相关部分实现；流机密性保护通过隧道模式下的机密性保护范围提供。在使用ESP时，IPSec头部为ESP头，与AH不同的是，ESP会在数据（有效载荷）后面添加一个ESP尾。我们来看下使用ESP协议的IP数据包除去IP头部以后的部分（注意，这里不仅仅是ESP头部，之所以这样写是因为ESP会对数据部分进行填充并且添加尾部）认证数据：长度不固定，存放ICV，通过对认证数据字段外的ESP包进行计算获得。处理过程外出处理检索SPD，查找应用于该数据包的策略查找对应的SA：SPD通过SPI指向SAD中的一个相应SA，从SA中得到相关安全参数若SA尚未建立，则调用IKE协商一个SA，并将其连接到该SPD条目上。构造ESP载荷：按照SA中给出的处理模式填充ESP载荷的各个字段为ESP载荷添加IP头：传输模式添加原IP头；隧道模式构造新的IP头对ESP进行加密和认证处理其他处理：重新计算外部IP头校验和；若分组长度大于MTU（Maximum Transmission Unit）则进行IP分段。处理完的数据包交给数据链路层（传输模式）发送或IP层（隧道模式）重新路由。进入处理分段重组，检查MF位，若存在分段，则重组。查找对应的SA：使用外部IP头中的<SPI，目的IP地址，协议号>作为引检索SAD，以找到处理该分组的SA。若查找失败，则丢弃。抗重放处理：若启用了抗重放功能，则使用SA的抗重放窗口检查是否是重放包。若是重放，则丢弃。完整性检查：使用SA指定的MAC算法计算数据包的ICV，将它与认证数据字段中的值进行比较。若不匹配，则丢弃。解密数据包恢复IP数据包检验策略的一致性。使用IP头（隧道模式中是内部头）中的选择符进入SPD查找一条与选择符匹配的策略，检查该策略与数据包实际收到的安全保护是否一致；若不匹配则丢弃。传输流程传输模式传输模式下的包格式：ESP头部由SPI和序列号组成，尾部由填充项、填充项长度和下一个头字段组成，并标明了数据包被加密和认证的部分。ESP不对整个IP包进行认证。隧道模式AH与ESP嵌套使用AH和ESP同时使用的时候，AH包头在前，ESP头部在后，并且数据部分后面有个ESP尾部和ESP认证。在处理的时候，按照传输模式或者隧道模式下的各协议约定来进行即可。比如AH协议几乎是认证整个数据包，那就把ESP的部分看为数据部分，然后到处理ESP的时候，再按照ESP协议的处理流程来。安全策略SP与安全策略数据库SPD概念安全策略（SP）是针对安全需求给出的一系列解决方案，它决定了对什么样的通信实施安全保护，以及提供何种安全保护。安全策略表示：一般而言，不存在一个映射方式，可以将自然语言表达式无损的映射到形式语言表达式中。从基本流程上来说，IPSec安全策略管理需要提供一个人机接口，以安全管理员用尽可能自然的方式输入非形式化的安全策略表达式。安全策略通常以安全策略库（SPD）的形式表现出来，库中每条记录对应一个安全策略。安全策略的管理：网络安全是非常复杂的领域，网络规模越大，描述如何保障安全的策略就越复杂。随着网络规模的扩大，必须集中管理安全策略。IPSec系统所使用的SPD一般保存在一个策略服务中。该服务器为域中的所有节点（主机和路由器）维护策略库。各节点可将策略拷贝得本地，也可使用轻目录访问协议（Lightweight Directory Access Protocol, LDAP）动态获取策略安全策略的要素：IPSec规定了两个策略组件：SPD和安全关联库（Security Association Database， SAD）对于外出数据报，必须先检索SPD，决定提供给它的安全服务。对进入数据报，也要检索SPD，判断为其提供的安全保护是否与策略规定的安全保护相符。SPD是有序的，每次查找的顺序应相同。通信特征IPSec规定可以使用以下元素描述通信特征目的IP地址源IP地址名字传输层协议源和目标端口数据敏感等级因此在SPD中对于SP的属性就有如下图所示几种：系统名：完整的DNS或E-mail地址用户ID：完整的DNS用户名上层端口：TCP或UDP端口号，可为单个端口、端口列表或通配端口标志：采取的动作，如Discard/Bypass IPSec/Apply IPSecSA指针：包括SA或SA集的指针、IPSec协议、运用的密码算法。安全关联SA与安全关联数据库SAD安全参数索引SPI唯一标识SA，在AH和ESP头中传输，因此IPSec数据包的接收方很容易识别出SPI，组合成三元组来搜索SAD，以确定与该数据包相关联的SA。安全关联库（SAD）维护了IPSec协议用来保障数据保安全的SA记录。每个SA都在SAD中有一条记录相对应。对于外出处理，应在SPD中查找指向SAD中SA的指针，如SA未建立，则应激活IKE建立SA，并同SPD和SAD的记录关联起来。SAD通过Hash表来构造。SAD的查找是通过一个三元组（SAID）：协议、目的地址、SPI来进行的，三元组标识了唯一的SA。通过对SAID的散列找到SA头，然后再进行详细匹配找到相应的SA。SPI：安全参数索引，32位整数，唯一标识SA，1-255被IANA保留为将来使用，0被保留用于本地实现。协议：AH或ESP序列号计数器：32位整数，初始值位0，每次用SA来保护一个包时增加1，用于生成AH或ESP头中的序列号域。溢出前SA会重新协商。序列号溢出：用于外出包处理，表示序列号计数器溢出的时候，一个SA是否仍可以用来处理其余的包。抗重放窗口：使用32位计数器和Bitmap来确定一个输入的AH或ESP数据包是否是一个重放包。ESP加密算法：加密算法（不是认证）所需密钥、初始化向量IV和IV模式（ECB、CBC、CFB、OFB）。操作模式：传输模式、隧道模式。PMTU：路径最大传输单元，可测量和变化，是IP数据报经过特定的源host到目的host的网络路由而无需分段的IP数据包最大长度。SA生存周期：包含一个时间间隔，外加一个当SA过期时是否被替代还是终止。采用软存活时间和硬存活时间（二者同时存在）。软存活时间在SA到期前通知内核，便于在硬存活时间到来前内核能及时协商新的SA。IP分组外出IP分组：进入IP分组：IKE协议概念IKE（ Internet Key Exchange ，RFC2409）：因特网密钥交换协议，是一个以受保护的方式动态协商和维护SA的协议。IKE协商分为两个阶段：阶段1：主要是协商安全策略、认证模式，以及所有的必须参数，在通信主体间创建IKE SA，用于保护阶段2的交换阶段2：l阶段2中，主要为IPSec和其他一些安全服务创建SA。IKE定义了四种模式：阶段1提供主模式和野蛮模式阶段2提供快速模式和新群模式IKE使用D-H交换生成共享的会话密钥，通信双方可利用新群模式协商如何使用一个新的D-H群。IKE功能如下：SA协商密钥生成身份认证SA协商是IKE协商的一项核心内容，它规定的SA属性包括加密算法、散列算法、认证方法、D-H群信息、伪随机函数、群描述、群类型、生命期类型、生命期以及密钥长度。IKE加密算法属性名标识取值含义加密算法11DES-CBC 2IDEA-CBC 3Blowfish-CBC 4RC5-R16-B64-CBC 53DES-CBC 6CAST-CBC 7-65000保留 65001-65535私有使用IKE群相关属性群相关属性：D-H群决定了在进行一次D-H交换时通信双方需要使用的参数是什么。IKE定义了4个具体的群，表示群属性的数字是指群号。对一个指定的群号，其对应的群参数是固定的。所以，当一方给出一个群号时，对方与其使用的参数相同。IKE与定义群：MODP群（模指数群）：768Bits、1024BitsEC2N群：155Bits、185BitsMODP的768Bits群是必须实现的，它和EC2N的155Bits群为密钥交换提供了强度类似的安全保护。伪随机函数PRF伪随机函数PRF以秘密信息和其他信息作为输入，并产生随机的比特流。IKE使用PRF产生以下四种秘密信息来对数据进行验证和保护SKEYID：用于推导其他秘密信息；SKEYID-d：用于衍生出IPSec报文加密、验证密钥；SKEYID-a： ISAKMP消息完整性验证密钥；SKEYID-e： ISAKMP消息加密密钥，用于数据加密。SKEYID的生成方式取决于认证方法，其他三种则以SKEYID为基础进行推导，与认证方法无关。其中PRF是伪随机函数，gxy是D-H交换中的共享秘密，CKY是Cookie，0,1,2分别是字符“0”、 “1” 、“2”如果不协商PRF，则默认使用HMAC，其中的散列算法使用通信双方协商SA时所协定的算法。IKE认证方法IKE的认证方法直接影响了协商报文的内容和密钥生成的输入。IKE定义了四种认证方法：基于数字签名的方法：通信双方互相交换证书和签名信息。基于公钥加密的方法：通信双方在用对方的公钥对身份、随机数等信息进行加密处理后，将这些加密信息发送给对等端。之后，双方要将身份、随机数等信息作为输入生成认证信息。改进的基于公钥加密的方法：对某些信息采用公钥加密机制处理，其他信息采用对称密码体制处理，提高通信效率。基于预共享密钥的方法：要求双方预共享一个密钥，作为生成认证信息时的输入之一。我们主要讨论预共享密钥认证主模式交换：消息1、2：协商好IKE SA需要的各项参数，以明文方式传输，没有身份认证消息3、4：用于协商Diffie-Hellman密钥材料，为通信双方生成一个共享的秘密，以明文方式传输，没有身份认证在对阶段1协商的SA和Diffie-Hellman共享秘密进行认证之前，双方会生成4种秘密：SKEYID、SKEYID_d、SKEYID_a和SKEYID_e.SKEYID=PRF (Kpre (I,R),Ni|Nr): 使用预主密钥和消息的伪随机数函数，如HMAC。SKEYID_d =PRF(SKEYID, gir|CKY-i|CKY-r|0)SKEYID_a =PRF(SKEYID, SKEYID_d|g^{ir}|CKY-i|CKY-r|1)SKEYID_e =PRF(SKEYID, SKEYID_a|g^{ir}|CKY-i|CKY-r|2)消息5、6：认证双方身份，HDR后的*表明，最后两条消息是用SKEYID_e 加密的。双方各自计算一个散列结果：HASH_I和HASH_R。这两个哈希函数的输入中包含SKEYID，意味着预共享密钥生成的SKEYID影响了这两个散列函数的计算，如果散列值验证通过，则说明对等端拥有正确的预共享密钥，从而验证了身份。IKE作用过程IPSec启动过程——由配置在 IPSec对等体中的IPSec安全策略指定要被加密的数据流启动IKE过程IKE阶段1——创建安全通道IKE SA。IKE认证IPSec对等体，为建立IKE本身使用的安全信道而相互交换SA（双向） ；IKE阶段2——利用已建立的IKE SA，建立交换IPSec通信中使用的IPSec SA（单向）；数据传送——数据根据存储在SA数据库中的IPSec参数和密钥在IPSec对等体间传送；IPSec隧道终止——通过删除或超时机制结束IPSec SA。Cisco路由或三层交换配置IPSec前提由于Cisco Packet Tracer功能不完善，此处使用PNET模拟器加载Cisco IOS镜像来进行实验。拓扑结构对于R1路由器:我们配置回环接口loopback0来模拟PC，地址为192.168.1.1/24它的e0/0接口为192.168.10.1/24对于R2路由器：我们配置回环接口loopback0来模拟PC，地址为192.168.2.1/24它的e0/0接口为192.168.20.1/24我们故意使两个e0/0不在同网段下，来模拟经过多个网络的情况。（因为这种情况下需要开启动态路由或者配置静态路由）配置基础配置我们首先配置好网络环境并确保能够Ping通对于路由器R1en conf t int lo 0 ip addr 192.168.1.1 255.255.255.0 int e0/0 ip addr 192.168.10.1 255.255.255.0 no shut exit配置默认路由，流量都走e0/0：ip route 0.0.0.0 0.0.0.0 e0/0对于R2同理en conf t int lo 0 ip addr 192.168.2.1 255.255.255.0 int e0/0 ip addr 192.168.20.1 255.255.255.0 no shut exit ip route 0.0.0.0 0.0.0.0 e0/0isakmp协商配置前半部分R1与R2相同：定义策略crypto isakmp policy 1配置加密算法为3DESencry 3deshash算法为MD5hash md5验证方式为预共享密钥auth pre-share组值为5group 5配置lifetime，然后回到config模式下lifetime 120 exit下面R1和R2在地址配置方面有些不同：R1，配置密钥为cisco，指定地址为192.168.20.1cry isa key 0 cisco addr 192.168.20.1R2类似，只不过地址为192.168.10.1cry isa key 0 cisco addr 192.168.10.1配置IPSec定义IP数据的保护策略，主要是ESP还是AH、加密算法、验证算法、传输模式还是隧道模式，以及被IPSec保护的数据流。我们加密算法使用3DES，并且认证使用SHA哈希的HMAC，并设置为隧道模式，然后保护192.168.1.1/24与192.168.2.1/24通信的数据对于R1cry ipsec tran IPSEC esp-3des esp-sha-hmac mode tunnel exit ac 100 per ip host 192.168.1.1 host 192.168.2.1 cry map MAP 1 ipsec-isa设置对端，并匹配第二阶段的IPSec策略set peer 192.168.20.1 set tran IPSEC match addr 100对于R2同理：cry ipsec tran IPSEC esp-3des esp-sha-hmac mode tunnel exit ac 100 per ip host 192.168.2.1 host 192.168.1.1 cry map MAP 1 ipsec-isa set peer 192.168.10.1 set tran IPSEC match addr 100配置接口MAP，R1与R2一样都是e0/0int e0/0 crypto map MAP exit检查协商是否正常特权模式下查看isakmp SAshow crypto isakmp sa特权模式下查看ipsec SAshow crypto ipsec sa抓包测试PNET提供内置Wireshark可以很方便的进行抓包，我们对R1的e0/0抓包开启抓包后在R1控制台特权模式下使用192.168.1.1地址去ping R2的192.168.2.1ping 192.168.2.1 source 192.168.1.1wireshark窗口可看到出现ESP协议的包关于IKE与ISAKMPIPsec协议族中IKE（Internet Key Exchange）是一种基于ISAKMP的协议，它为建立IPSec安全通信隧道提供了一种无痕密钥交换的机制。简单来说，IKE就是ISAKMP的扩展，为ISAKMP提供了更加高效、灵活和安全的密钥协商机制。
Cisco路由器配置IPv6 Manual隧道IPv6与IPv4共存的方式IPv6与IPv4共存方式大致有三种：双栈：要求网络中所有设备均同时支持IPv4和IPv6转换：转换这种方式将IPv6协议的报头转换成IPv4协议报头。隧道：假定两个IPv6节点要使用IPv6数据包进行交互，但他们是经由中间IPv4路由器互联的。我们将两台IPv6路由器之间的中间IPv4路由器的集合称为一个隧道。借助于该隧道，在隧道发送端的IPv6节点数据可将整个IPv6数据放到一个IPv4数据报的数据（有效载荷）字段中。IPv6隧道类型如上图拓扑所示，当两个IPv6网络需要通信的时候，如果中间穿越IPv4网络，而IPv4网络中的设备只能识别IPv4报文，并不能正常传输IPv6，这时候就需要在IPv4网络中为IPv6创建一条隧道，来提供IPv6在IPv4中的传递。把 IPv6 的数据全部封装在 IPv4 中，将 IPv4 当作链路层来传递的隧道形式，称为覆盖型隧道（Overlay Tunnels ）。由于隧道是建立在 IPv4 基础上的，隧道又必须有起点和终点来明确隧道的路径，所以覆盖型隧道的起点和终点最好是使用 IPv4 地址，有时必须是 IPv4 地址，并且隧道在传输 IPv6 数据时，也应该在隧道的两端添加 IPv6 地址，来完成两端 IPv6 网络的通信。隧道的起点和终点必须同时支持 IPv4 和 IPv6。在当前Cisco IOS中支持的覆盖型隧道有以下几种：名称模式说明Manualipv6ip点对点，只传递IPv6数据包。GRE(Generic routing encapsulation )gre ip点对点，可传递多种协议。IPv4-compatibleipv6ip auto-tunnel点到多点，Cisco不建议使用。6to4ipv6ip 6to4点到多点，使用地址为2002::/16。ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)ipv6ip isatap点到多点。以上隧道中，所有隧道的源均为 IPv4 地址，但是只有点对点隧道的终点为 IPv4 地址，其它都不需要。更多的是，点对点隧道必须要有 IPv6 地址。配置我们还是以该拓扑为例进行配置。初始配置首先来进行一些初始配置，为这些路由器接口配置IP地址，并在部分路由器上开启IPv6功能。对于路由器R1:R1(config)#int f0/0 R1(config-if)#ip address 10.1.1.1 255.255.255.252 R1(config-if)#no shutdown R1(config-if)#exit R1(config)#ip route 0.0.0.0 0.0.0.0 f0/0 R1(config)#ipv6 unicast-routing R1(config)#int loopback 1 R1(config-if)#ipv6 address 3001:1:1:11::1/64 R1(config)#int loopback 2 R1(config-if)#ipv6 address 3002:1:1:11::1/64 R1(config)#int loopback 3 R1(config-if)#ipv6 address 3003:1:1:11::1/64对于R-MID：R-MID(config)#interface FastEthernet0/0 R-MID (config-if)#ip address 20.1.1.1 255.255.255.252 R-MID (config-if)#no shutdown R-MID(config)#interface FastEthernet0/1 R-MID (config-if)#ip address 10.1.1.2 255.255.255.252 R-MID (config-if)#no shutdown这里有必要说明下，由于R1、R2均分别与R-MID直连，所以不用指定R-MID到R1、R2的路由，但是在非直连的情况下请注意这一点。对于R2：R2(config)#int f0/0 R2(config-if)#ip address 20.1.1.2 255.255.255.252 R2(config-if)#no shutdown R2(config-if)#exit R2(config)#ip route 0.0.0.0 0.0.0.0 f0/0 R2(config)#ipv6 unicast-routing R2(config)#int loopback 0 R2(config-if)#ipv6 address 2022:2:2:22::2/64可以在R1上使用ping命令来测试IPv4的连通性：配置Manual类型本文只演示Manual类型。对于R1：R1(config)#int tunnel 0 R1(config-if)#ipv6 address 2012:1:1:11::1/64 R1(config-if)#tunnel source f0/0 R1(config-if)#tunnel destination 20.1.1.2 R1(config-if)#tunnel mode ipv6ip对于R2：R2(config)#int tunnel 0 R2(config-if)#ipv6 address 2012:1:1:11::2/64 R2(config-if)#tunnel source f0/0 R2(config-if)#tunnel destination 10.1.1.1 R2(config-if)#tunnel mode ipv6ip隧道借用地址IP unnumbered端口复用技术，常用来节省IP地址。一个接口如果没有IP地址就无法生成路由也就无法产生IP报文、转发报文。IP unnumbered可以让路由器没有配置IP地址的一个接口，利用本地某接口网络地址，作为该接口的网络地址以使该接口能够正常使用。隧道unnumbered在现有 IPv4 网络上创建覆盖型 IPv6 隧道，隧道的起点和终点都使用了 IPv4 地址来定义，然后要使隧道运行正常，使隧道具有路由协议的连接功能，需要赋予隧道两端 IPv6 地址，从而提供 IPv6 的连通性，而隧道两端的 IPv6 地址可以不属于同一网段，当然属于同一网段是最好的选择。当隧道两端的 IPv6 地址不属于同一网段时，那么两端的地址是无法 ping 通的，但IPv6 路由协议可以照常使用，这时路由协议需要将隧道的地址当作额外路由进行重新通告一次。如上图，我们将隧道两端IPv6地址改为无编号借用地址（unnumbered），就可以让这两个接口处于不同网段。初始配置对于路由器R1r1(config)#int f0/0 r1(config-if)#ip address 10.1.1.1 255.255.255.0 r1(config-if)#exi r1(config)#ip route 0.0.0.0 0.0.0.0 f0/0 r1(config)# r1(config)#ipv6 unicast-routing r1(config)#int loopback 0 r1(config-if)#ipv6 address 2011:1:1:11::1/64对于路由器R2r2(config)#int f0/1 r2(config-if)#ip add 20.1.1.1 255.255.255.0 r2(config-if)#exit r2(config)#ip route 0.0.0.0 0.0.0.0 f0/0 r2(config)#ipv6 unicast-routing r2(config)#int loopback 0 r2(config-if)#ipv6 address 2022:2:2:22::2/64确保IPv4连通后进行以下步骤。配置unnumbered地址的IPv6隧道我们以Manual(ipv6ip)类型隧道为例对于R1r1(config)#int tunnel 0 r1(config-if)#ipv6 unnumbered loopback 0 r1(config-if)#tunnel source f0/0 r1(config-if)#tunnel destination 20.1.1.1 r1(config-if)#tunnel mode ipv6ip对于R2r2(config)#int tunnel 0 r2(config-if)#ipv6 unnumbered loopback 0 r2(config-if)#tunnel source f0/0 r2(config-if)#tunnel destination 10.1.1.1 r2(config-if)#tunnel mode ipv6ip这里就是我们之前提到过的地方了，处于不同网段无法Ping通。为了严谨我们先来查看下隧道的情况。r1#show ipv6 interface brief tunnel 0 Tunnel10 [up/up] FE80::A01:101 unnumbered (Loopback0)同样R2也看看r2#show ipv6 interface brief tunnel 0 Tunnel10 [up/up] FE80::1401:101 unnumbered (Loopback0)然后在R1对R2使用ping命令试试：r1#ping 2022:2:2:22::2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 2022:2:2:22::2, timeout is 2 seconds: ..... Success rate is 0 percent (0/5)不出所料Ping不通！！！这是由于隧道两端地址不属于同一网段，所以没有对端路由信息，无法 ping 通。既然如此，我们就让它们彼此拥有关于对端路由信息，接下来我们开启OSPF v3。开启OSPFv3在R1开启OSPFv3协议：r1(config)#ipv6 router ospf 10 r1(config-rtr)#router-id 1.1.1.1 r1(config)#int loopback 0 r1(config-if)#ipv6 ospf network point-to-point r1(config-if)#ipv6 ospf 10 area 0 r1(config)#int tunnel 0 r1(config-if)#ipv6 ospf 10 area 0同样在R2上开启OSPFv3协议：r2(config)#ipv6 router ospf 10 r2(config-rtr)#router-id 2.2.2.2 r2(config)#int loopback 0 r2(config-if)#ipv6 ospf network point-to-p r2(config-if)#ipv6 ospf 10 area 0 r2(config)#int tunnel 10 r2(config-if)#ipv6 ospf 10 area 0R1查看邻居状态：r1#show ipv6 ospf neighbor Neighbor ID Pri State Dead Time Interface ID Interface 2.2.2.2 1 FULL/ - 00:00:37 15 Tunnel10R2查看邻居状态：r2#show ipv6 ospf neighbor Neighbor ID Pri State Dead Time Interface ID Interface 1.1.1.1 1 FULL/ - 00:00:36 15 Tunnel10从邻居状态可以知道，即使两端网段不一致导致Ping不通，但IPv6路由协议可以使用。我们刚才提到过，这种情况需要路由协议再通告一次。来看看两端路由信息r1#show ipv6 route ospf IPv6 Routing Table - 7 entries Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP U - Per-user Static route I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary O - OSPF intra, OI - OSPF inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2 ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2 D - EIGRP, EX - EIGRP external O 2022:2:2:22::/64 [110/11112] via FE80::1401:101, Tunnel10r2#show ipv6 route ospf IPv6 Routing Table - 7 entries Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP U - Per-user Static route I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary O - OSPF intra, OI - OSPF inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2 ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2 D - EIGRP, EX - EIGRP external O 2011:1:1:11::/64 [110/11112] via FE80::A01:101, Tunnel10说明学习到的IPv6路由是正常的。即然有了路由信息，那我们尝试Ping一下：r1#ping 2022:2:2:22::2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 2022:2:2:22::2, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 120/181/268 ms果然Ping通了！！！来查看下R2到R1的连通性：r2#ping 2011:1:1:11::1 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 2011:1:1:11::1, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 88/164/284 ms同样也成功了。
Cisco交换机安全配置前提我们以下命令一般都要先进入Config模式S1> enable S1# conf t S1(config)#端口安全保护禁用未使用的端口以关闭fa0/1到fa0/24的端口为例S1(config)# interface range fa0/1-24 S1(config-if-range)# shutdown缓解MAC地址表攻击防止CAM表溢出的最简单有效的方法是启用端口安全，它限制了端口上所允许的有效MAC地址数量。我们以fa0/1为例子S1(config)# interface fa0/1 S1(config-if)# switchport port-security这里你可能会遇到报错，内容如下：Command rejected: FastEthernet0/1 is a dynamic port.这是因为端口安全只能在手动配置的接入模式(access)端口或手动配置的中继(trunk)端口上！我们先将端口切换到access（如果是trunk的话命令中相应部分请改为trunk），然后开启端口安全。S1(config-if)# switchport mode access S1(config-if)# switchport port-security接下来限制端口上MAC地址最大数量，默认值为1S1(config-if)# switchport port-security maximum当然我们可以手动置顶数目，范围在<1-8192>，我们这里以手动设置1为例S1(config-if)# switchport port-security maximum 1手动配置MAC在接口配置模式中，执行以下命令，可手动指定安全MAC：switchport port-security mac-address 这里写MAC地址我们以aaaa.bbbb.1234地址为例S1(config-if)# switchport port-security mac-address aaaa.bbbb.1234动态获取除了手动之外还有动态获取的方式。在执行switchport port-security之后，这个端口直接连接的设备的源MAC地址就会成为安全MAC。但是，这个地址不会添加到启动配置中，也就是说，交换机重启后必须重新学习MAC地址！！动态获取-粘滞(Sticky)管理员可以执行以下命令，将动态获取的MAC地址，写入到运行配置文件中S1(config-if)# switchport port-security mac-address sticky查看端口安全信息我们可以在特权模式#下来查看端口安全的具体信息同样我们以fa0/1为例子S1# show port-security interface fa0/1当然你在config及其子模式下可以用do来执行特权模式下的命令S1(config-if)# do show port-security interface fa0/1大致能看到如下字段（字段对应的值取决于你的配置）S1# show port-security interface fa0/1 Port Security : Enabled Port Status : Secure-up Violation Mode : Shutdown Aging Time : 0 mins Aging Type : Absolute SecureStatic Address Aging : Disabled Maximum MAC Addresses : 4 Total MAC Addresses : 2 Configured MAC Addresses : 1 Sticky MAC Addresses : 1 Last Source Address:Vlan : a41f.7302.375b:2 Security Violation Count : 0还用一条命了可以查看安全MAC地址表S1# show port-security addressS1# show port-security address Secure Mac Address Table ----------------------------------------------------------------------------- Vlan Mac Address Type Ports Remaining Age (mins) ---- ----------- ---- ----- ------------- 1 a41f.7302.375b:2 SecureSticky Fa0/1 - 1 aaaa.bbbb.1234 SecureConfigured Fa0/1 - ----------------------------------------------------------------------------- Total Addresses in System (excluding one mac per port) : 1 Max Addresses limit in System (excluding one mac per port) : 8192端口安全老化通过端口安全老化可对端口上的动态和静态安全地址设置老化时间。端口老化时间有两种：绝对老化时间（Absolute）：老化时间到期后删除MAC地址非活动老化时间（Inactivity）：仅当端口上的安全地址在老化时间内使用老化功能删除安全端口上的安全 MAC 地址，无需手动删除现有安全 MAC 地址。还可增加老化时间限制，确保即使在添加新 MAC 地址时同样保持之前的安全 MAC 地址。可以对每个端口启用或禁用静态配置的安全地址老化。switchport port-security aging { static | time time | type {absolute | inactivity}}下面是各个参数的说明：参数说明static为此端口上静态配置的安全地址启用老化。time time为此端口指定老化时间。范围为 0 至 1440 分钟。如果 时间为 0，则表示这个端口禁用老化。type absolute设置绝对老化时间。所有安全地址 都会在到达设置的时间之后立刻在这个端口上老化，并且从 安全地址列表中被删除。type inactivity设置不活动老化类型。这个端口上的安全地址只有在设定的时间范围内，没有数据流量来自安全地址，安全地址才会老化。我们对把老化类型设置为非活动类型，并且时间为10分钟S1(config-if)# switchport port-security aging time 10 S1(config-if)# switchport port-security aging type inactivity端口安全违规模式连接到端口的设备 MAC 地址与安全地址列表不一致，则会触发端口违规。在默认情况下，这个端口就会进入error-disabled状态。设置端口安全违规模式可以用以下命令：switchport port-security violation { protect | restrict | shutdown}模式说明shutdown（默认）端口会立刻过渡到error-disabled状态，关闭端口LED并且发送一条系统日志消息。它会增加违规计数器的值。当一个安全端口处于error-disabled状态，管理员必须重新启用这个端口，这时需要输入shutdown和no shutdown命令。restrict端口会丢弃携带未知源地址的数据包，直到管理员删除了 足够数量的安全MAC地址，让安全MAC地址的数量降到了 最大值以下，或者管理员增加了最大值。这种模式会让违规计数器的值增加，并生成一条系统日志消息。protect这是最不安全的安全违规模式。端口会丢弃携带未知源地址的数据包，直到管理员删除了足够数量的安全MAC地址，让安全MAC地址的数量降到了最大值以下，或者管理员增加了最大值。不会发送系统日志消息。用一张图来概括缓解VLAN攻击VLAN攻击的方式下列三种方式都可以发起VLAN跳跃攻击：发起攻击的主机伪造DTP消息，使交换机进入中继模式。然后，攻击者可以发送标记为目标 VLAN 的流量，然后交换机向目的地传输数据包。引入非法交换机并启用中继。然后攻击者就可以通过非法交换机访问被攻击交换机上的所有 VLAN。另一种VLAN跳跃攻击是双重标记 (Double-Tagging) 攻击，又称双封装 (double-encapsulated) 攻击。这种攻击方式利用的是大多数交换机的硬件工作原理。缓解VLAN跳跃攻击的步骤实际上很简单，我们就把开启自动的一些端口变为手动模式，然后对中继端口设置下本征VLAN即可。使用switchport mode access接口配置命令禁用非中继端口上的 DTP（自动中继）协商。禁用未使用的端口并将其放在未使用的 VLAN 中。使用switchport mode trunk命令手动启用中继端口上的中继链路。使用switchport nonegotiate命令禁用中继端口上的 DTP（自动中继）协商。使用switchport trunk native vlan 这里写VLAN号命令把本征VLAN设置为VLAN 1之外的其他 VLAN。缓解DHCP攻击什么是DHCP攻击DHCP攻击针对的目标是网络中的DHCP服务器，原理是耗尽DHCP服务器所有的IP地址资源，使其无法正常提供地址分配服务。然后在网络中再架设假冒的DHCP服务器为客户端分发IP地址，从而来实现中间人攻击。DHCP耗竭攻击可以使用端口安全来得到有效地缓解，因为每个发送的DHCP请求消息中使用一个唯一的源MAC地址。但是，缓解 DHCP欺骗攻击需要采取更多保护措施。使用真实的接口 MAC地址作为源以太网地址，在DHCP负载中使用一个不同的以太网地址。这样就有可能导致端口安全无法发挥作用，因为源 MAC地址此时会是合法的。通过在可信端口上使用DHCP监听可缓解 DHCP 欺骗攻击。DHCP监听DHCP监听并不依赖源MAC地址。它的作用是判断 DHCP消息是否来自于管理员配置的可信或不可信源。接下来，它就会对 DHCP消息执行过滤，并且对来自不可信源的DHCP流量执行限速。所有管理员可以管理的设备（如交换机、路由器和服务器）都是可信源。超出防火墙范围或者网络范围之外的设备都是不可信源。另外，所有接入端口一般都会视为不可信源。这张图显示了一个关于可信端口和不可信端口的示例。在启用了 DHCP监听之后，欺诈 DHCP服务器可能连接的是不可信端口。在默认情况下，所有接口都会被视为是不可信端口。可信端口往往是中继链路，以及与合法 DHCP服务器相连的那些端口。这些端口都必须由管理员手动配置为可信端口。在创建 DHCP表时，其中会包含不可信端口上的设备源MAC地址，以及 DHCP服务器分配给这台设备的 IP地址。MAC 地址和IP地址是绑定的。因此，这个表也就称为DHCP监听绑定表。S1(config)# ip config snooping S1(config)# interface f0/1 S1(config-if)# ip dhcp snooping trust S1(config-if)# exit S1(config)# interface range f0/5 - 24 S1(config-if-range)# ip dhcp snooping limit rate 6 S1(config-if-range)# exit S1(config)# ip dhcp snooping vlan 5,10,50-52 S1(config)# end上面的示例显示了如何在S1上配置 DHCP监听。请注意第一次如何启用 DHCP 监听。然后可以明确信任向上连接 DHCP 服务器的接口。接下来，FastEthernet F0/5 到 F0/24 这个范围的端口均保持默认的不可信端口状态，因此这些端口还设置了每秒 6 个数据包的速率限制。最后，在 VLAN 5、10、50、51、和 52 上启用 DHCP监听。缓解ARP攻击什么是ARP攻击攻击方将自己MAC地址与其他人的IP封装成虚假的ARP报文，使被攻击方不停学习伪装条目，当被攻击方与伪装目标通信时，数据会送达攻击方，攻击方再将数据转发给伪装目标，即可实现双方正常通信情况下窃取通信数据。当然这个过程可以简化成攻击方可以不停的发送一个伪装报文，不停的让被攻击方学习一个或多个条目，实现单向的断网攻击。但无论是双向欺骗还是单向攻击都需要攻击者不断发送ARP报文。动态ARP检测（DAI）动态ARP 检测（DAI）需要使用DHCP监听，可以防止ARP攻击，因为这种特性可以：不会向同一 VLAN 中的其他端口转发无效或无故 ARP 应答。在不可信端口上拦截所有的ARP 请求和应答。每个被拦截的数据包都要接受检验，看它是否具有有效的 IP-MAC 绑定。丢弃并记录从无效绑定关系发来的ARP应答，以防止ARP毒化。如果超出了配置的ARP数据包DAI数量，端口就会进入error-disable状态。要缓解 ARP欺骗和ARP毒化，可以执行下列 DAI实施的指导方针：全局启用 DHCP 监听。在选定的 VLAN 上启用 DHCP 监听。在选定的 VLAN 上启用 DAI。为 DHCP 监听和 ARP 检测配置可信端口。通常建议将所有交换机的接入端口配置为不可信，将所有连接到其他交换机的上行链路端口配置为可信。图中的示例拓扑标识了受信任和不受信任的端口:S1(config)# ip dhcp snooping S1(config)# ip dhcp snooping vlan 10 S1(config)# ip arp inspection vlan 10 S1(config)# interface fa0/24 S1(config-if)# ip dhcp snooping trust S1(config-if)# ip arp inspection trust还可以配置 DAI 以检查目的或源 MAC 和 IP 地址：目的 MAC - 根据ARP正文中的目的MAC地址检查以太网报头中的目的 MAC 地址。源 MAC - 根据ARP正文中的发送方MAC地址检查以太网报头中的源 MAC 地址。IP 地址 - 在 ARP 正文中检查无效和意外IP地址，包括地址 0.0.0.0 和 255.255.255.255 以及所有IP组播地址。在Config输入下方命令可以配置 DAI，在IP地址无效时丢弃ARP数据包。它可用于ARP数据包正文中的 MAC 地址与以太网报头中指定的地址不匹配的场合。ip arp inspection validate {[src-mac] [dst-mac] [ip]}缓解STP攻击PortFast和BPDU防护攻击者可以操纵生成树协议（STP），通过伪造根网桥和更改网络拓扑的方式发起攻击。为了缓解生成树（STP）操纵攻击，应该使用 PortFast和BPDU（桥协议数据单元）防护特性：PortFast - 可让配置为接入端口或中继端口的接口直接从阻止状态变为转发状态，绕过侦听和学习状态。适用于所有最终用户端口。PortFast只应该配置在那些连接终端设备的端口上。BPDU 防护（BPDU Guard） - BPDU 防护会立即让接收到 BPDU 的端口进入errordisable状态。BPDU防护也应该只配置在那些连接终端设备的端口上，这一点和PortFast特性相同。配置PortFast防护PortFast会绕过STP侦听（listening）和学习（learning）状态，把接入端口等待 STP收敛的时间降到最低。如果在连接到其他交换机的端口上启用 PortFast，则会产生形成生成树环路的风险。可以使用接口配置命令spanning-tree portfast在接口上启用PortFast。另外，也可以通过全局配置命令spanning-tree portfast default以全局方式在所有接入端口上配置 Portfast。要想验证是否 PortFast已经在全局启用，可以使用命令show running-config | begin span或命令show spanning-tree summary进行查看。要想验证是否PortFast已经在一个接口上启用，可以使用命令show running-config interface type/number进行查看，如下面的示例所示。可以特权模式下使用命令show spanning-tree interface type/number detail进行验证。S1(config)# interface fa0/1 S1(config-if)# switchport mode access S1(config-if)# spanning-tree portfast S1(config-if)# exit S1(config)# spanning-tree portfast default S1(config)# exit配置BPDU防护即使启用了 PortFast，接口仍将侦听 BPDU。偶尔可能会收到意外 BPDU，或发生未经授权尝试将交换机添加到网络的操作。如果在启用 BPDU 防护的端口上收到 BPDU，则该端口将进入错误禁用状态。这表示这个端口已经关闭，必须手动重新启用，或者通过全局命令 errdisable recovery cause psecure_violation让它自动恢复。BPDU防护可以使用接口配置命令spanning-tree bpduguard enable在一个接口上启用。另外，也可以使用全局配置spanning-tree portfast bpduguard default在全部启用了PortFast的端口上启用 BPDU防护。要显示有关生成树状态的信息，可以使用命令show spanning-tree summary 。在这个示例中，针对接入模式的端口，PortFast和BPDU防护都是默认启用的。请始终在所有已启用 PortFast 的端口上启用 BPDU 防护。S1(config)# interface fa0/1 S1(config-if)# spanning-tree bpduguard enable S1(config-if)# exit S1(config)# spanning-tree portfast bpduguard default S1(config)# end
开放路径最短优先协议OSPF基础对比RIP对比距离矢量路由协议(RIP)，OSPF协议交换的不是路由条目，而是链路信息，并通过SPF算法计算出最佳路由，链路状态信息内含有路由接口、IP地址、掩码、cost值等，进而形成了链路状态通告（LSA）。基本术语邻居表：也成为邻接数据库，通过Hello包建立邻居关系，包含自己所承认的邻居名单。链路状态数据库（LSDB）：OSPF学来的LSA存放处，同一个区域的LSDB一样路由表：使用SPF算法，算出以自己为根，到达目的地最短、最佳无环路径，形成路由表。通常称为转发数据库，达到目的的最佳路径列表。区域边界路由器（ABR）：位于不同区域边界上的路由器自治系统边界路由器（ASBR）：它连接一个OSPF域与其他路由协议域（比如BGP），简单来说就是沟通OSPF与其他协议的桥梁OSPF区域OSPF虽然不受路由器数量限制，但是网络中路由器太多，相互交换的LSA也会增加，随之而来的网络负担也会变大，因此需要给OSPF路由器划分区域。区域主要分为两种：骨干区域，又叫传输区域常规区域常规区域主要限制了这一个区域之间的通信，多个常规区域之间一般是相互隔绝的，如果它们之间进行通信需要经过骨干区域转发。因此常规区域一定与骨干区域相连。OSPF寻路OSPF寻找最佳路径采用Dijkstra算法，也叫最短路径优先(SPF)算法：在同一个区域每个路由器都有一个相同额链路状态数据库每台路由器建立由本身为根到目的的树（即然是树，则无环）到特定目的总成本最低的链接放入路由表一段链路的成本或者说度量的计算如下（默认情况）：$$ Cost = \frac{10^8 bps}{Bandwith} $$到达目的的链路总成本为每段链路成本之和：$$ TotalCost = \sum_{i=1}^{n} Cost_i $$此处带宽的单位为bps(比特每秒)，其中参考带宽在默认情况下为1E8 bps这里需要注意，在使用默认值的情况下，我们无法比较百兆带宽和千兆带宽哪个好（本文对于带宽的单位都以比特每秒为基础，例如百兆为100Mbps）。当带宽为100Mbps的时候，代入公式成本为1；当带宽为1000Mbps的时候成本为0.1，按1算。可以通过修改参考带宽来区分百兆和前兆网络，在思科路由器上可以采用一下命令：Router(config)#router ospf 100 Router(config-router)#auto-cost reference-bandwith ref-bw其中ref-bw为你需要设置的参考带宽的值，范围在1-4294967M/s还有一种方式是直接设置成本（假设入方向接口为g0/0）Router(config)#interface g0/0 Router(config-if)#ip ospf cost int-cost其中int-cost替换为你所需要设置的值，范围在1-65535之间。关于该算法具体流程请参考数据结构与算法。OSPF报文格式OSPF报文头OSPF报文头如上图所示，包含如下字段：Version: OSPF版本，占用1字节，OSPFv2此处为2，OSPFv3此处为3Message Type: 报文类型，占1字节。1表示Hello报文，2表示DD报文，3表示LSR报文，4表示LSU报文，5表示LSAck报文。Packet Length: OSPF报文总长度（包含头部和主体），占用2字节。Router ID: 发送方路由器ID，与IP地址长度一致，占用4字节。Area ID: 发送报文路由器接口的所属区域ID，占用4字节。Checksum: 除了认证信息以外的报文的校验和，占用4字节。AuType: 校验方法，0表示不验证，1表示简单验证，2表示MD5验证，占用2字节。Authentication: 认证信息，占用8字节。验证类型为0时未定义，验证类型为1时该字段是密码信息，类型为2时该字段包括Key ID、MD5验证数据长度和序列号的信息。MD5验证数据添加在OSPF报文后面，不包含在Authentication字段中，占用8字节我们来看下报文内容，以下图片要拼接上上图的报文头才是一段完整的OSPF报文。Hello报文Hello报文内容部分（不包括报文头）如上图所示：Network Mask：Hello报文发送的路由接口对应的子网掩码，占4字节。HelloInterval：表示Hello报文的时间间隔，单位为sec，占用2字节。Options：表示可选项，占用1字节。E表示允许泛洪AS-External LSA（5类），MC表示转发IP组播报文，N/P表示处理Type-7 LSA（7类LSA），DC表示处理按需链路，占用1字节。Rtr Pri：表示DR优先级，默认为1，如果为0表示不参与DR/BDR选举，占用1字节。Router Dead Interval：表示失效时间，在此时间内未收到邻居发来的HELLO报文，则认为邻居失效，占用4字节。Designated Router：表示本网段DR的接口地址，占用4字节。Backup Designated Router：表示本网段BDR的接口地址，占用4字节。Neighbor：表示邻居类表，以router ID的方式呈现，占用4字节。DD报文（DBD）Interface MTU：表示发包接口所能发出的数据包的最大长度，单位为字节，在部分片的情况下，此接口最大可发出的IP报文长度，由OSPF虚链路发出的DD数据包接口的MTU字段必须设置为0，占用2字节。Options：可选项，E表示允许泛洪AS-External LSA（5类），MC表示转发IP组播报文，N/P表示处理Type-7 LSA（7类LSA），DC表示处理按需链路，占用1字节。I位：表示邻居双方发出的首个DD数据包，当发送多个DD报文的时候，如果这是第一个DD报文，则置为1，否则置为0，占用1位。M位：表示DD数据包未发送完毕，当多个DD报文发送时，如果这是最后一个DD报文，则置为0，如果不是则置为1，表示后面还有其他DD报文，占用1位。MS位：表示主从，当两台OSPF设备交互DD报文时，需要确定双方主从关系，router-ID大的一方成为主路由器，置为1时表示DD交互过程中，发包路由器为主路由器，置为0时则为从路由器。DD sequence number：表示由主路由器设置的唯一序列号，在数据库交换过程中使用，只有主路由器才能增加此字段的值，主从双方利用序列号保证DD报文传输的可靠性和完整性（隐式确认），占用4字节。LSA Headers：用于描述本端运行OSPF设备的LSDB信息，在协商主从关系时，发送的DD报文是不包含LSA Headers。LSR报文LS Type：表示指定所需的LSA类型，常见的有6类type-1：Router LSA，type-2：Network LSA，type-3：Network Summary LSA，type-4：ASBR Summary LSA，type-5：AS External LSA，type-7：NSSA LSA，占用4字节。Link State ID：LSA标识，用于与LS Type一起描述路由域中唯一一个LSA，占用4字节。Advertising Router：表示产生该LSR路由器的Router-ID，占用4字节。LSU报文Number of LSAs：LSA的数量，占用4字节。LSAs：回复LSR报文请求的完整LSA信息。LSAck报文通过LSA的头部信息确认收到该LSAOSPF基本原理LSA每个LSA在LSDB中都有一个序号。此序号的大小为4个字节，则编号有2的32次方个，数字范围从0x80000001到0x7FFFFFF。此处我们先来看看0x80000000的二进制位为1000 0000 0000 0000 0000 0000 0000 0000，最高位为符号位，后面的31位为序号位，并不是值位，也就是说1后面的31位为000 0000 0000 0000 0000 0000 0000 0000表示为1，其含义为负数中从小到大的第一个数，即int32类型的最小值-2147483648。而对于0x7fffffff来说，符号为为0，是一个正数，而后面的31个序号位都为1，表示2的31次方，也就是2147483647。换句话说，LSA编号的范围与int32类型的范围一致。我们回到LSA上来，对于LSA有如下情况：每个30分钟路由的LSA进行一次泛洪，以保证LSDB同步，每次序号+1最终一个LSA会从0x7FFFFFFF循环回0x80000001，如果发生这种情况，这个LSA会被路由器将老化时间设置为60分钟，并从LSBD清除。当路由接收到两个一样的LSA，序号最高的就是最新的。当路由器接收到一条LSU报文的时候，判断LSA在本地是否存在，判断要素有三个：LSA类型Link IDADV-router（通告路由器）上述三要素如果存在任何一个不同，那么这条LSA在本地不存在。如果这条LSA是首次更新，之前不存在，就直接放到数据库表内，回应LSAck报文。如果这路由器外还连接着其他路由，则继续泛洪给其他路由，5秒后，运行SPF算法，更新本地路由表。如果之前存在，判断是否是最新的，通过序号大小决定是否最新：如果序号不同，序号比现在大则添加到数据库，序号小则不采纳。如果序号相同，则会忽略掉这条LSA，仍然回应LSAck到邻居。（Tips：判断序号是否相同，不光可以比较序号，还可以看生存时间和校验和）Hello包通过发送Hello包，建立邻居关系形成邻居表。Hello发送时间间隔根据网络类型而定：10秒：以太链路、P2P链路（PPP、HDLC、帧中继点对点字接口）30秒：NBMA（非广播-多路访问网络 Non-Broadcast Multiple Access）—— 帧中继字接口或帧中继多点子接口等、点到多点、点到多点非广播Dead Time是Hello时间等4倍多路访问网络（MA网络），是指一条物理信息可以发送给同一个网络上的其他路由器，其类型有两种：BMA广播型多路访问网络（如一台二层交换机上连着多个路由器）NBMA非广播型多路访问网络影响邻居建立要素如下：Router ID必须不一致Hello与dead时间必须一致区域ID一致认证一致MTU一致特殊区域字段一致MA接口掩码一致两边都放弃选举两台互联的OSPF路由器不会上来直接交换整个LSA，而是先交换LSA目录，然后根据目录缺少的条目，再向邻居请求。当路由收到具体的请求内容消息的时候，回应请求的更新，这里面有真正的LSA。当请求方接收到LSA后，要回应确认包，确认包只针对Update包确认，区别于EIGRP。综上，大致分为5步：A-B先通过Hello建立邻居交换LSA目录针对没有的进行具体请求回应邻居的请求，包含具体LSA请求方收到LSA后进行更新并回复确认包Router ID每一个路由器都有一个唯一的Router-ID来区分不同路由器，形式类似于IP地址（点分四段十进制数，32位字符串，但不是IP地址）。Router ID配置有如下优先情况：在OSPF配置模式下，使用Router ID配置一个路由器ID如果回环接口（loopback interface）配置了IP地址，那么该地址为Router-ID。如果有多个回环口，则使用这些接口里最高的IP地址。无回还接口，则ID是路由器上活动接口中最高的IP地址。我们使用Cisco路由器为例，来进行演示6Router(config)#interface loopback 0 Router(config-if)#ip address 172.16.17.5 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#do show ip ospf注意如果OSPF进程如果已经运行，要想使配置生效，必须在特权模式下执行clear ip ospf process重新启动OSPF进程才行。通过show ip ospf命令，我们可以看到当前Router ID与我们配置的loopback 0接口的IP是一致的。我们再来使用router-id命令来手动设置ID试一试。顺带一提，Cisco路由器OSPF默认进程号为100，也就是说要进入进程号为100的OSPF进程配置模式下修改！进入OSPF进程配置命令如下，这个命令后如果跟别的数字则会激活别的OSPF进程。Router(config)#router ospf 100 Router(config-router)#router-id 1.1.1.1 Router(config-router)#exit Router(config)#do clear ip ospf process Reset ALL OSPF processes? [no]: yes Router(config)#do show ip ospf我们可以看到Router-ID已经变成了刚才指定的1.1.1.1OSPF五种网络类型数据链路层我们先来看下数据链路层的一些东西，OSPF网络类型与数据链路层的这些对应。Point-to-Point点到点子接口(HDLC，PPP，Frame Relay)Multiaccess多访问网络：分为，Broadcast广播的多路访问网络（Ethernet，以太网）和Nonbroadcast multiaccess非广播型多路访问(NBMA)OSPF网络类型前三种与数据链路层对应P2P点到点广播型多路访问非广播型多路访问后面两种要想用，只能修改接口连接类型点到多点、点对点的集合点到多点的非广播其实还有一种特殊的网络类型（五种网络类型有六个不是很正常吗，雾OWO）Loopback我们考虑OSPF网络类型主要是因为以下几种问题：是否需要DR/BDR选举是否自动建立邻居分别使用的目标更新地址五种网络类型的Hello时间间隔32位主机路由的特殊类型DR/BDR选举DR/BDR选举可谓OSPF非常重要的一个环节。为什么需要选择DR和BDR多接入网络对OSPF的LSA泛洪提出了两项挑战：建立多边邻接关系：以太网可能会在普通链路上出现许多OSPF路由器，不需要也最好不要与每台路由器都建立邻接关系。如果邻接关系过多，则会导致网络内路由器间交换大量LSA。LSA大量泛洪：OSPF初始化或者拓扑发生变化时，链路状态路由器就会泛洪自己的LSA，该过程的量和时常可能会非常大，导致网络拥塞。选举过程解决上述提到的问题的方案就是选出DR（指定路由器），在存在DR的情况下，如上图右侧，ABCE路由器所有更新信息都会发送给DR，DR将拥有最完整的数据库信息，之后借由DR告知ABCE对应的邻居路由器更新条目。DR的选举依靠Hello包的优先级和Router-ID：优先级最高的为DR，次高为BDR优先级相同，Router-ID高的为DR，次高为BDR不是DR和BDR的路由器被称为DRother总之，DR和BDR选举都是通过优先级——RouterID的顺序来进行的。这里需要注意，在OSPF协议中数值大的就越高，在其他一些协议中有些是数值越小越高。在Cisco路由器中可以这样来设置优先级：Router(config-if)# ip ospf priority [number]命令中的number范围为0-255（包括0和255）。默认情况下优先级为1，不同的接口可能有不同的值，优先级为0的将永远不参与竞选DR和BDR。当BDR失效后，重新选举BDR。当DR失效，但BDR没有失效，则原来的BDR变成DR，再重新选举BDR。选举期一般为40秒，在选举期外不存在抢占。DR与BDR选举完成后，DRother只和DR/BDR存在邻接关系，所有路由器将组播Hello包到地址224.0.0.5，以便它们能跟踪消息。对于LSU，DRother只组播到224.0.0.6，只有DR和BDR会监听这个地址。维护路由信息我们来看上图，当A下面的网络变化时，A向224.0.0.6发送LSU，告知DR，DR向224.0.0.5发送LSU告知DRother。在这个过程中BDR也是在监听DR与DRother的消息的。如果BDR不这样做，当DR失效，但是没有来得及通知BDR，导致原BDR称为DR时仍认为A下的网络是有效的。邻居状态机介绍OSPF接口可以处于以下8种状态：停止Down：OSPF没有与任何路由器交换信息尝试Attempt： 仅存在NMBR环境中初始Init：路由器接收到一个Hello分组后进入该状态双向Two-way：在邻居报文中看到自己的ID后进入该状态准启动Exstart：通过第一次DBD报文来确定邻居间的主从关系交换Exchange：通过DBD交换LSA的头部信息加载Loading：发送LSR和LSU完全邻接Full adjacency：完成了邻接关系的完整建立OSPF状态过渡流程如下图所示Down状态本地一旦发出Hello包就立即跳出Down状态，进入下一状态。因此Down状态即为没有启用OSPF状态，邻居失效后也是该状态。当启用OSPFv2的时候，已经启用的Gigabit Ethernet 0/0从Down状态变为Init状态。R1开始通过所有启用OSPF协议的接口发送Hello数据包，发现要建立临接关系的OSPF邻居（此时为自动发现邻居模式，此状态看不到；当手动指定邻居的时候可以看到邻居表里有Down状态）。这里有一个问题，当R1发送Hello包的时候应当是处于哪种状态？其实很简单，R1的G0/0接口在宣告OSPF进程的时候，就会发送Hello包，但是对端没有邻居，所以看不到Down状态（Down是与邻居关系的状态，没邻居看不到此状态）。第一个Hello包含内容大致如下：自己的Router-ID（不能一致）Hello时间（必须一致）Dead时间（必须一致）区域（必须一致）特殊区域字段（必须一致）认证（必须一致）注意对于此Hello包是进行组播到224.0.0.5，但是对于回包是单播。Init状态R2从R1接收Hello数据包，并将R1的Router-ID添加到R2的邻居列表。随后R2向R1发送Hello数据包（单播），数据包在同一接口的邻居列表中包含R2的Router-ID与R1的Router-ID。（在R1收到这个包之前，R1都是Init）上图中Router-ID为3.3.3.3的代表R3，4.4.4.4的为R4，其余同理。我们来看上方图中R3和R4各自的邻居关系。我们手动指定R4将R3点包过滤掉，但是R3可以接受R4的包。令R3发送Hello包给R4，R4将包丢弃，因此在上图的R4邻居表中是没有R3的信息的。然而R4发送给R3一个Hello包，但是R3能接收到，所以R3的表中有R4的信息，且R4的状态显示为Init状态。简单来讲，收到一个不包含自己信息的Hello包进入Init状态。因此对于最上方图中的R1和R2，当R2接受到来自R1的Hello包的时候，R1并不知道R2的表中是否已经包含了R1的Router-ID，所以R1此时状态为Init，直到R1收到我们上方所说的R2的包的时候。可以看出Init状态是一个很短暂的状态，如果长期处于该状态一般是不正常的。Two-way状态R1接收到了来自R2的Hello包后，把R2的Router-ID添加到本地的OSPF邻居表中。另外，R1还看到了R2的邻居表中包含R1的Router-ID，说明双方都知道了各自的Router-ID，此时R1就可以放心地进入Two-way状态了。总结来讲就是，收到一个包含自己信息的Hello包即进入Two-way状态。Two-way状态后接下来会怎么做取决于邻居之间的链路：如果它们之间的链路为点对点(P2P)的话，会立刻从Two-way进入ExStart状态如果它们之间通过通用的以太网（严格来讲应该是多访问链路）相互连接，则开始选举DR和BDR，此时Two-way状态会停留40s，也就是我们在前文中提到的40s选举期这里说明下，之所以进入选举，是因为接下来的状态DBD需要自己确认自己就必须选出Master来主持。ExStart状态当Hello数据包用于建立邻接关系的时，在交换和同步LSDB的过程中，使用其它四种类型的OSPF数据包。在ExStart状态下，这两个路由器确定是哪个路由器首先发送DBD数据包。当处于ExStart状态时，都认为自己是主的，告诉别人自己的Router-ID，并说明准备发送DBD了，在相互传递完信息后，了解到谁的Router-ID大，谁发送DBD。ExChange状态使用LSAck数据包确认收到DBD。R1收到来自主路由R2的DBD后，将收到的信息与其LSDB中的信息进行比较，如果DBD数据包有较新的链路状态条目，路由器将转换为Loading状态。然后，R1将DBD数据包发送到R2，R2确认R1。在ExChange状态下，两个路由器交换一个或者多个DBD数据包。DBD数据包包括路由器LSDB中显示的LSA条目报文头的相关信息。条目可与链路有关，也可与网络有关。每个LSA条目报头包括关于链路状态类型、通告路由器的地址、链路开销以及序列号信息。路由器使用序列号来确定接收到的链路状态信息的更新程度。Loading状态该状态下使用LSR和LSU用于获取更多的路由信息。路由使用SPF算法进行处理。当如图所示，R1向R2发送与网络172.16.6.0有关的完整信息，同样，R1接收到LSU时，它会发送LSAck。R1岁后将新的链路状态添加到其LSDB。Full状态当所有LSR满足特定路由要求时，邻接路由器被视为已同步并处于Full状态。OSPF路由器只会在以下情况发送LSU更新：发现更改时（增量更新）每30分钟Full状态表示路由器已经收敛。关于DBDDBD实际上是自己确认自己。第一步：当Init状态的时候交互DBD，此时DBD内容是空的。第二部：交互DBD时期，此时含有真正内容的DBD报文，此步骤后进入ExChange状态再谈LSALSA类型type 1 LSA - Router LSAtype 1 LSA有如下特点：只在本区域洪泛，不会穿越ABR每一个运行OSPF的路由器都会生成一个路由器LSA内容包括路由信息（前缀、掩码）和拓扑信息（另一个路由的Router-ID和自己的IP）Link-ID为路由器的Router-IDtype 2 LSA - Network LSAtype 2 LSA有如下特点只在本区域洪泛，不穿越ABR由MA（广播型和NBMA，选DR/BDR的网络）网络的DR产生内容需要联合type 1 LSA一共描述出网络的拓扑与路由Link-ID为DR接口的IP地址type 3 LSA - Network Summary LSA洪泛于整个自治区域起源于ABR，每经过一个ABR通告路由器会发生改变（简单来讲，就是ABR1发送type 3 LSA被ABR2接收到，ABR2替换该LSA中的某些字段为ABR2的信息，这样ABR2区域下的路由就不知道ABR1存在，只知道ABR2）type 3 LSA用于通告一个区域的信息给其他区域，包含一条路由信息（这里的意思是，Area1中有几个路由信息就产生几条LSA）描述链路的网络号和掩码Link-ID为这条路由信息的前缀默认情况下，没有路由的自动汇总，type 3 LSA通告每个子网。由于扩散范围广，所以需要手动汇总。一个良好的网络规划，每个区域应该利于做OSPF手动汇总。type 4 LSA - ASBR Summary LSA原则来讲洪泛于整个OSPF自治区域，但实际上范围与区域结构的设计有关起源于ABR，当一个ABR监测到ASBR存在时，它会生成一个type 4 LSA广播到OSPF所有区域。type 4 LSA包含如何到达该ASBR的路由信息，使得其他区域内的路由可以知道该ASBR。Link-ID为ASBR接口的Router-IDtype 5 LSA - External Summary LSA洪泛到OSPF所有区域起源于ASBR，当ABR收到该LSA时会转化成type 4 LSA然后洪泛到其他区域包含表示外部路由信息Link-ID：通常是目标网络的地址type 6 LSA - Multicast OSPF LSA当有多个自治系统（AS）时，每个AS可能由多个组织构成，该LSA在组织内部洪泛。该LSA包含AS内部的路由策略和标记等。type 7 LSA - NSSA LSA只在NSSA内部传播，NSSA是非完全稳定区域，是OSPF的一个扩展，这些区域内部的ASBR生成type 7 LSA而非type 5 LSA起源ASBR，该LSA用于表示外部路由信息当该LSA被NSSA ABR接收，会被转换成type 5 LSA，然后在非NSSA区域进一步洪泛。Link-ID通常为对应的外部网络的网络地址。type 8 LSA - Link Scoped Prefix LSA链路范围前缀LSA，用于传播链路本地地址和链路范围前缀。在链路内部洪泛。在链路上如果有多个节点配置了相同的本地链路地址或者链路范围前缀，为了避免冲突需要type 8 LSA将这些信息传播到其他链路。Link-ID为对应接口的接口ID总结其实OSPF协议的用法远不止这些，还有很多复杂的问题需要具体分析。诸如6类、8类等LSA对于一般的网络并不常用。
距离矢量路由协议RIP(含Cisco模拟器实验配置)
距离矢量路由协议RIP(含Cisco模拟器实验配置)简介距离矢量路由协议（Routing Information Protocol, RIP）是一种内部网关协议，它位于应用层，使用520 UDP端口。RIP基于距离矢量算法（Bellham-Ford）根据metric来衡量目的地址的距离。原理基本原理对于RIP协议，路由器只会和相邻的路由器交换路由表，通常包含：目的网络距离下一跳路由RIP规定每经过一个路由器跳数加1，最多15跳，当一个路由条目对应的跳数为16跳的时候会被认为距离是无限大，即不可达。RIP工作流程如下：路由器激活RIP，立刻发送一个Request报文和一个Response报文，并开始监听链路上的RIP协议报文。对应的接口会周期性发送Response报文。一个Response报文最多携带25个路由条目，当超过这个数字时使用多个报文。当另一启用了RIP的路由器接收Request报文后，会使用相应的Response报文回应，并在该报文中携带对应的路由信息。当另一启用了RIP的路由器接收Response报文后，会解析该报文中的路由信息，如果报文中的路由条目是自己未发现的，并且路由的度量值有效，则路由器将学习该路由并加载到路由表。（同时设置度量值、出接口、下一跳）计时器RIP主要有四个计时器：更新计时器（Update timer）：每次更新 30 seconds RIP，都是完整路由表，不过要排除被 split-horizon 抑制的路由条目。 为了防止路由表全局同步，update timer 值被设计成一个小范围内的随机值 (25-35s),思科路由器上一般为 25.5-30s。随机值的意义在于防止同时更新洪泛Response报文导致不必要的冲突。失效计时器（Invalid timer）：路由器在 180s 内没有收到特定路由条目的更新，则视此路由条 目为非法或不可达，将它的 hop count 设置为 16。启动失效计时器，标志这条路由条目失效，并且这个路由器会给所有相邻的路由器发送更新消息通告这条路由条目失效。标记为 16 跳。刷新计时器（Flush Timer或garbage collection timer flush）： 计时器满时，该路由条目将会从路由表中被移除，默认为 240s。抑制计时器（Holddown Timer）： 只有当失效计时器周期结束时，抑制计时器才会被激活。一旦路由器收到了关于某条路由条目的更新，并发现其 metric 值比本路由表中记录的 metric值大时，将会对这条路由设置 holddown timer,直至计时器周期结束才会接受这条次优路径，默认为 180s。缺点RIP协议有如下缺点：过于简单，以跳数为依据计算度量值，经常得出非最优路由。例如:2 跳 64K 专线，和 3 跳 1000M 光纤，显然多跳一下没什么不好。度量值以 16 为限，不适合大的网络。解决路由环路问题，16 跳在 rip 中被认为是无穷大，RIP是一种域内路由算法自治路由算法，多用于园区网和企业网。收敛性差，时间经常大于 5 分钟。消耗带宽很大。完整的复制路由表，把自己的路由表复制给所有邻居，尤其在低速广域网链路上更以显式的全量更新。容易产生环路（先天缺陷，有后天的防环机制）缺少主动发现网络变化机制(无拓扑信息，不知道全网链路，只知道自己直连)防环机制在刚在我们就说到过，RIP协议发送路由表，如果路由表相互包含则容易产生环路。协议本身就容易导致环路，故需要一系列防环机制：跳数上限：上限16跳，设定包的生命周期，这在一定程度上减少了环路产生带来的问题，但无法避免。水平分割：不向原始路由更新来的方向再次发送路由更新信息，即单向更新、单向反馈。可以进入某个接口，使用命令 no ip split-horizon 关闭水平分割。例如，R1路由从Fa0/0接口向R2路由的Fa0/1接口发送路由信息，对于R2来讲不再从Fa0/1接口发送路由更信息。路由毒化：又叫路由中毒。若 RIP 的路由条目出现故障时，会立即将此路由标记为 16 跳，并发送给邻居，告知邻居此路由有问题，尽快删除。抑制计时器：抑制计时器告诉路由器把可能影响路由的任何改变暂时保持一段时间， 抑制时间通常比更新信息发送到整个网络的时间要长。毒性逆转：如果Z的最短路径要通过邻居Y，那么它将告诉Y自己到目的节点的距离是无穷大。这样，Z向Y撒了一个善意的谎言，使得只要Z经过Y选路到X，它就会一直持续讲述这个谎言，这样Y也就永远不会尝试从Z选路到X了，也就避免了环路问题。由于这个方案不用路由间更新报文，所以优先于路由毒化。触发更新与Silent模式触发更新（Trigger Update）与周期性更新不同，它不会触发接收端的路由器重置其 update timer, 因为这样会引起许多路由器在同时重置它们的 update timer,最终导致全局路由同步，而这是我们不希望看到的。 同时为 了避免 trigger storm(触发更新风暴)，会产生一个随机值(1-5 秒)， 连续的触发更新必须等待相 应的时间才可再被发出。 当路由表发生变化时，更新报文立即广播给相 邻的所有路由器，而不是 等待 30 秒的更新周期。同样，当一个路由器刚启动 RP 路由协议时，它广播请求报文。收到此广播 的相邻路由器立即应答一个更新报文， 而不必等到下一个更新周期。这样，网络拓扑的变化会最快 地在网络上传播开， 减少了路由循环产生的可能性。Silent模式（Silent Mode） 在 UNIX 系统上，使用 routed -q 参数可以将 RIP 置于一种“silent”模式，这种模式下不会主动发送路由更新，只是监听并根据需要修改自已本地的路由表。RIPv1报文结构RIPv1报文结构如下图所示下面来说说各个字段的功能：命令(Command)：用于标识RIP报文类型。当值为1的时候，报文为Request；当值为2的时候，报文为Response类型。版本(Version)：在RIPv1中，该字段为1。地址簇标识符(Address Family Identity AFI)：该字段为2的时候表示IP协议；该字段为0表示且报文为Request类型，则说明用于向直连路由请求整个路由表，同时仅包含一个路由条目，目的IP地址为0.0.0.0，度量值即metric跳数为16。IP地址(IP Address)：路由的目的网络地址。度量值(Metric)：到达目的网络的开销值。问题通过报文结构我们就能看到缺少了一个很重要的东西——子网掩码。没错，RIPv1版本协议并不支持在报文中携带目的网络的子网掩码。因此，有类别路由选择协议首先必须匹配一个目的地址对应 A,B,C 类的主网络号，对于每一个通过路由器的数据包有如下操作：如果目的地址是一个路由器直接相连的主网络的成员，那么该网络的路由器接口 上配置的子网掩码将被用来确定目的的地址的子网，因此，在那个主网络中必须自始至终 地统一使用这个相同的子网掩码。如果目的地址不是一个和路由器直接相连的主网络的成员，那么路由器将仅仅尝 试去匹配该目的的地址对应于A类，B类或 C类的主网络号。我们抓包看一下：更详细的信息如下图：由此可得知：RIPv1 仅支持有类路由协议，并且在路由更新中不发送子网掩码。使用广播每 30 秒(实际是 25.5-30 秒)发送一次完整的更新。此外RIPv1还不支持口令验证，这具有一定的不安全性。解决问题最省心的方案要么换协议，要么启用RIPv2版本。如果非要用RIPv1，可以给路由器配置第二个IP地址，使其成为一个连续的子网。所谓连续的子网：母网相同，子网掩码一致。例如：192.169.1.0/24与192.168.2.0/24。实验接下来我们通过Cisco Packet Tracer模拟器来看一下。在上述样例中，各个路由器的Fa0/0端口都与对应的交换机相连，该接口地址为下方对应标签的第三行，例如R1路由器的Fa0/0接口IP地址为172.18.0.64子网掩码为255.255.255.192。此时下方主机的默认网关也是这个地址。同样的下方标签的第一行为主机地址，例如PC01的地址为172.18.0.10。其余接口的IP已经在相应链路上给出。例如R1 Se0/1/0接口IP为10.0.0.1/30。迅速对上述拓扑完成基本配置：//R1 en config t int f0/0 ip address 172.18.0.62 255.255.255.192 no shutdown int s0/1/0 ip address 10.0.0.1 255.255.255.252 no shutdown //R2 en config t int f0/0 ip address 172.18.0.126 255.255.255.192 no shutdown int s0/1/0 ip address 10.0.0.2 255.255.255.252 no shutdown int s0/3/0 ip address 10.0.0.5 255.255.255.252 no shutdown//R3 en config t int f0/0 ip address 172.18.0.190 255.255.255.192 no shutdown int s0/3/1 ip address 10.0.0.6 255.255.255.252 no shutdown上述命令并没有给出特定的模式，直接打开路由的CLI然后复制粘贴进去（别复制注释）就行，我们的重点不在此处。（如果你不懂此处命令请参考我之前关于交换机和路由器基本配置的文章。）接下来我们启用RIP在R1上，我们用RIPv1宣告直连的网络R1(config)#router rip R1(config-router)#v 1 R1(config-router)#network 172.18.0.0 R1(config-router)#network 10.0.0.0 R1(config-router)#exitR2和R3也是同理R2(config)#router rip R2(config-router)#v 1 R2(config-router)#network 172.18.0.64 R2(config-router)#network 10.0.0.0 R2(config-router)#network 10.0.0.4 R2(config-router)#exitR3(config)#router rip R3(config-router)#v 1 R3(config-router)#network 172.18.0.128 R3(config-router)#network 10.0.0.4 R3(config-router)#exit在R1上执行debug命令R1#debug ip rip发现弹出如下信息观察上图，发送的目的地址都是255.255.255.255，这说明v1使用广播在R1中使用命令，查看数据库中学习的条目R1#show ip rip database 再看看路由表R1#show ip route信息如下Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area * - candidate default, U - per-user static route, o - ODR P - periodic downloaded static route Gateway of last resort is not set 10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks C 10.0.0.0/30 is directly connected, Serial0/1/0 L 10.0.0.1/32 is directly connected, Serial0/1/0 R 10.0.0.4/30 [120/1] via 10.0.0.2, 00:00:24, Serial0/1/0 172.18.0.0/16 is variably subnetted, 2 subnets, 2 masks C 172.18.0.0/26 is directly connected, FastEthernet0/0 L 172.18.0.62/32 is directly connected, FastEthernet0/0发现找不到对应的主机网络的条目——不存在172.18.0.64和172.18.0.128网络。这正是因为RIPv1没有传递子网掩码的功能，且子网不连续造成的。另外，对于同一网络，若该路由既有直连又从其它路由器中接收到条目，由于直连网络matric值比从其它路由收到的条目小，所以并不会更新条目。我们给对应的PC设好IP地址之后发现也是Ping不通的（此处不演示）。我们尝试给路由器之间的链路分配与主机网络相连续的网络的IP地址试一试。R1(config-if)#ip addr 172.18.1.1 R1(config-if)#ip addr 172.18.1.1 255.255.255.192R2(config)#int se0/1/0 R2(config-if)#ip addr 172.18.1.2 255.255.255.192 R2(config-if)#int se0/3/0 R2(config-if)#ip addr 172.18.2.1 255.255.255.192R3(config)#int se0/3/1 R3(config-if)#ip addr 172.18.2.2 255.255.255.192然后尝试在PC1上Ping PC3ping 172.18.0.130见证奇迹的时刻到了，我们的网络竟然Ping通了！由此可见对于RIPv1不发送子网掩码，我们需要使用连续的子网来解决问题。但是这种解决问题的方式经常不符合我们的规范，在某些特定的情况下我们就想要不连续的子网，然后就有了RIPv2协议。RIPv2报文结构RIPv2版本报文结构如下图我们发现相比于RIPv1，v2版本的报文头多了网络掩码、下一跳、路由标记这几个字段。我们一下仅介绍与RIPv1不同的字段：版本(Version)：在RIPv2中该字段值为2。网络掩码(Netmask)：目的网络的掩码。RIPv1没有这一项，不支持可变子网掩码(Variable Length Subnet Mask, VLSM)，而RIPv2支持了这一点。路由标记(Route Tag)：为路由设置标记信息，缺省为0。当一条外部路由被引入RIP从而形成一条RIP路由时，RIP可以为该路由设置路由标记，当这条路由在整个RIP域内传播时，路由标记不会丢失。下一跳(Next Hop)：RIPv2新增，使得路由器在多路访问网络上可以避免次优路径现象。一般情况下，在路由器所发送的路由更新中，路由条目的“下一跳”字段会被设置为0.0.0.0，此时收到该路由的路由器将路由条目加载到路由表时，将路由的更新源视为到达目的网段的下一跳。在某些特殊的场景下，该字段值会被设置为非0.0.0.0。RIPv2的新增功能我们同样来抓一次包：可见RIPv2相比于RIPv1使用组播的方式而非广播。在 RIP 中的身份验证中，路由信息协议 RIPv2 的 Cisco 实现支持身份验证，密钥管理，路由汇总， 无类域间路由(CIDR)和可变长度子网掩码(VLSM)。RIPv2发送路由条目时第一次发送整张表。此外，RIPv2支持自动汇总和手动汇总，自动汇总能关闭（只有关闭自动汇总才能启用手动汇总）。而RIPv1仅支持自动汇总且无法关闭。实验与RIPv1一样，我们构建类似的拓扑为主机配置相应的IP，为路由器设置基本的配置。基础配置方案与RIPv1实验部分一致，我们主要看RIP配置部分：对于R1，我们开启RIPv2，宣告网络R1(config)#router rip R1(config-router)#v 2 R1(config-router)#network 172.18.0.0 R1(config-router)#network 10.0.0.0 R1(config-router)#exit对于R2和R3同理R2(config)#router rip R2(config-router)#v 2 R2(config-router)#network 172.18.0.64 R2(config-router)#network 10.0.0.0 R2(config-router)#network 10.0.0.4 R2(config-router)#exitR3(config)#router rip R3(config-router)#v 2 R3(config-router)#network 172.18.0.128 R3(config-router)#network 10.0.0.4 R3(config-router)#exit使用同样的命令查看R1路由表：R1#show ip route我们发现一个重要的问题：R1 路由表中还是只存在有类网络的路由条目，无法看到具体到达 R3 直连 172.18.0.128/26 的条目！按理说RIPv2支持VLSM，我们应该能在路由表中看到R3的172.18.0.128/26才对。实际上RIPv2的自动汇总是默认开启的，它仍会如v1那样将网络合并汇总，我们需要将自动汇总手动关闭。实际上很简单，只需要在RIP配置模式下执行一条命令即可R1(config)#router rip R1(config-router)#no auto-summary对于R2和R3一样R2(config)#router rip R2(config-router)#no auto-summary R3(config)#router rip R3(config-router)#no auto-summary协议兼容性在配置RIP时，如果不指定版本，接口默认情况下是能接收v1和v2的报文的，但是却只能发送v1的报文；在指定版本的情况下，RIPv1只能接收和发送v1的报文，RIPv2只能接收和发送v2的报文。总结其它命令（加密、查看信息等）基本查看 rip database (从邻居收集来的信息)R1#show ip rip database关闭自动汇总R1(config-router)#no auto-summary 查看 RIP 配置R1#show run | section rip 查看路由表R1(config)#Show ip rout 指定一个接口可以发送的 RIP 的版本R1(config-if)#ip rip send version 2 允许接口的地址和路由选择更新使用全 0 子网R1(config-if)#ip subnet-zero手动开始汇总R1(config)#interface serial 0/3/0 R1(config-if)#ip summary-address rip 10.0.0.0 255.0.0.0 RIP加密R1(config)#key chain cisco //定义 rip 中加密密钥链 R1(config-keychain)#key 0 //定义密钥 R1(config-keychain-key)#key-string cisco //定义密钥值 R1(config-if)#ip rip authentication key-chain cisco //在接口上调用密钥 R1(config-if)#ip rip authentication mode text //选择加密方式 明文 R1(config-if)#ip rip authentication mode md5 //选择加密方式 密文
Cisco路由器配置DHCP服务及中继拓扑示意R1 LAN侧的网段为192.168.10.0/24 默认网关为192.168.10.1R2 LAN侧的网段为192.168.20.0/24 默认网关为 192.168.20.1DNS服务器地址为 192.168.10.2R0的G0/0的地址为 10.1.1.1R0的G0/1地址为 10.1.1.2配置从池中排除地址排除IP地址是为了一些保留些固定IP，防止该IP被分配造成冲突等。例如排除R1的前10个IP以及192.168.10.254（注意配置是在R0上）R0(config)#ip dhcp excluded-address 192.168.10.1 192.168.10.10 R0(config)#ip dhcp excluded-address 192.168.10.254此过程对R2同理。创建并配置DHCP地址池在R0上为R1 LAN侧创建地址池R0(config)#ip dhcp pool R1-LAN设置网络地址R0(dhcp-config)#network 192.168.10.0 255.255.255.0指定该网络默认网关R0(dhcp-config)#Default-router 192.168.10.1指定DNS服务器R0(dhcp-config)#dns-server 192.168.10.2配置域名(没有需求可以不配)R0(dhcp-config)#domain-server example.com中继进入R1的G0/0接口配置模式R1(config)#interface g0/0设置helper-address（配置的地址为离R1最近的R0的接口）R1(config-if)#ip helper-address 10.1.1.1注：如果是一台单独的DHCP提供DHCP服务，此时helper-address地址为DHCP服务器地址（如下图所示）此时上图中R1 G0/0接口配置模式下命令为R1(config-if)#ip helper-address 192.168.11.6注意事项Cisco路由器默认开启DHCP服务，要禁用它需执行以下命令Router(config)#no service dhcp
简单描述标准生成树协议STP生成树协议STP为什么需要生成树如上图所示网络拓扑，如果没有生成树协议，在网络通信开始时，假设PC0向PC1发送一个数据包，交换机S2的MAC地址表中并没有对应的MAC地址，因此会产生ARP洪泛（详情参考交换机自学习算法那篇文章）发送广播帧，由S2的Fa0/1和Fa0/3端口向对端发出。当S1、S3分别接收到广播帧后，根据同样原理进行广播帧转发。这时网络形成了一个环路，但交换机并不知道这将导致广播帧在环路中永远循环下去。随着时间增加，广播帧将会越来越多，最终形成网络广播风暴导致网络瘫痪。（对于交换机的运算速度来讲，网络由正常变瘫痪过程中的时间是非常短的）STP概念由上述描述就可以知道，我们需要一套方案去解决这种问题，所以就有了生成树协议。生成树协议（英语：Spanning Tree Protocol，STP），是一种工作在OSI网络模型中数据链路层的通信协议，基本应用是防止交换机冗余链路产生的环路。用于确保以太网中无环路的逻辑拓扑结构。从而避免了网络广播风暴，大量占用交换机的资源。与图论中所指的生成树概念一致，目的就是为了破环（将环形图变成树形）。STP会阻塞备用链路，当正常线路损坏时会启用备用链路。交换机上默认的STP版本还有多实例生成树（MSTP）、快速生成树（RSTP）等，本文只描述标准版本。生成树协议核心是生成树算法（Spanning Tree Algorithm，STA），下面对STA算法过程进行描述。生成树算法STA交换机是由网桥演变而来的，在描述生成树算法的时候也指代交换机STA大致分为三步：选举根网桥选举根端口选举指定端口并阻塞备用端口选举根网桥选举条件：网桥ID(BID)最小者当选BID由以下两部分构成：优先级交换机的基本MAC地址优先级范围为0-61440，步长4096，默认值为32768看到这里可能会有人问，为什么步长恰好是2的12次方即4096？这并不是巧合，因为这里的步长就是VLAN号（VLAN号使用12比特）BID的比较方法：优先级取值越小，BID就越小若优先级相同，则比较MAC地址，从MAC地址左侧开始比较，数值小的BID就越小选举根端口根端口（Root Port， RP）的选举是在非根网桥（非根交换机）上的，并且在每个交换机上只能存在一个RP。RP用于接收根网桥发来的BPDU，也用来转发普通流量。RP的选举首先考虑BPDU接收端口到根网桥的路径成本最小，其路径成本与链路带宽对应如下（该值不绝对，交换机上可更改）链路带宽成本值4Mb/s25010Mb/s10016Mb/s62100Mb/s191Gb/s410Gb/s2如果存在多个端口到根网桥的成本相同时，则比较对端的BID，对端BID小的本机端口则选举为RP。（注意BID是对端，也就是与参加选举的端口相连的其它交换机的端口，而参与选举的端口是在本交换机上）如果对端BID也相同，则比较对端的端口ID（PID），同样对端PID小的本机端口选举为RP。PID参数如下：范围0-240步长16默认值128端口号（如Fa0/1比Fa0/2小）（其实还存在一种对端BID与PID都相同的情况，详细请看本文 STA举例部分->其他例子->使用集线器的情况）选举指定端口并阻塞备用端口在每一个网段上选出一个指定端口（Designated Port，DP）。DP用于转发根网桥发来的BPDU，也用来转发普通流量。注意：每网段上存在且只能存在一个DPDP的选举条件如下：根网桥的所有端口都是DP根端口的对端端口一定都是DP（反之不一定成立）BPDU转发端口到根网桥的路径成本最小本端的BID最小剩余端口成为备用端口（Alternate Port，AP），它们将被阻塞。STA举例主要例子网络拓扑如下按照上文中的步骤首先选举根网桥优先级都是32768，然后比较MAC地址，S1的MAC地址为00-01-...，比其它地址都小，所以S1是根网桥。然后选取根端口交换机S2的到S1路径上的所有链路都是1Gb/s，所以开销都是4，G0/1到S1的总开销为4，G0/2到S1的总开销为8，G0/3到S1的总开销为12，所以S2的根端口为G0/1。与此同理，S3根端口为G0/1，S4的根端口的为G0/2（G0/2的对端BID比G0/1对端BID小，二者成本相同）。S5的根端口为Fa0/1（Fa0/1与Fa0/2的成本相同，对端BID相同，但Fa0/1对端为S4的Fa0/1，端口号小，所以PID小）。选举指定端口并阻塞备用端口S1为根网桥，所以S1的G0/1与G0/2都是指定端口然后按照第二个条件，所有的RP对端端口都是DP，那么选出来的有：S3的G0/3，S4的Fa0/1剩下的几个网段无法根据第二个条件选出DP，然后根据第三个条件即到S1成本路径最小来选首先来看S4Fa0/2-S5Fa0/2这个网段，到S4Fa0/2成本为8，到S5Fa0/2成本为27，所以S4的Fa0/2端口胜出，为该网段的DP再看S2G0/2-S3G0/2这段链路，这两个端口到S1的开销相同，但是S3的BID比S2小，所以S3的G0/2为该网段下的DP同理S2的G0/3也是DP剩下的端口都是AP其他例子已知条件如下：所有链路带宽都相等（也就是说链路成本值相同）S2 BID < S3 BID那么下图中S4的RP如红圈所示有一种特殊情况，使用了集线器，在S4上Fa0/1与Fa0/2链路成本相同，Fa0/3成本比前两者大，并且Fa0/1与Fa0/2对端BID与对端PID相同，此时比较的是本机端口的PID，如下图所示结束上述仅对STA最基本的情况进行描述分析，实际网络中的情况更复杂，例如某个网桥（交换机）突然掉线、链路损坏、生成树还未生成时交换机发生故障需重新选举等等。