内容目录

ipv6安全是一个系统工程,不能仅仅依赖于某个单一的系统或设备,而是需要仔细分析安全需求,利用各种安全设备和技术外加科学的管理,共筑网络安全。仅从主机安全、局域网安全、网络互联安全和网络设备安全等几个方面阐述ipv6安全。

ipv6安全综述

IPv4环境下,网络及信息安全涵盖的范围很广,从链路层到网络层再到应用层,都会有相应的安全威胁和防范技术。
总体来说,网络安全威胁主要包括嗅探、阻断、篡改和伪造,相应的安全服务又主要包括保密性、完整性、不可抵赖性、可用性、访问控制和安全协议设计等。
IPv6技术虽然在保密性、完整性等方面有了较大的改进,但有些方面仍然面临着和IPv4同样的安全问题。

  • 嗅探侦测
    嗅探侦测虽不能对网络安全造成直接的影响,却是各种攻击入侵的第一步。
    ipv4环境中,攻击者很容易在较短时间内通过各种手段(如黑客工具等)扫描出目标主机和目标端口,原因就是ipv4地址空间相对较小。
    ipv6地址空间太大,盲目地扫描一个网段所消耗的时间会非常多,从这方面讲,ipv6要比ipv4安全。

但在实际应用中,攻击人员并不一定进行大范围扫描,而是借助dns来解析出特定服务器的ipv6地址。
也有一些ipv6服务器在配置ipv6地址时,为了便于记忆,其64位接口id往往只使用很简单的几位或者使用兼容的ipv4地址,这样也容易被快速扫描到。网络系统管理员平时也要注意细节,尽量不使用易记的ipv6地址,同时还要做好dns的系统安全工作,即使修补系统漏洞,并尽量使用ipsec,以减少因嗅探侦测而带来的进一步危害。

  • 应用层攻击
    当今多数的网络攻击和威胁针对的是应用层而非ip层,所以在应用层攻击方面,ipv6面临的安全问题和ipv4是完全一样的。
    针对诸如sql注入、跨站脚本攻击、主页篡改等威胁,都要有相应的web应用防火墙(web application firewall,waf)来实施防护,前提是waf能识别出ipv6的应用。

  • dos攻击
    拒绝服务(denial of service,dos)攻击以及分布式dos攻击在ipv6中依然存在。
    这种攻击通过伪造看似合法的访问来消耗网络带宽或系统资源,从而达到阻止正常服务被访问的目的。
    针对dos攻击,一般只能部署专业的且能识别并屏蔽非法访问的专用设备,以减轻或避免该攻击带来的危害。

  • 路由协议攻击
    路由协议攻击主要指在网络中冒充路由设备发送路由协议包围,以干扰正常的路由协议,从而达到非法入侵等目的。
    IPv4中有相应的防范办法,主要是在路由更新报文中加入MD5认证,防止非法的路由欺诈设备接入网络中。
    IPv6中情况则有了一些变化:BGPIS-IS路由协议继续沿用IPv4MD5认证,而OSPFv3RIPng则建议采用IPSec

  • 过度技术带来的安全隐患
    IPv4IPv6过渡期间,即在IPv4IPv6并存的网络环境中,各种各样的过渡技术层出不穷,但很多过渡技术都只考虑了功能的实现,对安全的考虑有所欠缺。同时在过渡期间,不可避免地会出现各种复杂的网络结构,新的安全隐患也难以完全避免。

  • ipv6自身协议的缺陷
    设计IPv6的初衷就是创建一个全新的IP层协议,而不是在IPv4的基础上修修补补。
    IPv6的一个重要特征就是“即插即用”,但在计算机网络领域,易用性和安全性存在一定程度的对立,只能在两者之间寻找一个可以接受的平衡点
    从目前已知的情况来看,无状态自动配置、邻居发现协议等都存在被欺诈或“中间人”攻击的隐患。
    当然,IPv6也在不断完善,这些因协议自身缺陷所导致的安全问题也越来越受到重视并加以修正。

  • 非法访问
    非法访问即未经授权的访问。在网络中,总是会对访问者的身份进行确认后才开放相应的访问权限。
    一般来说,服务器会设置自身开放的服务端口,以及设置允许访问的客户端IP范围,以尽可能达到防止非法访问的目的。这一般都是使用软硬件防火墙来实现。

  • 扩展报头可能带来的安全问题
    IPv6定义了基本报头和多种类型的扩展报头,虽然这提升了处理效率,但可能存在一些安全问题。
    比如攻击者可构造多个连续无用的路由扩展报头,由此导致防火墙等安全设备难以找到有效的TCP/UDP报头,甚至会导致资源耗尽、内存溢出。
    所以在一般情况下,建议在IPv6中禁止逐跳路由报头、路由报头(类似于IPv4的源路由)等扩展报头。

  • 病毒和蠕虫
    病毒和蠕虫也可以归为应用层安全问题,它与网络层是IPv4还是IPv6并无关系,因此IPv6中也存在这些安全问题。

IPv6网络中,除了上面提到的几点外,还会有其他暂时未被发现的安全问题。
这些问题会随着IPv6的普及逐渐凸显出来,也会越来越受到人们的重视和防患。

IPv6主机安全

在信息时代,攻陷服务器等主机可以获取有价值的信息,而攻击路由器/交换机等网络基础设施则获取不到什么有价值的信息,因此攻击者将注意力更多地集中到有价值的主机上。
当构建一个全面的IPv6安全策略时,不能只考虑使用专门的安全设备来增强网络安全,IPv6主机的安全同样不容忽视。

IPv6主机安全而言,主要目标就是远离网络中的攻击行为,对本机开放的应用服务进行访问限制、关闭不必要的服务端口、对存在安全隐患的应用(包括操作系统)及时修复、对入站的接收包和出站的发送包进行严格的限制、定期对主机进行病毒扫描和查杀等。操作系统的安全加固能大大提升IPv6主机的安全。

IPv4IPv6过渡阶段,主机特别是服务器使用双栈的情况会长期存在,所以IPv4协议和IPv6协议的安全防护同等重要,不能厚此薄彼。
否则,即便IPv6安全做得相当到位,一旦IPv4协议被攻陷,IPv6也会功亏一篑。
IPv6主机的安全,更确切地说,是利用操作系统自身的一些系统管理应用程序对IPv6主机进行安全加固。

IPv6主机服务端口查询

IPv6主机特别是服务器来说,要判断自身是否安全,需要先知道自身运行了哪些应用程序,这些应用程序开放了哪些TCPUDP端口,以及本机端口与其他主机的连接情况。
TCP/IP应用遵循客户端/服务器模型,作为服务器的主机在特定的TCPUDP服务端口上监听,等待来自客户端的连接。
通过查询本机哪些端口处于监听状态,也可以识别自身正在运行的网络应用程序。

  • 查看linux主机的服务端口
    较新版的Linux内核默认支持并开启了IPv6协议,对于基于Linux内核且支持IPv6的多种操作系统来说,可以使用命令netstat -an -p -A inet6查看IPv6地址上的监听端口。
    也可以只查看IPv6地址上的TCP监听端口,命令是netstat -lntp -A inet6
    要查看本机在IPv6上监听的UDP端口,可以使用命令netstat -lnup -A inet6

需要特别注意的是,CentOS 7.0以上的版本已经用命令ss来替代netstat。如果要继续使用netstat命令,可以先安装net-tools
一个更好的命令是nmap,不过需要事先通过yum install nmap等方式安装后才可用。
要查看本机某个IPv6地址,如本地环回接口地址上监听的服务及端口,可以使用命令nmap -6 -sT ::1
如果发现异常的监听端口和服务,可以通过ps命令查找到进程号,再通过kill –9命令结束进程。

关闭IPv6主机的数据包转发

服务器上一般会配置多个网卡,目的主要有3个:网卡冗余,即当一块网卡发生故障时,可以切换到另一块网卡;
负载均衡,即通过某种算法在多块网卡上同时传输数据,类似于网卡捆绑,可以变相增加带宽,也有一定的冗余作用,这要求对端网络交换机对应的端口也要进行相应的捆绑配置;
业务与管理分离,即管理使用的网卡与正常业务通信使用的网卡分离开来。

当主机拥有多个网卡时,也就拥有了多个网络接口,很多操作系统默认允许在多个网络接口上转发数据,变相地把主机当作网关。
不过这样不仅会消耗主机资源,从安全角度来说也存在着隐患,即当IPv6主机被攻陷时,一些非法流量就会被当作正常流量转发到另一个接口所在的网络中。
在一般情况下,推荐使用转发性能和安全服务性能更好的专业路由器或防火墙,而不是普通主机来充当网关。

  • linux主机上禁止ipv6转发
    对于CentOS发行版的Linux系统,可以通过命令sysctl -a | grep forward来查看本机是否启用了IPv6转发功能。
    如果net.ipv6.conf.all.forwarding=0,则表示已经禁止了IPv6转发,否则可以通过下述多种办法禁用IPv6转发。

    • 修改并确保接口相关的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0中有一项IPV6FORWARDING=no
    • 修改并确保文件/proc/sys/net/ipv6/conf/all/forwarding的内容为0。
    • 修改并确保文件/etc/sysctl.conf中有一项net.ipv6.conf.all.forwarding=0,再执行命令sysctl -p,应用/etc/sysctl.conf中的策略。

主机icmpv6安全策略

IPv4环境下,因为ICMPv4通常用来进行网络连通性的诊断,所以对主机特别是服务器来说,即便将所有的ICMPv4报文都禁止掉,也不会影响主机网络的连通性,服务器也可以被正常访问。
但在IPv6环境下,ICMPv6报文不仅仅用于网络连通性的测试和诊断,NDP、DAD等协议都依赖于ICMPv6报文。
因此,在过滤IPv6主机的ICMPv6报文时一定要谨慎,要确保对报文的操作(如禁止、放行等)准确无误,否则就可能造成预期之外的结果。

一般在对主机执行ICMPv6安全策略时,对于NDP用到的类型134的NS、类型135的NA、类型133的RS、类型134的RA报文,都应该放行;
用于网络连通性测试的类型128回声请求报文和类型129的回声应答报文一般也应该放行;
组播侦听发现(MLD)用到的类型130、132和143报文类型需视情况而定;
类型是1、2、3、4的ICMPv6消息报文等也应该放行。
除了上述报文,其他的ICMPv6报文都可以禁止。
主机ICMPv6的安全策略如下所示。

file

关闭不必要的隧道

当主机处于纯IPv4环境而又想接入IPv6网络时,需要创建一些隧道才能实现。
就主机自身而言,可以创建的隧道包括ISATAP隧道、Teredo隧道、6to4中继隧道等。
当处于双栈环境时,这些隧道就会成为通信障碍,甚至会成为潜在的可被利用的后门漏洞。
所以,在确认不需要隧道时,有必要将系统自身能自动生成的一些隧道彻底关闭并禁用。

  • linux上禁用隧道
    这里主要介绍如何在RedHat发行版的Linux系统(也包括CentOS等)上禁用各种隧道。
    一般情况下,可以使用命令ip tunnel show查看Linux主机上的所有隧道。
    显示的隧道接口类型主要分sit、gre、tun、ipip等。
    sit代表是的是6in4隧道,gre代表gre隧道,ipiptun都是IPinIP的隧道。
    可以再使用ip link showip addr show命令分别查看主机上的所有接口和接口上的地址,同样可再使用ip -6 route命令检查是否有相关隧道的路由。

Linux上关闭隧道,一般分三步:删除与隧道相关的路由;再删除隧道上的地址;最后删除隧道接口本身。

  • 删除隧道接口地址对应的默认网关(使用命令ip route delete default via ipv6- address)。
  • 删除隧道接口地址(使用命令ip address del ipv6-address del隧道接口)。
  • 删除隧道接口(使用命令ip tunnel del隧道接口)。

主机设置防火墙

对于一些专业的有状态防火墙设备来说,一般会在入站方向和出站方向设置数据包访问和转发策略,且大多数策略是白名单模式,即先是默认拒绝所有,

然后再有条件地开启允许的程序或协议端口。一般的连接(如TCP连接)需要在不同方向上进行多次通信才能完成。
对于有状态防火墙来说,只需要关心首次的主动连接,后续连接会被防火墙自动记录,在反方向自动放行。
若不是有状态防火墙,就必须在每个方向设置好访问策略。这不容易设置,也容易出错。

  • linux防火墙的设置
    Linux系统中,防火墙功能主要由iptablesip6tables服务来提供,前者针对的是IPv4,后者针对的是IPv6,但两者的底层仍然是系统内核的Netfilter模块。

