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
中情况则有了一些变化:BGP
和IS-IS
路由协议继续沿用IPv4
的MD5
认证,而OSPFv3
和RIPng
则建议采用IPSec
。 -
过度技术带来的安全隐患
在IPv4
向IPv6
过渡期间,即在IPv4
和IPv6
并存的网络环境中,各种各样的过渡技术层出不穷,但很多过渡技术都只考虑了功能的实现,对安全的考虑有所欠缺。同时在过渡期间,不可避免地会出现各种复杂的网络结构,新的安全隐患也难以完全避免。 -
ipv6
自身协议的缺陷
设计IPv6
的初衷就是创建一个全新的IP
层协议,而不是在IPv4
的基础上修修补补。
IPv6
的一个重要特征就是“即插即用”,但在计算机网络领域,易用性和安全性存在一定程度的对立,只能在两者之间寻找一个可以接受的平衡点。
从目前已知的情况来看,无状态自动配置、邻居发现协议等都存在被欺诈或“中间人”攻击的隐患。
当然,IPv6
也在不断完善,这些因协议自身缺陷所导致的安全问题也越来越受到重视并加以修正。 -
非法访问
非法访问即未经授权的访问。在网络中,总是会对访问者的身份进行确认后才开放相应的访问权限。
一般来说,服务器会设置自身开放的服务端口,以及设置允许访问的客户端IP
范围,以尽可能达到防止非法访问的目的。这一般都是使用软硬件防火墙来实现。 -
扩展报头可能带来的安全问题
IPv6
定义了基本报头和多种类型的扩展报头,虽然这提升了处理效率,但可能存在一些安全问题。
比如攻击者可构造多个连续无用的路由扩展报头,由此导致防火墙等安全设备难以找到有效的TCP/UDP
报头,甚至会导致资源耗尽、内存溢出。
所以在一般情况下,建议在IPv6
中禁止逐跳路由报头、路由报头(类似于IPv4
的源路由)等扩展报头。 -
病毒和蠕虫
病毒和蠕虫也可以归为应用层安全问题,它与网络层是IPv4
还是IPv6
并无关系,因此IPv6
中也存在这些安全问题。
在IPv6
网络中,除了上面提到的几点外,还会有其他暂时未被发现的安全问题。
这些问题会随着IPv6
的普及逐渐凸显出来,也会越来越受到人们的重视和防患。
IPv6主机安全
在信息时代,攻陷服务器等主机可以获取有价值的信息,而攻击路由器/交换机等网络基础设施则获取不到什么有价值的信息,因此攻击者将注意力更多地集中到有价值的主机上。
当构建一个全面的IPv6
安全策略时,不能只考虑使用专门的安全设备来增强网络安全,IPv6
主机的安全同样不容忽视。
就IPv6
主机安全而言,主要目标就是远离网络中的攻击行为,对本机开放的应用服务进行访问限制、关闭不必要的服务端口、对存在安全隐患的应用(包括操作系统)及时修复、对入站的接收包和出站的发送包进行严格的限制、定期对主机进行病毒扫描和查杀等。操作系统的安全加固能大大提升IPv6
主机的安全。
在IPv4
向IPv6
过渡阶段,主机特别是服务器使用双栈的情况会长期存在,所以IPv4
协议和IPv6
协议的安全防护同等重要,不能厚此薄彼。
否则,即便IPv6
安全做得相当到位,一旦IPv4
协议被攻陷,IPv6
也会功亏一篑。
IPv6
主机的安全,更确切地说,是利用操作系统自身的一些系统管理应用程序对IPv6
主机进行安全加固。
IPv6主机服务端口查询
对IPv6
主机特别是服务器来说,要判断自身是否安全,需要先知道自身运行了哪些应用程序,这些应用程序开放了哪些TCP
或UDP
端口,以及本机端口与其他主机的连接情况。
TCP/IP
应用遵循客户端/服务器模型,作为服务器的主机在特定的TCP
或UDP
服务端口上监听,等待来自客户端的连接。
通过查询本机哪些端口处于监听状态,也可以识别自身正在运行的网络应用程序。
- 查看
linux
主机的服务端口
较新版的Linux
内核默认支持并开启了IPv6
协议,对于基于Linux
内核且支持IPv
6的多种操作系统来说,可以使用命令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
的安全策略如下所示。
关闭不必要的隧道
当主机处于纯IPv4
环境而又想接入IPv6
网络时,需要创建一些隧道才能实现。
就主机自身而言,可以创建的隧道包括ISATAP
隧道、Teredo
隧道、6to4
中继隧道等。
当处于双栈环境时,这些隧道就会成为通信障碍,甚至会成为潜在的可被利用的后门漏洞。
所以,在确认不需要隧道时,有必要将系统自身能自动生成的一些隧道彻底关闭并禁用。
- 在
linux
上禁用隧道
这里主要介绍如何在RedHat
发行版的Linux
系统(也包括CentOS
等)上禁用各种隧道。
一般情况下,可以使用命令ip tunnel show
查看Linux
主机上的所有隧道。
显示的隧道接口类型主要分sit、gre、tun、ipip
等。
sit
代表是的是6in4
隧道,gre
代表gre隧道,ipip
和tun
都是IPinIP
的隧道。
可以再使用ip link show
和ip 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
系统中,防火墙功能主要由iptables
和ip6tables
服务来提供,前者针对的是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
服务处于正常运行状态,如下图所示。
从上图可以看出,已经获取到两个ipv6
地址,而且firewalld
为开机自启动,且当前处于运行状态
3.查看Linux
的SSH
服务是否在IPv6
地址上开始监听,再确保防火墙策略放行了SSH
服务,如下图所示。
从上图可以看出,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:2
或FF05::1:3
,即使不需要返回流量,也会耗费路由器或服务器的系统资源,达到类似DoS
攻击的目的。
如果发往组播地址的报文中的源地址是伪造的,将会导致去往被伪造源地址的返回流量很大,安全隐患不可小视。
组播的安全问题一直以来都是一个挑战,这是因为组播的本质是从单一源发送到多个接收方,因此考虑到组播源可能会被接收方的反馈流量压垮,所以接收方只能被动接收信息,而不能进行消息确认。
一般的保障机制都需要双向通信,所以组播的安全问题并不好解决。对于组播的安全问题,一般会采取如下措施去缓解。
- 1.使用安全设备等检测数据报文的源地址,如果源地址是组播地址,则直接丢弃。主机也不应该对源地址是组播地址的请求报文进行响应。
- 2.除了必需的比如
NDP
、SLAAC
、DAD
等会用到的组播地址,其他组播地址尽可能禁止。 - 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
地址信息。
此外,双栈主机上的某种应用服务同时在IPv4
和IPv6
上监听,且能通过IPv4
的应用信息,探测出IPv6
地址。
因此,双栈主机如果一定要在IPv4
地址和IPv6
地址同时监听某种应用服务,那么除了IPv6
地址的接口标识符尽可能随机化外,应用程序本身的安全性也要注意。
因为直接扫描局域网中的IPv6
通常比IPv4
困难,所以攻击者会通过攻击存有IPv6
地址信息的其他主机,降低扫描难度。
这些主机既可以是DNS
服务器、DHCPv6
服务器,也可以是日志服务器,所以加强这些网络基础服务器的安全很重要。
NDP相关攻击及防护
无论是在IPv4
局域网中还是在IPv6
局域网中,要想与邻居或外界通信,都必须知道邻居节点或默认网关的物理MAC
地址。
在IPv4
中,是通过广播免费ARP
报文来学习邻居的MAC
地址。
而在IPv6
中,则是用NDP
来取代ARP
,并用多播取代了广播,但这并不是说NDP
比ARP
安全,由于NDP
并不提供相互认证机制,网络中任何不可信的节点都可以发送NS/NA/RS/RA
等相关报文,因此攻击者可以利用上述漏洞对局域网造成破坏。
一般说来,NDP
相关的安全威胁至少可以分为以下4种:
MAC
地址欺骗攻击及防范;- 非法
RA
报文威胁及防范; DAD
问题;- 路由重定向问题。
mac
地址欺骗攻击及防范
在IPv6
局域网中,要与邻居或默认网关通信,都必须将它们的链路层MAC
地址写入自己的邻居表中,以便将IPv6
报文封装在二层链路层中发送。
在IPv4
中,是通过发送ARP
报文来改变受害主机的ARP
表,以达到阻断受害主机正常通信的目的。
在IPv6
中也是一样,虽然IPv6
中不存在所谓免费NA
的机制,但动态学习到的邻居缓存表的有效寿命都很短暂,也就是NS
与NA
的报文的交互会很频繁,这使攻击者很容易通过发送NS/NA/RS/RA
等报文干预正常的交互通信,从而达到改写受害主机邻居表的目的。
MAC
地址欺骗的原理一般是,主机发送NS
或RS
报文来获取某个邻居或默认网关的MAC
地址。
攻击者截获该报文后,发送对应的NA
或RA
报文告诉请求者,所请求的邻居地址是自己伪造的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
有两种自动获取地址的方法,即SLACC
和DHCPv6
,所以IPv6 ND
检测依赖的IPv6 Snooping
就分为在SLAAC
和DHCPv6
两种情况下的监听。
NDP
的安全问题之所以难以解决,主要是发送方与接收方之间并没有安全认证机制,没有可靠的信任关系,自然就存在欺骗的可能。
虽然NDP
报文内置的跳数限制是255,且一些NDP
报文的发送源限制为链路本地地址或非指定地址,但这只是将安全威胁范围限制在局域网之内,并没有从根本上解决。
在NDP
发送方和接收方之间建立一种认证信任机制,可有效地杜绝欺骗攻击。RFC 3971
定义的安全邻居发现(SEcurity Neighbor Discovery,SEND
)以及RFC 3972
定义的密码学产生的地址(Cryptographically Generated Addresses,CGA
)正是防范邻居欺骗的机制。
- 非法
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
报文的发送方。
DAD
问题
网络上节点的任何IPv6
地址在生效前,都必须执行DAD
。
如果DAD
失败,则表明网络中已经有节点使用了该IPv6
地址,自己必须放弃使用该地址。
如果节点启用了私密性扩展地址功能,则会继续产生新的地址,并继续DAD
过程。
在DAD
过程中,攻击者可以发送NS
或NA
报文来通告地址已被占用,甚至会响应每一个DAD
,相当于本网络中的全部地址都被占用,这就使受害主机无法通过DAD
,从而无法拥有任何IPv6
地址。
对于这类攻击,只能由网络管理员通过抓包分析等手段,找出攻击者对应的网络端口并将其封禁解决。
设置NA
等报文的发送速率,也可以减轻威胁的影响。
- 路由重定向问题
路由重定向报文(类型是137的ICMPv6
报文)也属于NDP
的范畴。
路由器使用路由重定向报文向本网段中的主机发送一条路由信息,在其中指出一个更优的路由下一跳。
如果主机允许接收ICMPv6
重定向报文,就会在路由缓存中将目的地址的下一跳从默认网关改为路由重定向报文中指示的新的更优的下一跳。
同样,因为路由重定向没有相应的认证机制,因此可以伪造重定向报文。
但是,重定向报文不能直接发送而被主机接收,因为重定向报文的内建机制是必须由主机首先向默认网关发送一个到达某目标的报文,才允许主机接收默认网关发来的重定向报文。
因此,要发动重定向报文攻击,必须先伪造一个源地址(比如某网站的IPv6
地址),向受害主机发送比如类型为128的ICMPv6
回显请求报文,并假定受害主机必须对此回显请求报文回应一个类型为129的ICMPv6
回显应答报文。
然后,攻击者还得冒充默认网关向受害主机发送重定向报文,以改变受害主机的路由缓存表,从而使受害主机无法访问某网站。
对于这种攻击,攻击者必须持续不断地触发受害主机向目的地址发送报文,并冒充默认网关向受害主机发送重定向报文,而且受害主机还必须接受重定向报文并修改路由缓存,缺少中间任何一个环节攻击都不一定成功。
比如,若攻击者不持续攻击,则受害主机的路由缓存表在经历一段时间后会恢复正常。
要想禁止路由重定向攻击,不妨关闭默认网关的路由重定向功能,并在网络中禁止类型为137的ICMPv6
路由重定向报文,这样即便网络中真的有更优的下一跳,也直接忽略。
- 实验:非法
RA
报文的检测及防范
在IPv6
中,客户主机如果自动获取IPv6
地址,则必然少不了RA
报文的参与。
RA
报文既可以用来通告默认网关角色的存在,也可以携带前缀信息,以便客户主机自动生成地址或修改前缀(路由)表。
如果网络中有非法设备发送RA
报文,其危害性可想而知。
在本实验中,我们先观察在局域网中有两台路由器同时发送RA
报文时,主机获取地址等信息的情况。
然后通过相关信息查找到发送非法RA
报文的物理端口,并将其封禁。最后用一种较为有效的方法来防范非法RA
报文对局域网造成的影响。
-
开启所有节点。
-
分别对
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
-
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
-
分别在
Win10
主机和Host
上验证地址获取情况及默认网关的情况。Win10
主机的地址获取情况如下图所示。从图中可以看出,
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
命查看跃点数)的情况下,随机走一个网关? -
将合法路由器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
后,再分别查看Host
和Win10
主机的路由优先级。
在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
对应的跃点数的数值更低,如下图所示。由上可知,调整合法路由器的路由优先级,可以改变客户主机的默认网关,但
RA
报文中携带的前缀信息仍然可以用来配置地址,而且非法路由器也可以调整为高的优先级,所以这种方法不能彻底解决问题。 -
既然调整合法路由器的优先级不能彻底解决问题,就需要想一种方法将其彻底解决。
为此,可以在连接非合法路由器的接口上拒绝接收任何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
,所以可以在非信任路由器的端口上拒绝所有目的MAC
是3333.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 在入方向应用,即接收数据报文时
然后将
Host
的ethernet0/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
的原理借鉴了IPv4
中DHCP Snooping
技术的做法,二层接入交换机启用IPv6 Snooping
,用来监听以SLACC
或DHCPv6
方法自动获取地址的过程中的通信报文,形成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
的区别。
-
开启所有节点
-
路由器
R1
与路由器R2
之间有两条直连链路,在R1
上创建一个环回接口,并配置IPv6
地址。
R1
有一条默认路由指向R2
,走的是图中的e0/0
链路。
R3
上的默认路由指向R2
。R2
上有一条去往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 R3
的ethernet0/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
接口收到的。
这种来回路径不一致的不对称路由并不会影响结果。 -
对
R2
而言,当从接口ethernet0/0
收到R1
发来的报文时,它并不检查源地址是什么以及源地址是否合法。
假定从R1
发过来的报文的源地址2017::1
是一个伪造的地址,则可能会对网络造成影响。
为了安全考虑,在接口下启用源地址检查,即启用URPF
。
这里还要分为严格的URPF
和松散的URPF
。
如果是严格的URPF
,当R2
从ethernet0/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
有可能从R1
的ethernet0/0
或ethernet0/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
,又可以ping
通R2
了。一般情况下,如果是单接口链路的末梢网络,应该执行严格的
URPF
,R3
只有一条链路去往R2
,那么R2
的ethernet0/2
接口就应该执行严格的URPF
。
在生产环境中使用URPF
时一定要小心谨慎,否则有可能导致意外的通信故障。
dhcpv6安全威胁及防范
DHCPv6
是客户端自动获取IPv6
地址的一种方法。
在网络中,自动获取IPv6
地址的客户端首先会发送RS
报文,以试图接收R
A报文并优先以SLAC
C的方式获取地址。
如果没收到任何RA
报文,或者RA
报文并没有携带可用于自动配置的前缀列表,又或者RA
报文设置了O
位甚至M
位,客户端都会改为使用DHCPv6
自动获取IPv6
地址。
即客户端向组播地址FF02::1:2
发送DHCPv6
请求报文,以寻找局域网中可用的DHCPv6
服务器,网络中的DHCPv6
服务器或中继代理收到此报文后,会对客户端的请求进行响应,从而完成地址的分配和其他DNS
、NTP
等网络配置参数的下发。
在这个过程中,攻击者可以冒充DHCPv6
服务器来下发错误的网络配置参数,也可以故意发送大量的DHCPv6
请求报文来耗尽合法DHCPv6
服务器的可分配地址池,以及消耗服务器的CPU
等资源,从而达到正常客户端无法获取IPv6
地址的目的。
总的来说,虽然DHCPv6
与DHCPv4
的工作机制有所不同,比如监听的服务端口不同(UDP 546/547
)、身份标识符不同(DUID
)等,但DHCPv6
面临的威胁与DHCPv4
面临的威胁大同小异。
-
伪造
dhcpv6
服务器及隐患
在IPv6
中,只要攻击者将自己加入FF02::1:2
或FF05::1:3
组播监听组,并在UDP
端口547
上监听,就可以冒充DHCPv6
服务器向网络中试图通过DHCPv6
自动获取地址的客户端发送伪造的通告和响应报文,并进一步分配错误的地址和下发其他的甚至非法的DNS
服务器等网络配置参数。因为
DHCPv6
中不存在默认网关选项,所以伪造DHCPv6
服务器的攻击目的主要就是利用错误的DNS
地址将客户端正常访问的流量引入到错误的服务器上。
假定有这样一个场景,用户访问的是某个网银站点,但DNS
服务器的地址却被解析到精心伪装的非法站点上,其危害性可想而知。
当然分配到一个错误的全局单播地址,也会导致客户端的通信中断。之所以能发生伪造
DHCPv6
服务器的攻击,其原因还是客户端和服务器之间缺乏相互认证机制。
与IPv4
环境一样,可以在接入交换机上启用DHCPv6 Snooping
,将接入交换机端口分为信任端口和非信任端口,就可以有效地拒绝伪造的DHCPv6
发送通告和响应报文,从而消除了伪造DHCPv6
服务器造成的影响。 -
消耗
dhcpv6
服务器资源的dos
攻击及防范
DHCPv6
与DHCPv4
一个明显的不同是,允许一个客户端请求多个IPv6
地址,这也使攻击者可以不断地发送DHCPv6
请求,以申请大量的IPv6
地址,最终耗光IPv6
的地址池。当然,因为
IPv6
地址足够大,只要定义的地址池不是特别小,耗尽IPv6
地址池的可能性并不大,但这会给服务器的CPU
、内存等资源造成极大消耗,导致无法再为合法的客户端分配IPv6
地址,最终实现DoS
攻击。当前,应对
DHCPv6
服务器DoS
攻击的唯一方法就是对每一个客户端发送请求报文的速率进行QoS
策略限制,这与DHCPv4
相同,即为每一个客户主端设置一个请求阈值,超过此值的报文将统统丢弃。另外,如果确定
DHCPv6
服务器本身就性能不足,而且负担还比较大,或者能确定DHCPv6
服务器很容易遭受到DoS
攻击,那么采用无状态DHCPv6
或者改用SLACC
,将地址分配的任务交给路由器来完成,也不失为一个缓解DoS
攻击的权宜之计。 -
dhcpv6
地址扫描
某些DHCPv6
服务器(包括充当DHCP
服务器的路由器/交换机)在分配地址时,会按照从小到大或从大到小的顺序依次分配地址,这样攻击者会很容易通过获取到的IPv6
地址确定一个地址范围,对网络上的主机进行扫描以发现可攻击的目标主机。为此,建议在配置
DHCPv6
服务器时,尽量采用随机化的地址分配,并在服务器上做好已分配地址的记录(包含IPv6
地址、DUID
等的对应关系),并保存好日志文件,便于事后溯源审计。
IPv6网络互联安全
当网络之间相互通信时,特别是当局域网与国际互联网通信时,就需要使用路由器或防火墙等网络设备来实现网络之间的互联。
而路由器等设备就可以称为网络边界设备,互联的网络可以称为边界网络。
通俗来讲,网络边界设备就是一个网络与另一个网络的连接中枢,它在保证两个网络正常连接的同时,还须充分考虑网络连接时的安全。
通常情况下,内网(如局域网)对外网(如互联网)的访问不会有太多限制,因为通常内网是可信任的网络,而外网是不可信和不安全的网络,因此在通过外网访问内网时都需要进行严格的限制。
在实际环境中,还可能设置专门的隔离区/非军事化区(Demilitarized Zone,DMZ
),并将服务器等放置在DMZ
中,对来自内网和来自外网的访问都进行严格限制。
市场上常见的防火墙大多具有trust
、untrust
和DMZ
安全域的概念,且每个安全域具有不同的安全等级。
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
的加密和认证之间的异同。
-
开启所有节点
-
对合法路由器
R1
和R2
分别进行配置,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 neighbor
和show ipv6 route ospf
查看路由情况,发现一切正常。由于
R1
和R2
并未进行安全认证,而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
配置完成后,再在
R1
和R2
上查看OSPF
邻居,发现增加了R3
,同时也把R3
的本地环回接口地址2019::3:3
加入了路由表中。这是R1
和R2
不希望看到的结果。 -
为了在
R1
和R2
路由器上将非法的路由器R3
剔除,可以在R1
和R2
之间添加OSPFv3
认证。
R1
和R2
相互认证通过后才能建立OSPFv3
邻居关系,因为R3
并不知道R1
和R2
之间的认证密钥,所以R3
没法再与R1
和R2
建立邻居关系。
思科路由器支持两种OSPFv3
认证算法:MD5
和SHA-1
。
这两个都是不可逆的散列算法,都是任意长度任意字符的输入产生固定长度的输出。可以在任意版本的
Linux
主机上使用命令echo input_string | md5sum
产生MD5
输出,其结果是32位的十六进制数。
或者使用命令echo input_string | sha1sum
产生SHA-1
输出,其结果是40位的十六进制数。之所以提到在
Linux上
使用md5sum
或shalsm
工具,是因为在配置OSPFv3
认证时,需要输入32位或者40位十六进制数的散列值。
利用这两个工具的好处是可以输入一个简单的字符串,然后将产生的散列值直接复制在配置中。
当然这并不是必需的,也可以手动输入32位或40位十六进制数。要启用
OSPFv3
认证,可在R1
的ethernet0/0
接口下和R2
的ethernet0/0
接口下分别增加一条命令:
ipv6 ospf authentication ipsec spi 256 md5 60b725f10c9c85c70d97880dfe8191b3
这条命令的意思是,使用
IPSec
认证,其安全索引参数(Security Parameter Index,SPI
)值是256,这个SPI
在R1
和R2
上要保持一致。
MD5
散列值是32位十六进制数,其值在R1
和R2
上也要保持一致。配置完成后,在R1
上的结果如下图所示:从图上可以看出,
R1
与R3
不再能建立邻居关系,接口ethernet0/0
启用了MD5
认证,其SPI
值是256。在R2
上看到的结果与R1
一样。 -
除了为
OSPFv3
配置认证外,也可以配置加密。
方法是在R1
和R2
的接口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
的结果,如下图所示:从上图可以看出,接口
ethernet0/0
已经采用256位的AES-CBC
加密算法进行了加密。接口从认证改为加密后,效果一样,都能有效拒绝非法路由器R3
的接入。 -
从以上步骤可以看出,接口既可以做认证,也可以做加密,但两者只能选一种,不过两者达到的效果是一样的。
如果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
更为合适。
-
IANA
保留的IPv6
地址块
虽然IPv6
地址空间巨大,但考虑到未来的用途,一些地址并未进行分配。
目前来说,仅有2000::/3
地址块用作全局单播地址分配空间,除非有新的标准出来,否则保留地址块空间中的地址不应该出现在IPv6
国际互联网中,即源地址和目的地址都不允许使用保留地址块空间中的地址。 -
IPv6
已分配的地址块
从上文介绍的IANA
保留地址块可以看出,已经分配的全局可路由地址块只能是2000::/3
,可以在IANA
官网上进行查询已分配的具体地址块,页面中状态是ALLOCATED
的就是已经分配的地址块,由全球不同的组织单位再具体细分。 -
需过滤的
IPv6
地址块
由于已经分配的地址块毕竟还比较少,所以应该将一些尚未分配的地址,或者在网络互联时不该出现的地址块在网络设备上进行过滤。
一般情况下,应该尽可能地在路由控制层面而不是数据转发层面去进行地址块的过滤,即不允许将虚假地址写入路由器的路由转发表中,通常可以在运行动态路由协议时使用前缀列表对路由条目进行过滤,也可以选择使用下一跳接口是Null 0
的黑洞路由来直接丢弃。当然也可以采用白名单的方式,只将允许的
IPv6
地址块写入路由表中。
不管是哪一种方法,都需要及时跟踪已分配的地址块的情况并及时在路由控制上进行更新。
在全局可路由单播地址块2000::/3
中,还有部分地址块有特殊用途,在路由器上过滤路由条目也应考虑。
比如3ffe::/16
是当初的6Bone
实验网使用的地址,2001:db8::/32
是归档用的地址等。
一些需要明确在边界路由器上进行过滤的常见地址块如下所示:
实验:ipv6
路由过滤
本实验将模拟一台路由器将本地所有的IPv6
直联网段通过动态路由协议通告出去,其邻居路由器将这些路由条目进行安全过滤,只允许全局单播地址段写入路由表,并将过滤后的路由条目通告给自己的另一个邻居路由器。
通过本实验,可掌握IPv6
前缀列表的写法以及在IPv6
路由条目中应用前缀列表进行过滤。
-
开启所有节点
-
对
R1
和R2
路由器进行单区域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
路由表中。
-
在
R2
和R3
上运行EBGP
,R2
将OSPFv3
路由重分发到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
所有环回接口的地址段路由。 -
在本实验中,
R2
和R3
模拟的是真实环境下在不同自治区域之间运行的两台路由器。
很显然,R1
上的环回接口地址段路由中,除了2019:1::/64
是全局单播可路由地址外,其他地址段都不应该出现。
其中2002:E000::/32
是伪造的6to4网段,3FFE:1::/80
是已弃用的6Bone
实验网段,FD11::/16
是本地网段FC00::/7
中的地址块,它们都不应该发布在公网中,需要将这些非法网段进行过滤。
在过滤前,先简单学习一下IPv6
前缀列表相关的知识。需要过滤的地址块都是最大的地址块(前缀长度值已达最小值),
IPv6
地址都是层次化的设计和分配,需要判断哪些地址块是在可过滤范围内。以
FC00::/7
为例,其包括的子网地址块可以有很多,具体由前缀长度来决定。
如果子网前缀长度是8,那就有两个子网,分别是FC00::/8
和FD00::/8
,每个子网又可以继续往下分,即FD00::/8
又可以分为FD00::/9
和FD80::/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
的路由表,可以在R2
的OSPFv3中
进行过滤,这样再将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 应用前缀列表进行过滤
配置完成后,在
R2
和R3
上分别查看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
-
在实际应用中,可能还是允许在同一个自治域内网中的
R1
和R2
之间能全互通,并不需要进行路由过滤,只有当向别的自治域中的R3
进行路由通告时才需要过滤。
为此就不能在R2
上对OSPFv3
进行过滤,而应该在BGP
中执行过滤。
只不过在过滤时,不能直接引用前缀列表,而是需要定义一个路由映射(route-ma
p),由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
查看路由表进行验证。 -
在上一步中,是
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
协议之上,所以IPv4
的ACL
无法限制ARP
报文,这也保证邻居之间可以直接互相学习。
在IPv6
中情况有所不同,邻居之间的学习是通过NS
和NA
报文进行的,而NS
和NA
报文是ICMPv6
报文,运行在IPv6
协议报文之上,所以在配置IPv6 ACL
时,运行动态路由协议的两台路由器之间的NS
和NA
报文一定要放行,否则邻居会不可达。
思科等路由器的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
等状态。
所以在路由器上建立与TCP
或UDP
相关的ACL
时,必须考虑通信的两个方向都要做好ACL
控制。
这与有状态防火墙不同,在防火墙上配置ACL
时,通常只需关心发起通信连接的第一个报文即可。
比如一个客户端要访问一台在TCP 80
端口上监听的Web
服务器,在发起主动连接时,目的端口固定,源端口是随机产生的,所以在服务器向客户端返回报文时,再想通过目的端口(接收到的报文的源端口)来进行ACL
控制时,规则就不好写了,因此只能改为用TCP
状态来控制,比如TCP
的ACK
或ESTABLISHED
。
但这样也并不是总能满足实际的需求,幸好思科等路由器还支持反射(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
在本实验中也会出现,对实际应用会有一定的帮助。
-
对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
上远程Telnet
到R3
,出现登录界面后,输入密码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
,而这个地址已被R2
的ACL
拒绝,而改用R1
的环回接口0的地址作为源地址远程登录时,就可以正常访问了。
- 上面应用的
ACL
比较宽松,最后有一条permit ipv6 any any
。
对于严格的网络来说,这样做就不合适了。
现在要限制从R1
出去的流量只能去往TCP 80
端口的Web
服务,别的流量都要禁止,那么ACL
又该如何写呢?
因为最后要禁止所有流量,那么就必须先考虑放行一些必需的流量。
首先用于邻居发现的ND
和NS
报文需要放行,类型为2的ICMPv6
报文也需要放行。
通常还需要放行类型为1~4的ICMPv6
报文,便于网络诊断。
类型为128和129的ICMPv6
报文也可以考虑放行。
OSPFv3
运行涉及的报文也需要放行,来自组播地址FF02::5
和FF02::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
直连的下一跳路由器R2
的ethernet0/0
接口的入方向上应用此ACL
。
-
在将
ACL
应用到R2
的ethernet0/0
的入方向后,可以看到每一条规则的匹配数据。
再从R1
远程Telnet
到R3
,就会提示目标不可达,这是因为Telnet
并没有被放行。为了也允许
R1
远程登录到R3
,则需要在原ACL
中添加一条规则。
ACL
的每一条规则都有一个序号,序号按照从小到大的顺序排列,即sequence 10
到sequence 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登录
-
现在再要求
R1
只能在每天的8:00~18:00远程Telnet
到R3
,其他时间则不允许。
这就要用到基于时间的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
序号即可。 -
前面的步骤都是对
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
才可以远程Telnet
到R3
。
虽然本实验使用反射ACL
达到了有状态防火墙的防护效果,但路由器毕竟不是防火墙,针对一些非常规应用,如被动模式FTP
,因为后续主动连接的数据传输端口无法确定,所以路由器的反射访问列表也就无能为力了。
网络设备安全
因为网络中的服务器拥有更多攻击者感兴趣的信息,所以一般情况下,服务器才是攻击者的主要目标。
但因为路由器作为网络互联设备,不但保障网络的稳定运行,而且还拥有整个网络的拓扑信息以及一些重要的管理维护信息,攻击者可以通过嗅探路由器自身或转发的数据报文来获取有用信息,甚至利用路由器等网络设备系统自身或者管理上的漏洞攻破路由器等设备,进而危及服务器的安全,所以网络设备自身的安全不容忽视。
网络设备的安全至少要从以下4个方面来加强。
-
网络设备系统本身的漏洞要及时修补或升级,当暂时无法提供补丁或新版本时,也需采用临时解决办法或手段。在漏洞危害性大于因网络中断造成的影响时,可强制将网络设备下线。
-
路由器等网络设备需关闭不必要的服务。对于必须开放的服务,也应做好安全访问限制。如必须开放
SNMP
,应尽量采用可认证的SNMPv3
,设置好允许访问的主机范围。 -
网络配置应尽量简洁,对过时的无用的配置要及时删除,特别是在更改网络配置时,配置不能越来越繁杂。一些看似无用的网络配置可能就存在网络安全隐患。
-
路由器等网络设备也必须放置在不能随便进入的机房等场所,而且要避免设备上的网络连线被嗅探到。网络设备的
console
口也应设置不易破解的密码,关闭并按需启用暂时还没有连接到网络的端口。在启用远程管理的情况下,尽量使用认证加密的SSH
和HTTPS
,而避免使用Telnet
和HTTP
远程登录方式,建议使用非标准协议端口,并设置好允许远程访问的主机范围。
实验:对路由器的远程访问进行安全加固
本实验先通过抓包查看路由器的远程Telnet
密码,展示路由器通过Telnet
远程管理的安全隐患,再禁止路由器的远程Telnet
登录方式,改用SSH
协议,最后设置可远程登录主机的IPv6
地址范围。
通过本实验,可以掌握对路由器等网络设备的远程访问进行安全加固的方法。
-
从
R1
远程登录R3
,同时在R2
的ethernet0/1
口进行抓包分析。
先单击Protocol
列,以快速找到所有的Telnet
协议报文,再找到有密码数据的Telnet
报文,如下图所示:
这样依次出现的字符cisco
就是Telnet
登录密码。由此可见,Telnet
远程登录是不安全的。
-
既然
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)
-
最后在
R1
上验证ssh
远程登录到R3
的结果。R1#ssh -l admin 2019:3::3 Password: R3>
从本实验可以看出,因为
Telnet
远程登录的信息是明文传输,很容易被嗅探,所以应该尽量避免Telnet
,而使用SSH
来远程管理。
由于本实验中的路由器版本暂不支持修改SSH
端口号,所以还是使用的默认的TCP
22端口登录。
但并不是说这不安全,因为SSH
本来就是加密传输,使用标准端口不会有什么影响。
留言