CentOS 7.0版本起,系统默认用firewalld服务替代了iptables/ip6tables
如何在CentOS 7.3上利用firewalld对外来连接进行访问控制。
首先要确保CentOS7.3上的firewalld服务进程处于运行状态。这可以通过以下命令确定:

systemctl status firewalld    查看firewalld是否运行,是否为开机自启动
systemctl start firewalld     开启firewalld服务
systemctl enable firewalld    设置开机自启动

然后就可以通过命令firewall-cmd来设置访问控制策略了。
如果只是开放服务端口,需要使用选项add-service来开放服务或者使用选项add-port来开放端口。
如果需要对访问的源地址进行控制,需要使用选项add-rich-rule来实现。

  • 实验:centos防火墙策略设置
    本实验将用交换机模拟客户端,试图通过IPv6协议栈远程SSH登录CentOS Linux主机,再通过设置防火墙来限制来自客户端的登录访问,从而对如何在CentOS上设置防火墙规则有一个初步了解。

1.对交换机进行如下配置

Switch#config terminal
Switch(config)#ipv6 unicast-routing
Switch(config)#default interface vlan 1
Interface Vlan1 set to default configuration
Switch(config)#interface vlan 1
Switch(config-if)#ipv6 enable
Switch(config-if)#ipv6 address 2018::1/64
Switch(config-if)#ipv6 address 2019::1/64  设置两个IPv6地址,便于对每个地址做访问控制
Switch(config-if)#no shutdown

2.打开linux主机,使用用户名root和密码eve@123登录系统。首先确保Linux主机能获取到两个IPv6地址,且firewalld服务处于正常运行状态,如下图所示。
file
从上图可以看出,已经获取到两个ipv6地址,而且firewalld为开机自启动,且当前处于运行状态

3.查看LinuxSSH服务是否在IPv6地址上开始监听,再确保防火墙策略放行了SSH服务,如下图所示。
file
从上图可以看出,SSH服务(端口号22)已经在本机所有IPv6地址上开始监听,且防火墙已经放行。
如果SSH服务没在防火墙上放行,可执行如下命令:

firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload

4.在交换机上远程登录linux主机,结果如下

Switch#ssh -l root 2018::f604:cba7:50a8:ebe
Password:
Last login: Sun Feb 21 14:05:27 2016 from 2019::1
Switch#ssh -l root 2019::f5a:42b8:53a:843
Password:
Last login: Sun Feb 21 14:03:56 2016 from 2018::1

从上可以看出,交换机可利用Linux主机的两个IPv6地址进行远程登录。

5.在Linux主机上进行安全设置,即只允许使用2019::/64远程SSH登录,禁止使用2018::/64远程SSH登录。配置命令如下:

firewall-cmd --permanent --add-rich-rule='rule family=ipv6 source address=2018::/64 service name=ssh drop'
firewall-cmd --permanent --add-rich-rule='rule family=ipv6 source address=2019::/64 service name=ssh accept'
firewall-cmd --reload

如果要针对源地址进行细粒度的策略控制,必须通过添加rich-rule来实现。
Linux系统中,rich-rule的优先级比service高。

上述第一条命令的含义就是,添加规则,地址类型是IPv6,源地址2018::/64,服务名称是ssh,采取的操作是直接丢弃。
最后一条命令是使策略立马生效。
最后再在交换机上远程SSH登录Linux主机,很明显2018::/64前缀的地址不再能通过SSH登录了。

IPv6局域网安全

IPv4局域网中,经常面临一些网络安全方面的问题,比如,广播风暴、发送伪造的ARP报文以冒充网关或邻居、私设DHCP服务器、针对DHCP服务器的地址池耗尽及DoS攻击等。

IPv6中,虽然协议自身的设计属性能减少一些安全问题,但并不能完全避免。IPv6局域网的安全问题仍不容忽视。

组播问题

IPv6使用组播替代了IPv4中的广播。
同广播一样,组播也是一对多的通信,同样存在安全问题。

从二层交换机转发层面上来看,如果从物理接口接收到的报文的目的MAC地址是FF-FF-FF-FF-FF-FF或者是未知的,那么交换机会进行广播处理,向其他接口转发此报文。
从这个意义上来说,IPv6仍然存在广播风暴的可能。

针对这一情况,二层交换机就需要启用IGMP Snooping或组播侦听发现(Multicast Listener Discovery,MLD)。
前者用于IPv4环境,后者用于IPv6环境,主要作用就是通过侦听局域网中的组播接收方,将对应的MAC地址写入端口转发表中,避免将组播报文转发到不应接收此组播报文的端口,从而降低网络风暴发生的可能性。

但即便二层交换机支持并开启了MLD,由于IPv6组播报文的目的MAC地址是前16位为固定的3333再加上组播地址的低32位,所以理论上来说每2的32次方个组播地址就会发生一次MAC地址冲突。
当然,这个冲突的可能性毕竟很小,实际应用中可以忽略。

IPv6中存在大量的组播应用,特别是NDP涉及的类型为133、134、135、136、137的几种ICMPv6报文,大多采用组播地址作为目的地址进行通信。

另外DHCPv6服务器及中继的发现使用的也是组播地址,以及执行DAD时使用的被请求节点组播地址等。

正因为IPv6极度依赖组播,所以攻击者如果将流量发送到组播地址就会引发问题。
通过向代表链路本地所有节点的组播地址FF02::1发送探测报文,本网段所有的节点都有可能回应此报文。

Linux系统中执行命令ping6 -I eth0 ff02::1(假定接口是eth0)时,本网段所有节点都会回应;执行命令ping6 -I eth0 ff02::2,本网段所有路由器也都会回应。

向组播地址发送报文一般有两个目的,一是嗅探,攻击者可以很轻易地获取局域网中所有在线设备的信息,为进一步攻击奠定基础;
二是简单地向一些组播地址,特别是标识DHCPv6服务器的组播地址FF02::1:2FF05::1:3,即使不需要返回流量,也会耗费路由器或服务器的系统资源,达到类似DoS攻击的目的。
如果发往组播地址的报文中的源地址是伪造的,将会导致去往被伪造源地址的返回流量很大,安全隐患不可小视。

组播的安全问题一直以来都是一个挑战,这是因为组播的本质是从单一源发送到多个接收方,因此考虑到组播源可能会被接收方的反馈流量压垮,所以接收方只能被动接收信息,而不能进行消息确认。

一般的保障机制都需要双向通信,所以组播的安全问题并不好解决。对于组播的安全问题,一般会采取如下措施去缓解。

  • 1.使用安全设备等检测数据报文的源地址,如果源地址是组播地址,则直接丢弃。主机也不应该对源地址是组播地址的请求报文进行响应。
  • 2.除了必需的比如NDPSLAACDAD等会用到的组播地址,其他组播地址尽可能禁止。
  • 3.主机不应该对接收到的目的地址是组播地址的报文发送任何一条ICMPv6错误消息(不包括ICMPv6消息报文)。
  • 4.对无法禁止的组播报文,可以限制ICMPv6消息的发送速率,以避免DoS攻击。

局域网扫描问题

扫描是攻击的前提。为了应对扫描问题,可以增加攻击者扫描IPv6子网的困难。
尽管IPv6地址很多,以理论上来讲增加了扫描的难度,但在实际应用中,一些容易被忽略的地址分配和使用习惯却有可能降低扫描难度。这些不良习惯包括:

  • 路由器网关使用接口标识符是“1”或者容易被猜到的IPv6地址;
  • 为子网内主机分配IPv6地址时,按地址从小到大或者从大到小的顺序依次分配;
  • 使用一些与IPv4兼容的IPv6地址,或内嵌IPv4地址信息的地址,如2019::192.168.1.1

上述不良的地址分配和使用习惯实际上都没有充分利用IPv6地址位数的优势,而是依然采用IPv4思维方式来规划和使用地址,从而增加了被扫描的概率。

为了防范扫描攻击,随机化接口标识符会是一个较好的方法。
完全随机化接口标识符,包括网关的接口标识符,而不是使用基于EUI-64格式的接口标识符,以及使用DHCPv6分配地址,其安全性也就会相应增强。
当然,这也就增加了管理员的负担,需要在安全性和可管理性之间寻求一个相对合理的平衡点。

对于双栈主机来说,其IPv4地址比较容易被扫描到,但这并不意味着同时也会发现IPv6地址,除非IPv6地址太简单,或者内嵌了IPv4地址信息。

此外,双栈主机上的某种应用服务同时在IPv4IPv6上监听,且能通过IPv4的应用信息,探测出IPv6地址。
因此,双栈主机如果一定要在IPv4地址和IPv6地址同时监听某种应用服务,那么除了IPv6地址的接口标识符尽可能随机化外,应用程序本身的安全性也要注意。

因为直接扫描局域网中的IPv6通常比IPv4困难,所以攻击者会通过攻击存有IPv6地址信息的其他主机,降低扫描难度。
这些主机既可以是DNS服务器、DHCPv6服务器,也可以是日志服务器,所以加强这些网络基础服务器的安全很重要。

NDP相关攻击及防护

无论是在IPv4局域网中还是在IPv6局域网中,要想与邻居或外界通信,都必须知道邻居节点或默认网关的物理MAC地址。

IPv4中,是通过广播免费ARP报文来学习邻居的MAC地址。
而在IPv6中,则是用NDP来取代ARP,并用多播取代了广播,但这并不是说NDPARP安全,由于NDP并不提供相互认证机制,网络中任何不可信的节点都可以发送NS/NA/RS/RA等相关报文,因此攻击者可以利用上述漏洞对局域网造成破坏。

一般说来,NDP相关的安全威胁至少可以分为以下4种:

  • MAC地址欺骗攻击及防范;
  • 非法RA报文威胁及防范;
  • DAD问题;
  • 路由重定向问题。
  1. mac地址欺骗攻击及防范

IPv6局域网中,要与邻居或默认网关通信,都必须将它们的链路层MAC地址写入自己的邻居表中,以便将IPv6报文封装在二层链路层中发送。

IPv4中,是通过发送ARP报文来改变受害主机的ARP表,以达到阻断受害主机正常通信的目的。
IPv6中也是一样,虽然IPv6中不存在所谓免费NA的机制,但动态学习到的邻居缓存表的有效寿命都很短暂,也就是NSNA的报文的交互会很频繁,这使攻击者很容易通过发送NS/NA/RS/RA等报文干预正常的交互通信,从而达到改写受害主机邻居表的目的。

MAC地址欺骗的原理一般是,主机发送NSRS报文来获取某个邻居或默认网关的MAC地址。
攻击者截获该报文后,发送对应的NARA报文告诉请求者,所请求的邻居地址是自己伪造的MAC地址。
请求者收到回应报文后,就会将错误的邻居或默认网关MAC地址写进自己的邻居表中,这样所有的报文都会发往错误的MAC地址。

为了防范这种攻击,一个比较笨拙的办法就是在主机上,将正确的邻居(包括默认网关)的MAC地址手动写入自己的邻居表中,并在默认的网关设备上手动将局域网中所有主机的IP地址和MAC地址的映射关系写入IPv6邻居表。
很明显,这增加了管理工作量,在大型局域网中并不可取。需要注意的是,即使手动设置邻居表,也只是缓解了此类攻击,而不能完全杜绝MAC地址欺骗攻击,除非是在做好绑定后,再在局域网中禁止发送和接收所有可能导致欺骗的NDP报文。

MAC地址欺骗攻击主要是由NDP先天的脆弱性造成的。
如果无法在局域网中进行全部静态绑定,并禁止发送和接收NDP相关报文,那么,可以考虑对局域网中的所有NDP报文进行动态检测,在接入端口就对非法的NDP报文进行过滤。

IPv4中,可以在接入交换机上启用DHCP Snooping功能,即检测客户主机获取地址时的DHCP报文,根据报文信息形成IP+MAC+端口+VLAN这样的对应表项,然后再根据形成的动态表项,对接入端口的ARP报文进行检测。

只要与表项不符,就认为是恶意的攻击者在发送非法ARP报文,需将其丢弃。
这就是IPv4中的DHCP Snooping +动态ARP检测(Dynamic ARP Inspection,DAI)功能,它可以很好地防范MAC地址欺骗攻击。
IPv6中与之类似,只不过DAI换成了ND检测,因为IPv6有两种自动获取地址的方法,即SLACCDHCPv6,所以IPv6 ND检测依赖的IPv6 Snooping就分为在SLAACDHCPv6两种情况下的监听。

NDP的安全问题之所以难以解决,主要是发送方与接收方之间并没有安全认证机制,没有可靠的信任关系,自然就存在欺骗的可能。
虽然NDP报文内置的跳数限制是255,且一些NDP报文的发送源限制为链路本地地址或非指定地址,但这只是将安全威胁范围限制在局域网之内,并没有从根本上解决。

NDP发送方和接收方之间建立一种认证信任机制,可有效地杜绝欺骗攻击。RFC 3971定义的安全邻居发现(SEcurity Neighbor Discovery,SEND)以及RFC 3972定义的密码学产生的地址(Cryptographically Generated Addresses,CGA)正是防范邻居欺骗的机制。

  1. 非法RA报文威胁及防范
    IPv6中,RA报文扮演着很重要的角色。
    没有RA报文,主机就没法通过SLACC获取地址和默认网关。

即便使用DHCPv6获取地址,但默认网关的获取仍然要靠RA报文来实现,因为DHCPv6报文并不提供默认网关选项。
所以,除非在全网中手动配置地址和网关,否则绝对不能完全禁止RA报文。
但这样一来,网络中的任意节点都可以发送RA报文,网络中的主机节点收到RA报文后,都可能将RA报文中的前缀信息用于地址自动配置,同时也会将RA的发送方作为默认网关。

知道了非法RA报文的危害原理后,对付非法RA报文威胁的办法就是只允许合法的路由器发送RA报文,其他网络节点则禁止发送RA报文。

但网络节点并不会这么听话,所以,只能在交换机等接入设备上,将连接路由器/交换机/主机等节点的端口设置成信任端口或非信任端口,只有信任端口才接收对端设备发送来的RA报文并转发,非信任端口则禁止接收RA报文。

在二层交换机上设置允许接收RA报文的信任端口和拒绝接收RA报文的非信任端口时,存在一个问题,就是一般的二层交换机只负责二层转发,即只关心每个端口的二层MAC地址。
RA报文是在IPv6之上的ICMPv6报文(IPv6类型58),要禁止RA报文,必须要检测类型是134的ICMPv6报文,而这是三层交换机的管理范畴。

所以要在二层交换机上管理RA报文,就必须设置基于端口检测的PACL
目前一些国产交换机(比如锐捷交换机)在二层交换机上可以在每个端口上检测和管控RA报文,即自定义基于ICMPv6的访问控制列表(Access Control List,ACL),再应用在二层交换机物理端口下。

如果二层交换机并不支持基于端口的ICMPv6 ACL,那么一种临时的替代办法就是使用MAC ACL,这是因为RA报文的目的地址都是FF02::1,对应的MAC地址是3333.0000.0001,因此阻止非信任端口发送到此目的MAC地址的报文即可。
当然,可以如此行事的前提是网络中的组播应用所使用的IPv6组播地址不会与该目的MAC地址相同。

要禁止非法RA报文的威胁,还会面临这样一个问题,即如何确定一个RA报文是合法的还是非法的。
前面描述的防范方法的前提是,知道哪个端口连接了合法路由器,因此剩下的端口都不应该收到RA报文。

如果不确定二层交换机每个端口连接设备的情况,就需要在网络中部署入侵检测系统(Intrusion Detection System,IDS)等类似设备,以检测RA报文的源MAC或源IP地址匹配的情况,显然这需要前期做大量的配置工作。
这里并不打算介绍非法RA报文的检测,因为对网络管理员来说,局域网内合法路由器的IPv6地址和MAC地址一般都是可知的。即便事先没设置防范措施,也可以很容易地手动查出非法RA报文的发送方。

  1. DAD问题
    网络上节点的任何IPv6地址在生效前,都必须执行DAD
    如果DAD失败,则表明网络中已经有节点使用了该IPv6地址,自己必须放弃使用该地址。

如果节点启用了私密性扩展地址功能,则会继续产生新的地址,并继续DAD过程。
DAD过程中,攻击者可以发送NSNA报文来通告地址已被占用,甚至会响应每一个DAD,相当于本网络中的全部地址都被占用,这就使受害主机无法通过DAD,从而无法拥有任何IPv6地址。

对于这类攻击,只能由网络管理员通过抓包分析等手段,找出攻击者对应的网络端口并将其封禁解决。
设置NA等报文的发送速率,也可以减轻威胁的影响。

  1. 路由重定向问题
    路由重定向报文(类型是137的ICMPv6报文)也属于NDP的范畴。
    路由器使用路由重定向报文向本网段中的主机发送一条路由信息,在其中指出一个更优的路由下一跳。

如果主机允许接收ICMPv6重定向报文,就会在路由缓存中将目的地址的下一跳从默认网关改为路由重定向报文中指示的新的更优的下一跳。
同样,因为路由重定向没有相应的认证机制,因此可以伪造重定向报文。
但是,重定向报文不能直接发送而被主机接收,因为重定向报文的内建机制是必须由主机首先向默认网关发送一个到达某目标的报文,才允许主机接收默认网关发来的重定向报文。

因此,要发动重定向报文攻击,必须先伪造一个源地址(比如某网站的IPv6地址),向受害主机发送比如类型为128的ICMPv6回显请求报文,并假定受害主机必须对此回显请求报文回应一个类型为129的ICMPv6回显应答报文。
然后,攻击者还得冒充默认网关向受害主机发送重定向报文,以改变受害主机的路由缓存表,从而使受害主机无法访问某网站。

对于这种攻击,攻击者必须持续不断地触发受害主机向目的地址发送报文,并冒充默认网关向受害主机发送重定向报文,而且受害主机还必须接受重定向报文并修改路由缓存,缺少中间任何一个环节攻击都不一定成功。

比如,若攻击者不持续攻击,则受害主机的路由缓存表在经历一段时间后会恢复正常。
要想禁止路由重定向攻击,不妨关闭默认网关的路由重定向功能,并在网络中禁止类型为137的ICMPv6路由重定向报文,这样即便网络中真的有更优的下一跳,也直接忽略。

  • 实验:非法RA报文的检测及防范
    IPv6中,客户主机如果自动获取IPv6地址,则必然少不了RA报文的参与。
    RA报文既可以用来通告默认网关角色的存在,也可以携带前缀信息,以便客户主机自动生成地址或修改前缀(路由)表。
    如果网络中有非法设备发送RA报文,其危害性可想而知。
    在本实验中,我们先观察在局域网中有两台路由器同时发送RA报文时,主机获取地址等信息的情况。
    然后通过相关信息查找到发送非法RA报文的物理端口,并将其封禁。最后用一种较为有效的方法来防范非法RA报文对局域网造成的影响。
  1. 开启所有节点。

    file

  2. 分别对R1(模拟合法路由器)和R2(模拟非法路由器)做如下配置。
    R1的配置如下:

    R1#config terminal
    R1(config)#ipv6 unicast-routing
    R1(config)#interface ethernet0/0
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 address 2019::1/64
    R1(config-if)#no ipv6 nd ra suppress            允许发送RA报文
    R1(config-if)#no s

    R2的配置如下:

    2#config terminal
    R2(config)#ipv6 unicast-routing
    R2(config)#interface ethernet0/0
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 address 2020::1/64
    R2(config-if)#no ipv6 nd ra suppress            允许发送RA报文
    R2(config-if)#no shutdown
  3. Host(路由器模拟的客户主机)的配置如下:

    Host#config terminal
    Host(config)#no ipv6 unicast-routing            模拟客户主机时,需关闭IPv6单播路由
    Host(config)#interface ethernet0/0
    Host(config-if)#ipv6 enable
    Host(config-if)#ipv6 address autoconfig         接口采用SLACC自动获取地址
    Host(config-if)#no shutdown
  4. 分别在Win10主机和Host上验证地址获取情况及默认网关的情况。Win10主机的地址获取情况如下图所示。

    file

    从图中可以看出,Win10主机同时获取到两个前缀的地址和两个默认网关。如果R2是非法路由器,则Win10主机与外界通信就可能不正常。

    host上执行show ipv6 routers命令,显示如下:

    Host#show ipv6 routers 
    Router FE80::A8BB:CCFF:FE00:200 on Ethernet0/0, last update 1 min
    Hops 64, Lifetime 1800 sec, AddrFlag=0, OtherFlag=0, MTU=1500
    HomeAgentFlag=0, Preference=Medium
    Reachable time 0 (unspecified), Retransmit time 0 (unspecified)
    Prefix 2020::/64 onlink autoconfig
    Valid lifetime 2592000, preferred lifetime 604800
    Router FE80::A8BB:CCFF:FE00:100 on Ethernet0/0, last update 1 min
    Hops 64, Lifetime 1800 sec, AddrFlag=0, OtherFlag=0, MTU=1500
    HomeAgentFlag=0, Preference=Medium
    Reachable time 0 (unspecified), Retransmit time 0 (unspecified)
    Prefix 2019::/64 onlink autoconfig
    Valid lifetime 2592000, preferred lifetime 604800

    从上面的输出中可以看出,路由器模拟的Host收到了两台路由器发送来的RA报文,其优先级都是Medium。在Host上执行show ipv6 interface brief ethernet0/0命令,显示如下:

    Host#show ipv6 interface brief ethernet 0/0
    Ethernet0/0            [up/up]
    FE80::A8BB:CCFF:FE00:300
    2019::A8BB:CCFF:FE00:300
    2020::A8BB:CCFF:FE00:300

    从上面的输出中可以看出,Host的接口也获取到了两个前缀的IPv6地址。在Host上执行show ipv6 route ::/0命令,显示如下:

    Host#show ipv6 route ::/0
    Routing entry for ::/0
    Known via "ND", distance 2, metric 0
    Route count is 1/1, share count 0
    Routing paths:
    FE80::A8BB:CCFF:FE00:200, Ethernet0/0
      Last updated 00:26:36 ago

    从上面的输出中可以看出,Host默认路由的下一跳只有一个R2。对路由器来说,在多个RA报文的优先级相同的情况下,会随机选择其中一个作为默认网关,而Win10主机会同时选择两个默认网关。在优先级相同(可通过命令route print-6命查看跃点数)的情况下,随机走一个网关?

  5. 将合法路由器R1的RA报文的优先级调高,R1配置如下:

    R1#conf t
    R1(config)#
    R1(config)#int eth0/0
    R1(config-if)#ipv6 nd router-preference  ?            查看支持的优先级(只有3种)
    High    High default router preference
    Low      Low default router preference
    Medium  Medium default router preference
    R1(config-if)#ipv6 nd router-preference high          优先级选择H

    从上面的输出中可以看出,RA报文通告的路由优先级有3个,默认为Medium
    将合法路由器R1发出的RA报文的优先级调为High后,再分别查看HostWin10主机的路由优先级。
    Host上执行show ipv6 route ::/0命令,可以看到默认路由改为R1了(选择优先级高的默认路由)。
    Host上查看默认路由的信息,显示如下:

    Host#show ipv6 route ::/0
    Routing entry for ::/0
    Known via "ND", distance 2, metric 0
    Route count is 1/1, share count 0
    Routing paths:
    FE80::A8BB:CCFF:FE00:100, Ethernet0/0
      Last updated 00:02:34 ago
    Host#show ipv6 routers  default 
    Router FE80::A8BB:CCFF:FE00:100 on Ethernet0/0, last update 0 min
    Hops 64, Lifetime 1800 sec, AddrFlag=0, OtherFlag=0, MTU=1500
    HomeAgentFlag=0, Preference=High, trustlevel = 0
    Reachable time 0 (unspecified), Retransmit time 0 (unspecified)
    Prefix 2019::/64 onlink autoconfig
    Valid lifetime 2592000, preferred lifetime 604800

    从上面的输出中可以看到,默认路由的优先级是High

    Win10主机也一样。可以看到Win10主机同样有两个IPv6地址和两个默认网关。
    通过命令route print -6可以看到两个默认网关的跃点数(优先级)不一样了,R1对应的跃点数的数值更低,如下图所示。

    file

    由上可知,调整合法路由器的路由优先级,可以改变客户主机的默认网关,但RA报文中携带的前缀信息仍然可以用来配置地址,而且非法路由器也可以调整为高的优先级,所以这种方法不能彻底解决问题。

  6. 既然调整合法路由器的优先级不能彻底解决问题,就需要想一种方法将其彻底解决。
    为此,可以在连接非合法路由器的接口上拒绝接收任何RA报文。
    因为RA报文是类型为134的ICMPv6报文,在IPv6协议之上,而且一般的交换机可以定义高级扩展列表来拒绝RA报文。
    比如在思科交换机上可以定义如下访问列表来拒绝RA报文:

    ipv6 access-list anti_RA
    Deny icmp any any router-advertisement  拒绝所有的ICMP RA报文
    Permit ipv6 any any

    但这个访问控制列表无法应用在思科的二层交换机端口上(国产的锐捷等交换机是支持的),只能应用在三层接口上,所以这种方法在思科交换机上行不通。下面的配置来自国产的锐捷二层交换机:

    Ruijie-switch(config)#ipv6 access-list deny-ra
    Ruijie-switch(config-ipv6-acl)#deny icmp any any router-advertisement
    Ruijie-switch(config-ipv6-acl)#permit ipv6 any any
    Ruijie-switch(config-ipv6-acl)#exit
    Ruijie-switch(config)#int rang gi 0/1 – 23   1~23号端口都没有连接合法路由器,拒绝接收RA报文
    Ruijie-switch(config-if-range)#ipv6 traffic-filter deny-ra in   二层接口下调用访问控制列表

    经过上面的配置后,交换机的上连线接在gi0/24号端口,gi0/1 ~ gi0/23号端口都可以获得合法路由器分配的IPv6地址,即使gi0/1 ~ gi0/23号端口连接了非法的路由器,交换机也会拒绝接收该端口发出的RA报文。

    思科较高版本的iOS支持IPv6 ND RA Guard功能,可以在二层交换机的接口上,配置ipv6 nd raguard,使其不再接收RA报文。

    使用ipv6 nd raguard attach-policy policy-name命令可以进行更高级的配置,比如可以过滤可接受的IPv6前缀。EVE-NG实验平台中的思科交换机虽能支持该命令,但却没有效果(估计有Bug)。

    为了能在实验平台上展示拒绝RA报文的效果,这里采用第三种临时替代办法,即在二层交换机上配置MAC ACL(即基于MAC地址的ACL)。

    因为RA报文的目的地址是FF02::1,其对应的目的MAC就是3333.0000.0001,所以可以在非信任路由器的端口上拒绝所有目的MAC3333.0000.0001的报文。

    在交换机上做如下配置:

    Switch#config terminal
    Switch(config)#mac access-list extended deny-ra
    Switch(config-ext-macl)#deny any host 3333.0000.0001      拒绝所有到MAC地址3333.0000.0001的数据报文,也就是到FF02::1的报文
    Switch(config-ext-macl)#permit any any
    Switch(config-ext-macl)#interface ethernet 0/2        连接非法路由器R2的接口下应用
    Switch(config-if)#mac access-group deny-ra in        在入方向应用,即接收数据报文时

    然后将Hostethernet0/0接口重启,以及将Win10主机网卡重启,两台客户端都只能获取到R1通告的RA报文,并用于地址自动配置和默认网关。

    可以把此MAC ACL应用在所有非法路由器的端口上。
    但需要特别说明的是,如果网络中有组播应用,且组播地址对应的MAC地址恰好是3333.0000.0001,比如组播地址FF05::1:0:1,就不能使用这种MAC ACL了。
    好在一般很少遇到MAC地址是3333.0000.0001的情况,且几乎所有的二层可网管交换机支持这种MAC ACL

IPv6地址欺骗及防范

路由器或交换机在网络中转发数据包时,一般都只关心数据包的目的地址,即二层交换机只查找目的mac,路由器等三层设备只查找目的ip地址。
只关心目的地址而忽略源地址的好处是,可以减轻网络设备的计算负担,从而提高数据包的转发效率。
但这也带来了安全隐患。任何攻击者都可以精心伪造数据包的源ipv6地址,实现类似反射攻击等目的。

为了防范ipv6地址欺骗,路由器等网络设备在接收数据包时,可以检查源地址的合法性,只有源地址合法才进行路由转发。
如果源地址是非法的,则直接丢弃该数据包,从而有效地拒绝ipv6地址欺骗攻击。
一般而言,如果源地址是组播地址,应该直接判定为非法地址而丢弃数据包,因为这不符合组播地址的使用场景。

防范地址欺骗的关键是如何判断源地址是否合法。
IPv4中,二层接入交换机可以通过DHCP Snooping表来确定IP+端口+VLAN的对应关系,在端口接收到数据帧时,如果源地址与该表项不符,则会直接丢弃。
当然,在确定某交换机端口只可能出现源自某些地址的数据帧时,也可以手动设置白名单,从而拒绝接收含有非法源地址的信息。

IPv6环境也是一样。我国清华大学下一代互联网技术研究团队提出的源地址验证改进(Source Address Validation Improvement,SAVI)技术在国际上是很先进的,不仅有正规的RFC文档,还得到了众多国产交换机厂商(如锐捷、中兴、华三、神州数码)的支持和实现。

SAVI的原理借鉴了IPv4DHCP Snooping技术的做法,二层接入交换机启用IPv6 Snooping,用来监听以SLACCDHCPv6方法自动获取地址的过程中的通信报文,形成IPv6地址+端口+VLAN对应关系的Snooping表。
然后根据此表项,再在物理端口下启用源IPv6地址和源MAC地址检测,若接收到的数据包的源地址与表项不符,则直接丢弃。

除了在接入层交换机端口启用源地址检测外,在三层网络设备(如路由器)的接口下也可以启用源地址检测,这就是单播反向路径转发(Unicast Reverse Path Forwarding,URPF)技术。
URPF是一种用来防范基于源地址欺骗的攻击行为的技术,它的原理是,从某个接口接收到数据包时,抽取其源IPv6地址,再查找自身的路由表,
查找结果通常会有3种情况:源地址在路由表中没有匹配项;源地址在路由表中有匹配项,但对应的出接口与收到此数据包的接口不一致;源地址在路由表中有匹配项,且对应的出接口与收到此数据包的接口一致。

对于第一种情况,可以肯定收到的数据包的源地址是非法的,也就是没通过URPF检查,所以可以直接丢弃。
对于后两种情况,则要看是严格的URPF还是松散的URPF,如果是严格的URPF,则只有第三种情况才能通过URPF检测。
如果确定只可能通过单个出接口到达某地址,则可以执行严格的URPF,这通常发生在最末端的接入网段。
松散的URPF通常发生在网络中有冗余路径时,即允许来自某个源地址的数据包可以从多条路径到达。

  • 实验:应用urpf防止ipv6源地址欺骗
    防范IPv6源地址欺骗最好的办法是在接入层通过SAVI来实现,但因为本实验平台暂时还不能模拟国产交换机,所以退而求其次,选择用URPF来防止IPv6源地址欺骗。
    因为缺少源地址欺骗攻击软件,所以我们这里通过ping命令来验证效果。同时本实验还将演示严格URPF和松散URPF的区别。
  1. 开启所有节点

    file

  2. 路由器R1与路由器R2之间有两条直连链路,在R1上创建一个环回接口,并配置IPv6地址。
    R1有一条默认路由指向R2,走的是图中的e0/0链路。
    R3上的默认路由指向R2R2上有一条去往R1的环回接口的路由,走的是图中的e0/1链路。
    R1的环回接口与外界通信时,发送报文走的是e0/0接口,返回报文走的是e0/1接口,即存在不对称路由。

    R1的配置如下:

    R1#config terminal
    R1(config)#ipv6 unicast-routing
    R1(config)#interface ethernet0/0
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 nd ra suppress
    R1(config-if)#ipv6 address 2018:12::1/64
    R1(config-if)#no shutdown
    R1(config-if)#interface ethernet0/1
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 nd ra suppress
    R1(config-if)#ipv6 address 2018:12:1::1/64
    R1(config-if)#no shutdown
    R1(config-if)#interface loopback 0
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 address 2017::1/128            给环回接口设置IPv6地址,供测试用
    R1(config-if)#ipv6 route ::/0  2018:12::2            默认路由走ethernet0/0接口

    R2的配置如下:

    R2#config terminal
    R2(config)#ipv6 unicast-routing
    R2(config)#interface ethernet0/0
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 nd ra suppress
    R2(config-if)#ipv6 address 2018:12::2/64
    R2(config-if)#no shutdown
    R2(config-if)#interface ethernet0/1
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 nd ra suppress
    R2(config-if)#ipv6 address 2018:12:1::2/64
    R2(config-if)#no shutdown
    R2(config-if)#interface ethernet0/2
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 nd ra suppress
    R2(config-if)#ipv6 address 2019:23::2/64
    R2(config-if)#no shutdown
    R2(config-if)#ipv6 route 2017::1/128 2018:12:1::1        去往R1环回接口地址的路由

    R3的配置如下:

    R3#config terminal
    R3(config)#ipv6 unicast-routing
    R3(config)#interface ethernet 0/0
    R3(config-if)#ipv6 enable
    R3(config-if)#ipv6 nd ra suppress
    R3(config-if)#ipv6 address 2019:23::3/64
    R3(config-if)#no shutdown
    R3(config-if)#ipv6 route ::/0 2019:23::2              设置默认路由,使其指向R2

    配置完以后,在路由器R1上使用环回接口的地址去ping R3ethernet0/0的接口地址,显示如下:

    R1#ping 2019:23::3 so
    R1#ping 2019:23::3 source 2017::1
    Type escape sequence to abort.
    Sending 5, 100-byte ICMP Echos to 2019:23::3, timeout is 2 seconds:
    Packet sent with a source address of 2017::1
    !!!!!
    Success rate is 100 percent (5/5), round-trip min/avg/max = 1/11/51 ms

    需要说明的是,R1发送ICMPv6请求报文时,走的是默认路由,出接口为ethernet0/0
    R3的应答报文走默认路由到达R2后,R2查找路由表,发现目的地址2017::1/128有匹配的路由,下一跳到R1,出接口是ethernet0/1
    也就是说,就路由器R1而言,请求报文是从ethernet0/0发送出去的,应答报文则是从ethernet0/1接口收到的。
    这种来回路径不一致的不对称路由并不会影响结果。

  3. R2而言,当从接口ethernet0/0收到R1发来的报文时,它并不检查源地址是什么以及源地址是否合法。
    假定从R1发过来的报文的源地址2017::1是一个伪造的地址,则可能会对网络造成影响。
    为了安全考虑,在接口下启用源地址检查,即启用URPF
    这里还要分为严格的URPF和松散的URPF
    如果是严格的URPF,当R2ethernet0/0接收到R1发送过来的请求报文后,检查后发现源地址是2017::1,但这个地址在路由表中对应的出接口是ethernet0/1,而不是ethernet0/0,即R2认为源地址2017::1应该是从ethernet0/1接收到,现在却是从ethernet0/0接收到。
    R2会认为这是一个非法的报文,从而将其丢弃。在R2上启用严格的URPF的配置如下:

    R2(config)#interface ethernet 0/0                        该接口下接收到的报文将执行源地址检查
    R2(config-if)#ipv6 verify unicast source reachable-via rx    检查单播源地址时执行严格的URPF

    R2上配置URPF后,再在R1上执行ping 2019:23::3 source 2017::1,此时就ping不通了。
    在实际环境中,源地址2017::1有可能从R1ethernet0/0ethernet0/1接口到达R2,限制成某个接口就不合适了。
    此时应使用松散的URPF。要应用松散的URPF,只需执行如下命令:

    2(config)#interface ethernet 0/0                           该接口下接收到的报文将执行源地址检查
    R2(config-if)#ipv6 verify unicast source reachable-via any      检查单播源地址时执行松散的URPF

    所谓松散的URPF,即检查源地址时,只要源地址在本地路由表中有对应条目即可(也可以包括默认路由),而不必关心其出接口与收到报文的接口是否一致。
    R2上执行松散的URPF之后,再在R1上执行ping 2019:23::3 source 2017::1,又可以pingR2了。

    一般情况下,如果是单接口链路的末梢网络,应该执行严格的URPFR3只有一条链路去往R2,那么R2ethernet0/2接口就应该执行严格的URPF
    在生产环境中使用URPF时一定要小心谨慎,否则有可能导致意外的通信故障。

dhcpv6安全威胁及防范

DHCPv6是客户端自动获取IPv6地址的一种方法。
在网络中,自动获取IPv6地址的客户端首先会发送RS报文,以试图接收RA报文并优先以SLACC的方式获取地址。
如果没收到任何RA报文,或者RA报文并没有携带可用于自动配置的前缀列表,又或者RA报文设置了O位甚至M位,客户端都会改为使用DHCPv6自动获取IPv6地址。

即客户端向组播地址FF02::1:2发送DHCPv6请求报文,以寻找局域网中可用的DHCPv6服务器,网络中的DHCPv6服务器或中继代理收到此报文后,会对客户端的请求进行响应,从而完成地址的分配和其他DNSNTP等网络配置参数的下发。

在这个过程中,攻击者可以冒充DHCPv6服务器来下发错误的网络配置参数,也可以故意发送大量的DHCPv6请求报文来耗尽合法DHCPv6服务器的可分配地址池,以及消耗服务器的CPU等资源,从而达到正常客户端无法获取IPv6地址的目的。
总的来说,虽然DHCPv6DHCPv4的工作机制有所不同,比如监听的服务端口不同(UDP 546/547)、身份标识符不同(DUID)等,但DHCPv6面临的威胁与DHCPv4面临的威胁大同小异。

  1. 伪造dhcpv6服务器及隐患
    IPv6中,只要攻击者将自己加入FF02::1:2FF05::1:3组播监听组,并在UDP端口547上监听,就可以冒充DHCPv6服务器向网络中试图通过DHCPv6自动获取地址的客户端发送伪造的通告和响应报文,并进一步分配错误的地址和下发其他的甚至非法的DNS服务器等网络配置参数。

    因为DHCPv6中不存在默认网关选项,所以伪造DHCPv6服务器的攻击目的主要就是利用错误的DNS地址将客户端正常访问的流量引入到错误的服务器上。
    假定有这样一个场景,用户访问的是某个网银站点,但DNS服务器的地址却被解析到精心伪装的非法站点上,其危害性可想而知。
    当然分配到一个错误的全局单播地址,也会导致客户端的通信中断。

    之所以能发生伪造DHCPv6服务器的攻击,其原因还是客户端和服务器之间缺乏相互认证机制。
    IPv4环境一样,可以在接入交换机上启用DHCPv6 Snooping,将接入交换机端口分为信任端口和非信任端口,就可以有效地拒绝伪造的DHCPv6发送通告和响应报文,从而消除了伪造DHCPv6服务器造成的影响。

  2. 消耗dhcpv6服务器资源的dos攻击及防范
    DHCPv6DHCPv4一个明显的不同是,允许一个客户端请求多个IPv6地址,这也使攻击者可以不断地发送DHCPv6请求,以申请大量的IPv6地址,最终耗光IPv6的地址池。

    当然,因为IPv6地址足够大,只要定义的地址池不是特别小,耗尽IPv6地址池的可能性并不大,但这会给服务器的CPU、内存等资源造成极大消耗,导致无法再为合法的客户端分配IPv6地址,最终实现DoS攻击。

    当前,应对DHCPv6服务器DoS攻击的唯一方法就是对每一个客户端发送请求报文的速率进行QoS策略限制,这与DHCPv4相同,即为每一个客户主端设置一个请求阈值,超过此值的报文将统统丢弃。

    另外,如果确定DHCPv6服务器本身就性能不足,而且负担还比较大,或者能确定DHCPv6服务器很容易遭受到DoS攻击,那么采用无状态DHCPv6或者改用SLACC,将地址分配的任务交给路由器来完成,也不失为一个缓解DoS攻击的权宜之计。

  3. dhcpv6地址扫描
    某些DHCPv6服务器(包括充当DHCP服务器的路由器/交换机)在分配地址时,会按照从小到大或从大到小的顺序依次分配地址,这样攻击者会很容易通过获取到的IPv6地址确定一个地址范围,对网络上的主机进行扫描以发现可攻击的目标主机。

    为此,建议在配置DHCPv6服务器时,尽量采用随机化的地址分配,并在服务器上做好已分配地址的记录(包含IPv6地址、DUID等的对应关系),并保存好日志文件,便于事后溯源审计。

IPv6网络互联安全

当网络之间相互通信时,特别是当局域网与国际互联网通信时,就需要使用路由器或防火墙等网络设备来实现网络之间的互联。
而路由器等设备就可以称为网络边界设备,互联的网络可以称为边界网络。
通俗来讲,网络边界设备就是一个网络与另一个网络的连接中枢,它在保证两个网络正常连接的同时,还须充分考虑网络连接时的安全。

通常情况下,内网(如局域网)对外网(如互联网)的访问不会有太多限制,因为通常内网是可信任的网络,而外网是不可信和不安全的网络,因此在通过外网访问内网时都需要进行严格的限制。

在实际环境中,还可能设置专门的隔离区/非军事化区(Demilitarized Zone,DMZ),并将服务器等放置在DMZ中,对来自内网和来自外网的访问都进行严格限制。
市场上常见的防火墙大多具有trustuntrustDMZ安全域的概念,且每个安全域具有不同的安全等级。

IPv6网络互联的安全跟IPv4网络互联的安全实际是一样的。
IPv4网络中面临的安全问题在IPv6中也同样存在,比如在选路控制层面上对路由协议的攻击、伪造大量的垃圾报文消耗网络设备资源的DoS攻击、未授权的非法访问等。

ipv6路由协议安全

路由器是实现网络互联的重要设备,在网络中扮演着为数据报文逐跳选路并实现转发的角色。
路由器选路的主要依据就是路由表,路由表可以手动静态配置,但缺乏弹性和灵活性,所以大多数情况下是采用动态路由协议来生成路由表。

在配置动态路由协议时,如果缺少必要的安全措施和手段,就会给攻击者带来可乘之机。
比如攻击者可以冒充路由器,发送非法的动态路由协议报文,与合法路由器建立邻居关系,从而不仅能获得现有网络的路由转发信息表,还可以对合法路由器的路由表进行更新篡改。一些好的做法如下所列:

  • 一个良好的配置习惯是,如果确定路由器接口所在的网络中不可能存在邻居时,则需要将其接口配置为被动接口(passive interface),以确保该接口不发送任何动态路由协议报文,这样可以降低路由协议被攻击的可能性。

  • IPv6中建立动态路由邻居关系时,应尽可能使用链路本地地址,这是因为链路本地地址的通信被限制在本地链路,不可能跨网段,这样可以防止非法的路由协议报文从其他网段发送过来。

  • 大多数动态路由协议支持路由条目的过滤,即预先定义好什么范围的路由条目以及什么样的路由类型允许从某个特定接口或者某个邻居接收到,其他的路由相关的更新报文都视为非法报文,可直接过滤掉。
    IPv6动态路由中,一般用前缀列表(在IPv4中也可以用扩展访问列表)来定义过滤的范围,也可以根据路由类型进行过滤。

以上3种办法都能有效地防范或降低动态路由协议攻击的风险,但一些动态路由协议在当初设计时,就像服务器上的应用服务一样,难免会出现一些协议漏洞并可能被攻击者利用。

为此,在运行动态路由协议的路由器之间使用加密及认证机制,既可以防止攻击者随便与合法路由器建立邻居并交换路由协议报文,也可以防止或缓解中间人攻击和DoS攻击,从而可以更好地加强动态路由协议的安全。

IPv4中,有很多路由协议都支持并可使用MD5和预共享密钥来对路由器之间交互的路由协议报文进行加密和认证,在保证合法路由器身份相互认证的同时,还能对传输的路由协议报文信息的完整性、不可抵赖性提供一定的安全支持。
IPv6而言,OSPFv3可以提供MD5认证支持,还可以使用IPSec对路由器邻居之间交换的路由协议报文进行加密传输。

IPv6中,常用的内部路由协议主要是OSPFv3

实验:ospfv3的加密和认证
在使用OSPFv3作为IPv6内部动态路由协议时,一般都只关心路由协议的运行是否正常,往往会忽略网络中非法路由器与合法路由器建立邻居关系,进而导致网络混乱乃至崩溃的问题。
本实验模拟一个运行OSPFv3路由协议的网络,在路由器未进行加密认证时,一台非法路由器可以与合法的路由器建立邻居关系,并发送路由更新报文。
随后在合法路由器上配置MD5认证,使非法路由器无法再与之建立OSPFv3邻居关系。
最后再对OSPFv3的区域或接口进行加密,从而了解OSPFv3的加密和认证之间的异同。

  1. 开启所有节点

    file

  2. 对合法路由器R1R2分别进行配置,R1的配置如下

    R1#config terminal
    R1(config)#ipv6 unicast-routing
    R1(config)#interface loopback 0
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 address 2019:1::1/128
    R1(config-if)#ipv6 ospf 100 area 0
    R1(config-if)#interface ethernet0/0
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 address 2019::1/64
    R1(config-if)#ipv6 ospf 100 area 0
    R1(config-if)#no shutdown
    R1(config-if)#ipv6 router ospf 100
    R1(config-rtr)#router-id 1.1.1.1
    R1(config-rtr)#passive-interface loopback 0  环回接口连接的是末梢网段,将其设为被动接口,禁止发送OSPFv3报文

    R2的配置如下

    R2#config terminal
    R2(config)#ipv6 unicast-routing
    R2(config)#interface loopback 0
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 address 2019:2::2/128
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#interface ethernet0/0
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 address 2019::2/64
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#no shutdown
    R2(config-if)#ipv6 router ospf 100
    R2(config-rtr)#router-id 2.2.2.2
    R2(config-rtr)#passive-interface loopback 0

    配置完成后,可以使用命令show ipv6 ospf neighborshow ipv6 route ospf查看路由情况,发现一切正常。

    由于R1R2并未进行安全认证,而R1和R2运行了OSPFv3协议的接口又都与R3相通,这导致R3完全可以无障碍地加入OSPFv3路由协议中,并可通告伪造的路由条目。对R3进行如下配置。

    R3#config terminal
    R3(config)#ipv6 unicast-routing
    R3(config)#interface loopback 0
    R3(config-if)#ipv6 enable
    R3(config-if)#ipv6 address 2019:3::3/128
    R3(config-if)#ipv6 ospf 100 area 0
    R3(config-if)#interface ethernet0/0
    R3(config-if)#ipv6 enable
    R3(config-if)#ipv6 address 2019::3/64
    R3(config-if)#ipv6 ospf 100 area 0
    R3(config-if)#no shutdown
    R3(config-if)#ipv6 router ospf 100
    R3(config-rtr)#router-id 3.3.3.3

    配置完成后,再在R1R2上查看OSPF邻居,发现增加了R3,同时也把R3的本地环回接口地址2019::3:3加入了路由表中。这是R1R2不希望看到的结果。

  3. 为了在R1R2路由器上将非法的路由器R3剔除,可以在R1R2之间添加OSPFv3认证。
    R1R2相互认证通过后才能建立OSPFv3邻居关系,因为R3并不知道R1R2之间的认证密钥,所以R3没法再与R1R2建立邻居关系。
    思科路由器支持两种OSPFv3认证算法:MD5SHA-1
    这两个都是不可逆的散列算法,都是任意长度任意字符的输入产生固定长度的输出。

    可以在任意版本的Linux主机上使用命令echo input_string | md5sum 产生MD5输出,其结果是32位的十六进制数。
    或者使用命令echo input_string | sha1sum产生SHA-1输出,其结果是40位的十六进制数。

    之所以提到在Linux上使用md5sumshalsm工具,是因为在配置OSPFv3认证时,需要输入32位或者40位十六进制数的散列值。
    利用这两个工具的好处是可以输入一个简单的字符串,然后将产生的散列值直接复制在配置中。
    当然这并不是必需的,也可以手动输入32位或40位十六进制数。

    要启用OSPFv3认证,可在R1ethernet0/0接口下和R2ethernet0/0接口下分别增加一条命令:
    ipv6 ospf authentication ipsec spi 256 md5 60b725f10c9c85c70d97880dfe8191b3

    这条命令的意思是,使用IPSec认证,其安全索引参数(Security Parameter Index,SPI)值是256,这个SPIR1R2上要保持一致。
    MD5散列值是32位十六进制数,其值在R1R2上也要保持一致。配置完成后,在R1上的结果如下图所示:

    file

    从图上可以看出,R1R3不再能建立邻居关系,接口ethernet0/0启用了MD5认证,其SPI值是256。在R2上看到的结果与R1一样。

  4. 除了为OSPFv3配置认证外,也可以配置加密。
    方法是在R1R2的接口ethernet0/0下去掉no ipv6 ospf authentication ipsec spi 256命令,而改用ipv6 ospf encryption命令(认证和加密只能选择其中一个)。
    命令如下:

    R1(config)#interface ethernet0/0
    R1(config-if)#no ipv6 ospf authentication ipsec spi 256
    R1(config-if)#ipv6 ospf encryption ipsec spi 256 esp aes-cbc 256 87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7 md5 3b5d5c3712955042212316173ccf37be

    上述命令的意思是,使用IPSec加密,SPI值是256,认证报头类型为ESP,加密算法为AES-CBC,密钥位数为256,其值正是后面紧跟的64位十六进制数,散列算法仍是MD5,其散列值是后面紧跟的32位十六进制数。
    R2上也进行相同配置后,再查看R1的结果,如下图所示:

    file

    从上图可以看出,接口ethernet0/0已经采用256位的AES-CBC加密算法进行了加密。接口从认证改为加密后,效果一样,都能有效拒绝非法路由器R3的接入。

  5. 从以上步骤可以看出,接口既可以做认证,也可以做加密,但两者只能选一种,不过两者达到的效果是一样的。
    如果OSPFv3域里的接口太多,针对每个接口配置认证或加密就显得有点烦琐。
    OSPFv3支持对域进行加密或认证,这样域下的所有接口都会启用加密或认证。
    对域进行加密的配置命令如下:

    R1(config)#interface ethernet0/0
    R1(config-if)#no ipv6 ospf encryption ipsec spi 256          需要先去掉接口下的加密配置
    R1(config-if)#ipv6 router ospf 100
    R1(config-rtr)# area 0 encryption ipsec spi 256 esp aes-cbc 256 87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7 md5 3b5d5c3712955042212316173ccf37be

    配置完成后,使用命令查看结果,结果不变。通过本实验可以看出,OSPFv3路由协议要想安全运行,必须要求合法路由器之间启用认证或加密机制来建立邻接关系,这样可阻止非法路由器对正常OSPFv3路由协议的破坏和影响。

IPv6路由过滤

IPv6地址空间巨大,海量的地址数目看起来取之不尽用之不竭,比如实验用到的全局单播地址,因为并不与国际互联网相通,所以可以随便使用。
但如果单位或者组织已经申请了合法的IPv6地址并接入了国际互联网,就要考虑哪些地址可用,哪些地址不可用。

目前,负责IPv6地址分配及管理的IANA机构已分配的地址块并不多,也就是说在互联网上,有效的地址块只占少数,还有大量的未分配地址和一些特定用途的保留地址等,这些地址可以统称为虚假地址,不应该出现在路由表中,否则就可能导致在网络中存在大量的垃圾报文,从而耗费宝贵的路由器资源和带宽。

在与IPv6国际互联网相连的路由器上使用默认路由目前来看并不是值得推荐的方法。
就目前来说,全局单播地址的定义仅包括2000::/3,所以不必在路由器上写出默认路由ipv6 route ::/0 next-hop,书写为ipv6 route 2000::/3 next-hop更为合适。

  1. IANA保留的IPv6地址块
    虽然IPv6地址空间巨大,但考虑到未来的用途,一些地址并未进行分配。
    目前来说,仅有2000::/3地址块用作全局单播地址分配空间,除非有新的标准出来,否则保留地址块空间中的地址不应该出现在IPv6国际互联网中,即源地址和目的地址都不允许使用保留地址块空间中的地址。

  2. IPv6已分配的地址块
    从上文介绍的IANA保留地址块可以看出,已经分配的全局可路由地址块只能是2000::/3,可以在IANA官网上进行查询已分配的具体地址块,页面中状态是ALLOCATED的就是已经分配的地址块,由全球不同的组织单位再具体细分。

  3. 需过滤的IPv6地址块
    由于已经分配的地址块毕竟还比较少,所以应该将一些尚未分配的地址,或者在网络互联时不该出现的地址块在网络设备上进行过滤。
    一般情况下,应该尽可能地在路由控制层面而不是数据转发层面去进行地址块的过滤,即不允许将虚假地址写入路由器的路由转发表中,通常可以在运行动态路由协议时使用前缀列表对路由条目进行过滤,也可以选择使用下一跳接口是Null 0的黑洞路由来直接丢弃。

    当然也可以采用白名单的方式,只将允许的IPv6地址块写入路由表中。
    不管是哪一种方法,都需要及时跟踪已分配的地址块的情况并及时在路由控制上进行更新。
    在全局可路由单播地址块2000::/3中,还有部分地址块有特殊用途,在路由器上过滤路由条目也应考虑。
    比如3ffe::/16是当初的6Bone实验网使用的地址,2001:db8::/32是归档用的地址等。
    一些需要明确在边界路由器上进行过滤的常见地址块如下所示:

    file

实验:ipv6路由过滤
本实验将模拟一台路由器将本地所有的IPv6直联网段通过动态路由协议通告出去,其邻居路由器将这些路由条目进行安全过滤,只允许全局单播地址段写入路由表,并将过滤后的路由条目通告给自己的另一个邻居路由器。
通过本实验,可掌握IPv6前缀列表的写法以及在IPv6路由条目中应用前缀列表进行过滤。

  1. 开启所有节点

    file

  2. R1R2路由器进行单区域OSPFv3配置。
    R1的配置如下

    R1#config terminal
    R1(config)#ipv6 unicast-routing
    R1(config)#interface ethernet0/0
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 address 2019:12::1/64
    R1(config-if)#ipv6 ospf 100 area 0
    R1(config-if)#no shutdown
    R1(config-if)#ipv6 router ospf 100
    R1(config-rtr)#router-id 1.1.1.1

R2的配置如下

R2#config terminal
R2(config)#ipv6 unicast-routing
R2(config)#interface ethernet0/0
R2(config-if)#ipv6 enable
R2(config-if)#ipv6 address 2019:12::2/64
R2(config-if)#ipv6 ospf 100 area 0
R2(config-if)#no shutdown
R2(config-if)#interface ethernet0/1
R2(config-if)#ipv6 enable
R2(config-if)#ipv6 address 2019:23::2/64
R2(config-if)#ipv6 ospf 100 area 0
R2(config-if)#no shutdown
R2(config-if)#ipv6 router ospf 100
R2(config-rtr)#router-id 2.2.2.2

R1上启用多个环回接口,模拟多个地址块网段,并通告到OSPFv3中。

R1(config)#interface loopback0
R1(config-if)#ipv6 address 2019:1::1/64
R1(config-if)#ipv6 ospf network point-to-point    更改接口的OSPF网络类型,避免产生128位主机路由
R1(config-if)#ipv6 ospf 100 area 0
R1(config-if)#interface loopback1
R1(config-if)#ipv6 address 3ffe:1::1/80            6BONE地址块3ffe::/16中的地址
R1(config-if)#ipv6 ospf network point-to-point
R1(config-if)#ipv6 ospf 100 area 0
R1(config-if)#interface loopback2
R1(config-if)#ipv6 address fd11::1/16            需过滤的本地地址块Fc00::/7中的地址
R1(config-if)#ipv6 ospf network point-to-point
R1(config-if)#ipv6 ospf 100 area 0
R1(config-if)#interface loopback3
R1(config-if)#ipv6 address 2002:e000::1/32        伪造的6to4地址块中的地址
R1(config-if)#ipv6 ospf network point-to-point
R1(config-if)#ipv6 ospf 100 area 0

然后再在R2上查看OSPF路由,结果如下:

R2#show ipv6 route ospf 
IPv6 Routing Table - default - 9 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
O   2002:E000::/32 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
O   2019:1::/64 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
O   3FFE:1::/80 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
O   FD11::/16 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0

从结果中可以看出,R1上4个环回接口所在的网段都已经通过OSPFv3写入R2路由表中。

  1. R2R3上运行EBGPR2OSPFv3路由重分发到BGP路由协议中,并最终写入R3的路由表
    R2的配置如下:

    R2(config)#router bgp 100
    R2(config-router)#bgp router-id 2.2.2.2
    R2(config-router)#no bgp default ipv4-unicast
    R2(config-router)#neighbor 2019:23::3 remote-as 200
    R2(config-router)#address-family ipv6
    R2(config-router-af)#redistribute ospf 100    将OSPFv3路由重分发到BGP中
    R2(config-router-af)#neighbor 2019:23::3 activate

    R3的配置如下:

    R3#config terminal
    R3(config)#ipv6 unicast-routing
    R3(config-if)#interface ethernet0/0
    R3(config-if)#ipv6 enable
    R3(config-if)#ipv6 address 2019:23::3/64
    R3(config-if)#no shutdown
    R3(config)#router bgp 200
    R3(config-router)#bgp router-id 3.3.3.3
    R3(config-router)#no bgp default ipv4-unicast
    R3(config-router)#neighbor 2019:23::2 remote-as 100
    R3(config-router)#address-family ipv6
    R3(config-router-af)#neighbor 2019:23::2 activate

    然后在再在R3上查看ipv6的路由表,结果如下:

    R3#show ipv6 route bgp 
    IPv6 Routing Table - default - 7 entries
    Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
    B   2002:E000::/32 [20/11]
     via FE80::A8BB:CCFF:FE00:210, Ethernet0/0
    B   2019:1::/64 [20/11]
     via FE80::A8BB:CCFF:FE00:210, Ethernet0/0
    B   3FFE:1::/80 [20/11]
     via FE80::A8BB:CCFF:FE00:210, Ethernet0/0
    B   FD11::/16 [20/11]
     via FE80::A8BB:CCFF:FE00:210, Ethernet0/0

    从结果中可以看出,R3已经通过BGP学习到R1所有环回接口的地址段路由。

  2. 在本实验中,R2R3模拟的是真实环境下在不同自治区域之间运行的两台路由器。
    很显然,R1上的环回接口地址段路由中,除了2019:1::/64是全局单播可路由地址外,其他地址段都不应该出现。
    其中2002:E000::/32是伪造的6to4网段,3FFE:1::/80是已弃用的6Bone实验网段,FD11::/16是本地网段FC00::/7中的地址块,它们都不应该发布在公网中,需要将这些非法网段进行过滤。
    在过滤前,先简单学习一下IPv6前缀列表相关的知识。

    需要过滤的地址块都是最大的地址块(前缀长度值已达最小值),IPv6地址都是层次化的设计和分配,需要判断哪些地址块是在可过滤范围内。

    FC00::/7为例,其包括的子网地址块可以有很多,具体由前缀长度来决定。
    如果子网前缀长度是8,那就有两个子网,分别是FC00::/8FD00::/8,每个子网又可以继续往下分,即FD00::/8又可以分为FD00::/9FD80::/9;依次类推。
    很明显,实验中的FD11::/16网段正好在这个地址块里面,所以需要过滤。

    在本例中需要过滤的地址段对应的写法如下:

    Ipv6 prefix-list valid_ipv6 deny 2002:E000::/32      定义的前缀列表名称是valid_ipv6
    Ipv6 prefix-list valid_ipv6 deny 3FFE:1::/80
    Ipv6 prefix-list valid_ipv6 deny FD11::/16
    Ipv6 prefix-list valid_ipv6 permit 2019:1::/64

    但上述写法只能过滤具体的地址段路由,一旦生成了新的需过滤的地址段,还得继续更新此前缀列表。
    所以一般直接写大地址块,后面跟上一个前缀长度值的大小范围,只要前缀长度值小于等于128就能包括所有的子网地址块。所以前缀列表可改写为如下所示:

    Ipv6 prefix-list valid_ipv6 deny 2002:E000::/20  le 128
    Ipv6 prefix-list valid_ipv6 deny 3FFE::/16  le 128
    Ipv6 prefix-list valid_ipv6 deny FC00::/7  le 128
    Ipv6 prefix-list valid_ipv6 permit 2000::/3  le 128

    第一种写法简单清晰,需要过滤的路由就用deny,需要允许的路由就用permit
    在本实验中,需要在路由器R2上对路由进行过滤,如果禁止将R1通告的非法网段写入R2的路由表,可以在R2OSPFv3中进行过滤,这样再将OSPFv3路由重分发到BGP时,由于其路由条目已经过滤掉了,R3也就不会学习到R1上的非法地址段路由了。
    R2上的过滤配置如下:

    R2(config)#Ipv6 prefix-list valid_ipv6 deny 2002:E000::/32 
    R2(config)#Ipv6 prefix-list valid_ipv6 deny 3FFE:1::/80
    R2(config)#Ipv6 prefix-list valid_ipv6 deny FD11::/16
    R2(config)#Ipv6 prefix-list valid_ipv6 permit 2019:1::/64
    R2(config)#ipv6 router ospf 100
    R2(config-rtr)#distribute-list prefix valid_ipv6 in      应用前缀列表进行过滤

    配置完成后,在R2R3上分别查看IPv6路由表,如下图所示。可以发现,不需要的地址段路由已经被过滤掉了。

    R2#show ipv6 route ospf 
    IPv6 Routing Table - default - 6 entries
    Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
    O   2019:1::/64 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
  3. 在实际应用中,可能还是允许在同一个自治域内网中的R1R2之间能全互通,并不需要进行路由过滤,只有当向别的自治域中的R3进行路由通告时才需要过滤。
    为此就不能在R2上对OSPFv3进行过滤,而应该在BGP中执行过滤。
    只不过在过滤时,不能直接引用前缀列表,而是需要定义一个路由映射(route-map),由route-map去引用前缀列表。

    R2(config)#route-map valid_ipv6                            创建路由映射,名称为valid_ipv6
    R2(config-route-map)#match ipv6 address prefix valid_ipv6  引用此前定义的前缀列表
    R2(config-route-map)#ipv6 router ospf 100
    R2(config-rtr)#no distribute-list prefix valid_ipv6 in     去掉在OSPFv3中执行的过滤
    R2(config-rtr)#router bgp 100
    R2(config-router)#address-family ipv6
    R2(config-router-af)#redistribute ospf 100 route-map valid_ipv6   重分发路由时启用路由映射过滤

    配置完后,在R2上查看效果,如下所示:

    R2#show ipv6 route ospf
    IPv6 Routing Table - default - 9 entries
    Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
    O   2002:E000::/32 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
    O   2019:1::/64 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
    O   3FFE:1::/80 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
    O   FD11::/16 [110/11]
     via FE80::A8BB:CCFF:FE00:100, Ethernet0/0
    R2#show bgp ipv6 unicast
    BGP table version is 18, local router ID is 2.2.2.2
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
    Origin codes: i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
     Network          Next Hop            Metric LocPrf Weight Path
    *>  2019:1::/64      FE80::A8BB:CCFF:FE00:100
                                               11         32768 ?

    R2路由表依然有所有路由信息,只是在重分发到BGP时因为执行了过滤,所以只有一条路由通告给了R3
    R3上可以使用命令show ipv6 route bgp查看路由表进行验证。

  4. 在上一步中,是R2在向R3通告路由时主动进行的过滤,在实际应用场景中,对于R3而言,不能期望邻居R2主动进行路由过滤,所以R3在与R2建立BGP邻居时需进行路由过滤,其做法也是先创建路由映射再在BGP中做过滤。R3的配置如下:

    R3(config)#ipv6 prefix-list valid_ipv6 seq 5 deny 2002:E000::/32
    R3(config)#ipv6 prefix-list valid_ipv6 seq 10 deny 3FFE:1::/80
    R3(config)#ipv6 prefix-list valid_ipv6 seq 15 deny FD11::/16
    R3(config)#ipv6 prefix-list valid_ipv6 seq 20 permit 2019:1::/64
    R3(config)#route-map valid_ipv6 
    R3(config-route-map)#match ipv6 address prefix valid_ipv6
    R3(config-route-map)#router bgp 200
    R3(config-router)#address-family ipv6
    R3(config-router-af)#neighbor 2019:23::2 route-map valid_ipv6 in    在与邻居R2的入方向进行路由过滤

    配置完成后,执行命令clear bgp ipv6 unicast *,重启BGP协议进程,再验证结果,发现与预期一致。

IPv6访问控制列表

在使用路由器等设备将多个网络互联后,在路由控制层面可以在网络设备上进行路由过滤操作,将网络中无用的甚至有害的路由条目清除掉,这样可以有效地减少网络中的垃圾报文对网络造成的威胁。

但这样做还不够,即便网络中报文的源IPv6地址和目的IPv6地址都是合法的,这也只能保证网络层是可信任的。
因为网络中提供服务的节点,并不希望总是暴露在网络中让任何节点随意访问,所以需要在数据转发层面,对通信的数据报文进行安全过滤。

对于网络设备来说,就是需要在接口的入方向或出方向应用访问控制列表(Access Control List,ACL)。
对于接收到的数据报文,需根据该接口入方向的ACL规则来判断是否接收该报文。
或者在接收报文后,在选择从某个出接口转发报文之前,根据该接口出方向的ACL规则来判断是否转发该数据报文。

一个ACL可以有多条规则,规则的顺序很重要,路由器等设备在用ACL进行安全过滤时,都是在收到数据报文后与规则依次去做计算匹配。
如果一条规则不匹配,则继续与下一条规则做匹配,一旦找到匹配项,就不再与后续规则做匹配,并按规则中指定的操作允许或拒绝转发数据报文。

三层交换机、路由器和传统防火墙等都是基于网络三层/四层去进行规则匹配的。
ACL规则一般由协议类型、协议号、源地址、目的地址、源端口、目的端口和时间等组成。

但这几项都不是必需的,比如若不进行第四层的包过滤,源端口/目的端口就可以不存在。
IPv4 ACL中,两个接口之间通过ARP来相互学习到对方的MAC地址,因为ARP并不是运行在IPv4协议之上,所以IPv4ACL无法限制ARP报文,这也保证邻居之间可以直接互相学习。

IPv6中情况有所不同,邻居之间的学习是通过NSNA报文进行的,而NSNA报文是ICMPv6报文,运行在IPv6协议报文之上,所以在配置IPv6 ACL时,运行动态路由协议的两台路由器之间的NSNA报文一定要放行,否则邻居会不可达。

思科等路由器的IPv6 ACL在末尾有隐藏的默认的3条规则,在创建自己的IPv6 ACL时一定要考虑到这3条隐藏规则:

permit icmp any any nd-na          NA报文默认允许,除非之前的规则明确deny
permit icmp any any nd-ns          NS报文默认允许,除非之前的规则明确deny
deny ipv6 any any                每条ACL中的最后一条规则默认就是拒绝所有,这与IPv4 ACL一样

虽然创建IPv6 ACL的主要目的是对网络中的服务器进行访问控制,但在创建IPv6 ACL时还需要考虑必须放行某些必要的协议,比如类型为2的ICMPv6报文。
它表示数据包太大,主要用于PMTU的发现,如果不明确允许,就可能对网络的正常通信造成影响。

另外,路由器不是有状态防火墙,在路由器上创建IPv6 ACL时,它并不关心哪个源地址从哪个接口发起连接,也不跟踪和维持会话的状态信息,而且对于标准的ACL,还不支持TCP连接时的SYN、ACK、RST、FIN等状态。

所以在路由器上建立与TCPUDP相关的ACL时,必须考虑通信的两个方向都要做好ACL控制。
这与有状态防火墙不同,在防火墙上配置ACL时,通常只需关心发起通信连接的第一个报文即可。

比如一个客户端要访问一台在TCP 80端口上监听的Web服务器,在发起主动连接时,目的端口固定,源端口是随机产生的,所以在服务器向客户端返回报文时,再想通过目的端口(接收到的报文的源端口)来进行ACL控制时,规则就不好写了,因此只能改为用TCP状态来控制,比如TCPACKESTABLISHED
但这样也并不是总能满足实际的需求,幸好思科等路由器还支持反射(reflect)ACL

在没有反射ACL之前,一般只能在客户端访问服务器的方向应用ACL,在反方向只能允许所有流量通过,否则访问就可能不正常。

而有了反射ACL之后,就可以在双向应用ACL,这样可以做到更细粒度、更精确的访问控制。
之所以叫反射ACL,就是在基于客户端访问服务器方向上的ACL,自动产生的从服务器向客户端方向上的ACL

ACL为手动配置,用来控制客户端向服务器端的访问,而反射ACL是动态产生的,应用在服务器向客户端的路径上。
反射ACL因为是动态临时产生的,所以具有生命周期(可以手动设置),一旦超过了生命周期,这个临时的反射ACL就会被清除。

在实际应用中,可能还需要设置基于时间的ACL,即在指定的时间里生效。
例如可以配置服务器,使其每天晚上11点到早晨8点拒绝访问,在其他时间可以访问,此时就能用到基于时间的ACL了。

实验:应用ipv6 acl限制网络访问
本实验将在思科路由器上应用IPv6 ACL来限制远程Telnet访问。
通过本实验,可以了解基本的IPv6 ACL的原理。
反射ACL和基于时间的ACL在本实验中也会出现,对实际应用会有一定的帮助。

  1. 对3台路由器进行单区域OSPFv3路由配置。
    R1的配置如下

    R1(config)#ipv6 unicast-routing
    R1(config)#interface loopback0
    R1(config-if)#ipv6 address 2019:1::1/128
    R1(config-if)#ipv6 ospf 100 area 0
    R1(config-if)#interface ethernet0/0
    R1(config-if)#ipv6 enable
    R1(config-if)#ipv6 address 2019:12::1/64
    R1(config-if)#ipv6 ospf 100 area 0
    R1(config-if)#no shutdown
    R1(config-if)#ipv6 router ospf 100
    R1(config-rtr)#router-id 1.1.1.1

    R2的配置如下

    R2(config)#ipv6 unicast-routing
    R2(config)#interface loopback0
    R2(config-if)#ipv6 address 2019:2::2/128
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#interface ethernet0/0
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 address 2019:12::2/64
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#no shutdown
    R2(config-if)#interface ethernet0/1
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 address 2019:23::2/64
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#no shutdown
    R2(config-if)#ipv6 router ospf 100
    R2(config-rtr)#router-id 2.2.2.2

    R3的配置如下

    2(config)#interface loopback0
    R2(config-if)#ipv6 address 2019:2::2/128
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#interface ethernet0/0
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 address 2019:12::2/64
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#no shutdown
    R2(config-if)#interface ethernet0/1
    R2(config-if)#ipv6 enable
    R2(config-if)#ipv6 address 2019:23::2/64
    R2(config-if)#ipv6 ospf 100 area 0
    R2(config-if)#no shutdown
    R2(config-if)#ipv6 router ospf 100
    R2(config-rtr)#router-id 2.2.2.2
    R3(config-line)#login
    R3(config-line)#transport input telnet    开启Telnet服务

    可以分别在R1、R2、R3上验证路由是否已经收敛。
    然后在R1上远程TelnetR3,出现登录界面后,输入密码cisco,其结果是正常的。

    
    R1#telnet 2019:3::3
    Trying 2019:3::3 ... Open

User Access Verification

Password:


2. 在中间路由器R2上设置ACL,只允许来自R1的环回接口地址2019:1::1的远程Telnet服务,拒绝来自其他地址的Telnet。
可以在R2上对直连R1的接口ethernet0/0的入方向设置ACL,其配置如下:
 ```bash
R2(config)#ipv6 access-list telnet_prohibit
R2(config-ipv6-acl)#permit tcp host 2019:1::1 any eq telnet
R2(config-ipv6-acl)#deny tcp any any eq telnet
R2(config-ipv6-acl)#permit ipv6 any any 
R2(config-ipv6-acl)#interface ethernet0/0
R2(config-if)#ipv6 traffic-filter telnet_prohibit in        在接口的入方向应用ACL

注意,定义ACL时一定要有最后一条规则permit ipv6 any any,否则因为隐藏ACL规则,会导致无法建立OSPF邻居。
然后在R1上重新登录R3,直接 Telnet R3 的环回接口地址时,默认是使用出接口的地址2019:12::1,而这个地址已被R2ACL拒绝,而改用R1的环回接口0的地址作为源地址远程登录时,就可以正常访问了。

  1. 上面应用的ACL比较宽松,最后有一条permit ipv6 any any
    对于严格的网络来说,这样做就不合适了。
    现在要限制从R1出去的流量只能去往TCP 80端口的Web服务,别的流量都要禁止,那么ACL又该如何写呢?

因为最后要禁止所有流量,那么就必须先考虑放行一些必需的流量。
首先用于邻居发现的NDNS报文需要放行,类型为2的ICMPv6报文也需要放行。
通常还需要放行类型为1~4的ICMPv6报文,便于网络诊断。

类型为128和129的ICMPv6报文也可以考虑放行。
OSPFv3运行涉及的报文也需要放行,来自组播地址FF02::5FF02::6的流量也要放行,类型是89的IPv6报文也要放行(类型89是ospf协议),剩下就是允许任何源到目的端口为TCP 80的访问,最后就是禁止所有IPv6的报文通行。具体如下:

ipv6 access-list permit_www_only
permit 89 fe80::/10 any                          放行OSPFv3相关的报文
permit icmp any any nd-na        放行NA报文
permit icmp any any nd-ns        放行NS报文
permit icmp any any 2                      放行类型是2的ICMPv6报文
permit icmp any any destination-unreachable  放行目的不可达的ICMPv6报文
permit tcp any any eq 80
deny ipv6 any any

ACL建立后应该用在哪个接口的哪个方向呢?
IPv6 ACL有个特点,就是路由器自身发出的数据报文不受本身接口出方向的ACL控制。
所以,为了限制R1访问外网,所建立的ACL就不能应用在ethernet0/0的出方向上,而是要在R1直连的下一跳路由器R2ethernet0/0接口的入方向上应用此ACL

  1. 在将ACL应用到R2ethernet0/0的入方向后,可以看到每一条规则的匹配数据。
    再从R1远程TelnetR3,就会提示目标不可达,这是因为Telnet并没有被放行。

    为了也允许R1远程登录到R3,则需要在原ACL中添加一条规则。
    ACL的每一条规则都有一个序号,序号按照从小到大的顺序排列,即sequence 10sequence 70

    要插入一条规则,只需要为插入的规则设置一个序号,其序号的值决定了访问规则所在的位置。
    新插入的序号的值一定介于所插入位置前后两个规则的序号之间。
    如果写规则的时候忽略序号,则默认是原规则最大序号值加10(即往后添加)。
    这里要允许R1远程登录R3的环回接口0,那么其插入的位置要保证在序号70之前。
    比如想插入到第二行,只需将序号设置成10~20之间的一个值,比如15,其写法如下:

    R2(config)#ipv6 access-list permit_www_only
    R2(config-ipv6-acl)#sequence 15 permit tcp 2019:12::/64 host 2019:3::3 eq telnet  允许R1用eth0/ 0口登录
    R2(config-ipv6-acl)#sequence 16 permit tcp host 2019:1::1 host 2019:3::3 eq telnet允许R1用环回口0登录
  2. 现在再要求R1只能在每天的8:00~18:00远程TelnetR3,其他时间则不允许。
    这就要用到基于时间的ACL了。
    预先定义好时间范围time-range,其内容为每天的8:00~18:00,然后在对应的ACL规则末尾加上时间限制,即表示只有在指定的时间内该条规则才生效,在非指定时间里,相当于没有此条规则。
    配置如下:

    R2(config)#time-range duty_time
    R2(config-time-range)#periodic daily 8:00 to 18:00
    R2(config-time-range)#ipv6 access-list permit_www_only
    R2(config-ipv6-acl)#sequence 15 permit tcp 2019:12::/64 host 2019:3::3 eq telnet time-range duty_time
    R2(config-ipv6-acl)#sequence 16 permit tcp host 2019:1::1 host 2019:3::3 eq telnet time-range duty_time

    配置好以后,可以执行命令show time-range查看设置的时间段是否处于活跃状态(active),只有处于活跃状态,其规则才有效。
    另外,在设置IPv6 ACL时,如果需要修改某条规则,可以先查看该规则的序号,然后直接写上需要修改的规则的序号,再直接进行修改。
    如果要删除某条规则,直接在ACL配置模式下no sequence序号即可。

  3. 前面的步骤都是对R1访问R3进行控制,在应用ACL时,是从R1通往R3的方向做控制,但反方向即R3访问R1的方向并没有做任何ACL控制。

    这样会有一个问题,即当R3要主动远程Telnet登录到R1时,虽然请求报文可以顺利到达R1(因为没有ACL控制),但回应报文却受到ACL的控制,导致连接不成功。

    如果R2是有状态防火墙,防火墙只会关心第一个连接报文是否允许,如果允许,则会跟踪此连接的后续状态,在反方向自动放行。

    对于思科路由器等设备来说,在设置IPv6 ACL时是无状态的,即针对每一个报文都需要查询ACL来决定是允许还是拒绝,而不管此报文是一个连接的首个报文还是后续报文。

    思科路由器也支持反射ACL,在建立ACL规则时,针对的是连接发生时的首个报文,再使用关键字reflect产生一个源和目的相反的临时ACL规则,最后再在反方向的ACL中直接使用evaluate关键字调用此临时ACL规则。

    在前面的步骤中,在R2上设置ACL,允许R1远程Telnet登录R3,其目的端口为固定的TCP 23端口,源端口是R1随机产生的端口。
    在应用ACL规则时,其实只关心了目的端口,源端口即使想关注也没法确定,所以在反方向设置ACL时,源端口和目的端口发生了转换,目的端口没法确定,ACL规则也就不好写了。
    有了反射ACL后,此问题迎刃而解。

    R2上的ACL相关配置进行如下修改:

    R2(config)#ipv6 access-list R1-R3
    R2(config-ipv6-acl)#permit 89 any any
    R2(config-ipv6-acl)#permit icmp any any
    R2(config-ipv6-acl)#permit tcp host 2019:1::1 host 2019:3::3 eq telnet reflect outbound
    R2(config-ipv6-acl)#deny ipv6 any any
    R2(config-ipv6-acl)#ipv6 access-list R3-R1
    R2(config-ipv6-acl)#permit 89 any any
    R2(config-ipv6-acl)#permit icmp any any
    R2(config-ipv6-acl)#evaluate outbound
    R2(config-ipv6-acl)#deny ipv6 any any
    R2(config-ipv6-acl)#interface ethernet0/0
    R2(config-if)#ipv6 traffic-filter R1-R3 in
    R2(config-if)#ipv6 traffic-filter R3-R1 out

    配置完后,在R2上执行show ipv6 access-list命令。

    R2#show ipv6 access-list 
    IPv6 access list R1-R3
    permit 89 any any sequence 10
    permit icmp any any sequence 20
    permit tcp host 2019:1::1 host 2019:3::3 eq telnet reflect outbound sequence 30
    deny ipv6 any any sequence 40
    IPv6 access list R3-R1
    permit 89 any any sequence 10
    permit icmp any any sequence 20
    evaluate outbound sequence 30
    deny ipv6 any any sequence 40

    R1上使用环回接口0作为源Telnet R3,触发“R1-R3”ACL中序号为30的规则,然后再在R2上执行show ipv6 access-list命令,其结果如下:

    R2#show ipv6 access-list 
    IPv6 access list R1-R3
    permit 89 any any (26 matches) sequence 10
    permit icmp any any (3 matches) sequence 20
    permit tcp host 2019:1::1 host 2019:3::3 eq telnet reflect outbound (17 matches) sequence 30
    deny ipv6 any any sequence 40
    IPv6 access list R3-R1
    permit 89 any any sequence 10
    permit icmp any any sequence 20
    evaluate outbound sequence 30
    deny ipv6 any any sequence 40
    IPv6 access list outbound (reflexive) (per-user)
    permit tcp host 2019:3::3 eq telnet host 2019:1::1 eq 55652 timeout 300 (14 matches) (time left 296) sequence 1

    从上述输出中可见,多了最后一条临时产生的访问规则,该规则指明刚才登录时,R1的源端口是55652,现在反方向变为目的端口。
    正是有了这条规则,R1才可以远程TelnetR3
    虽然本实验使用反射ACL达到了有状态防火墙的防护效果,但路由器毕竟不是防火墙,针对一些非常规应用,如被动模式FTP,因为后续主动连接的数据传输端口无法确定,所以路由器的反射访问列表也就无能为力了。

网络设备安全

因为网络中的服务器拥有更多攻击者感兴趣的信息,所以一般情况下,服务器才是攻击者的主要目标。

但因为路由器作为网络互联设备,不但保障网络的稳定运行,而且还拥有整个网络的拓扑信息以及一些重要的管理维护信息,攻击者可以通过嗅探路由器自身或转发的数据报文来获取有用信息,甚至利用路由器等网络设备系统自身或者管理上的漏洞攻破路由器等设备,进而危及服务器的安全,所以网络设备自身的安全不容忽视。

网络设备的安全至少要从以下4个方面来加强。

  • 网络设备系统本身的漏洞要及时修补或升级,当暂时无法提供补丁或新版本时,也需采用临时解决办法或手段。在漏洞危害性大于因网络中断造成的影响时,可强制将网络设备下线。

  • 路由器等网络设备需关闭不必要的服务。对于必须开放的服务,也应做好安全访问限制。如必须开放SNMP,应尽量采用可认证的SNMPv3,设置好允许访问的主机范围。

  • 网络配置应尽量简洁,对过时的无用的配置要及时删除,特别是在更改网络配置时,配置不能越来越繁杂。一些看似无用的网络配置可能就存在网络安全隐患。

  • 路由器等网络设备也必须放置在不能随便进入的机房等场所,而且要避免设备上的网络连线被嗅探到。网络设备的console口也应设置不易破解的密码,关闭并按需启用暂时还没有连接到网络的端口。在启用远程管理的情况下,尽量使用认证加密的SSHHTTPS,而避免使用TelnetHTTP远程登录方式,建议使用非标准协议端口,并设置好允许远程访问的主机范围。

实验:对路由器的远程访问进行安全加固
本实验先通过抓包查看路由器的远程Telnet密码,展示路由器通过Telnet远程管理的安全隐患,再禁止路由器的远程Telnet登录方式,改用SSH协议,最后设置可远程登录主机的IPv6地址范围。
通过本实验,可以掌握对路由器等网络设备的远程访问进行安全加固的方法。

  1. R1远程登录R3,同时在R2ethernet0/1口进行抓包分析。
    先单击Protocol列,以快速找到所有的Telnet协议报文,再找到有密码数据的Telnet报文,如下图所示:

    file

这样依次出现的字符cisco就是Telnet登录密码。由此可见,Telnet远程登录是不安全的。

  1. 既然Telnet远程登录不安全,那么可以使用SSH来替代Telnet远程登录,并同时限制远程登录的地址范围(前面介绍过在中间路由器用ACL进行限制,这里用路由器本身进行限制,这样更高效。因为如果将ACL配置在接口上,路由器会检查流经接口的所有数据包,而这里介绍的方法只检查对路由器的远程登录访问数据包,而不检查流经路由器接口的数据包)。
    先在R3上配置RSA密钥对:

    R3(config)#ip domain-name cisco.com        启用RSA前,需配置域名
    R3(config)#crypto key generate rsa            生成RSA密钥对
    The name for the keys will be: R3.ipv6.com
    Choose the size of the key modulus in the range of 360 to 4096 for your
    General Purpose Keys. Choosing a key modulus greater than 512 may take
    a few minutes.
    How many bits in the modulus [512]: 1024           RSA长度,越长越安全
    % Generating 1024 bit RSA keys, keys will be non-exportable...
    [OK] (elapsed time was 0 seconds)
    R3(config)#end
    R3#show crypto key mypubkey rsa
    % Key pair was generated at: 00:51:01 EET Mar 28 2016
    Key name: R3.ipv6.com
    Key type: RSA KEYS
    Storage Device: not specified
    Usage: General Purpose Key
    Key is not exportable.
    Key Data:
    30819F30 0D06092A 864886F7 0D010101 05000381 8D003081 89028181 00CF7A69 
    E181677E E96B50CB 5900E314 F1F06F53 771199BE FEC543E1 13020301 0001

    为了启用SSH,必须先创建RSA密钥对,而创建RSA密钥对则要先指定域名。
    所以这里先设置域名为cisco.com,再使用命令crypto key generate rsa产生密钥对,长度值默认为512位,密钥对的长度值至少大于768位才能启用SSH版本2,这里设置为1024位。
    设置密钥对后,使用命令show crypto key mypubkey rsa可以看到产生了一个公钥和一个私钥。

    然后继续设置,如下所示:

    R3(config)#ipv6 access-list client
    R3(config-ipv6-acl)#permit ipv6 host 2019:12::1 any    创建ACL,只允许R1远程登录
    R3(config-ipv6-acl)#ip ssh version  2           设置SSH版本为2
    R3(config)#username admin password cisco        设置登录用户名和密码
    R3(config)#aaa new-model                        启用AAA,使用用户名和密码认证
    R3(config)#line vty 0 4                         配置远程登录虚拟终端
    R3(config-line)#ipv6 access-class client in     应用IPv6 ACL来限制可访问的IPv6客户主机范围
    R3(config-line)#transport input none            去掉所有允许的远程登录协议
    R3(config-line)#transport input ssh             再添加SSH登录协议(仅允许SSH)
  2. 最后在R1上验证ssh远程登录到R3的结果。

    R1#ssh -l admin 2019:3::3
    Password:
    R3>

    从本实验可以看出,因为Telnet远程登录的信息是明文传输,很容易被嗅探,所以应该尽量避免Telnet,而使用SSH来远程管理。
    由于本实验中的路由器版本暂不支持修改SSH端口号,所以还是使用的默认的TCP 22端口登录。
    但并不是说这不安全,因为SSH本来就是加密传输,使用标准端口不会有什么影响。

最后修改日期: 2024年7月20日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。