Part 01 IPv6地址可用性
设备获取IPv6的全球单播地址后,理论上能够实现设备和业务服务器的双向端到端通信,我们使用笔记本电脑接入家宽网络,分配IPv6地址后并验证时,发现其公网连通性是不可达状态,这是什么原因呢?
bogon:~ root$ telnet 2409:8a28:ec3:51f0:2a12:93ff:fe68:fee5
Trying 2409:8a28:ec3:51f0:2a12:93ff:fe68:fee5...
telnet: connect to address
2409:8a28:ec3:51f0:2a12:93ff:fe68:fee5: Network is unreachable
原来是考虑到IPv6地址暴露后存在安全风险,运营商在智能网关标准中,提出了端口权限最小化和防攻击功能的要求,在网关出厂时,厂商会在网关中预置特定的防火墙策略。由于网络策略的存在,家宽网络中IPv6地址实际可用性是很差的,直接下行的转发流量基本都被网关拦截或丢弃。为了安全有效地使用IPv6地址,结合白名单机制的网络策略或许是一个不错的选择。
图1 《中国移动智能家庭网关技术规范》-端口权限最小化
图2 《中国移动智能家庭网关技术规范》-防攻击功能
Part 02 IPv6 session防火墙
IPv6端到端的通信,由于网络策略的原因,导致服务器到终端设备的下行流量被拦截。
经过对智能网关的分析,发现上述拦截能力可称为IPv6 session防火墙,该防火墙功能基于iptables实现,在网关的iptables转发链中,存在一个FORWARD_FIREWALL子链,用于存储控制转发的session防火墙策略。
防火墙策略FORWARD:
Chain FORWARD (policy ACCEPT 107 packets, 14852 bytes)
num pkts bytes target prot opt in out source destination
1 138K 34M SKIPLOG all * * ::/0 ::/0 mark match ! 0x4000000/0x4000000
2 3547 290K TCPMSS tcp * ppp0 ::/0 ::/0 tcp flags:0x06/0x02 tcpmss match 1300:65535 TCPMSS set 1380
3 3176 235K TCPMSS tcp ppp0 * ::/0 ::/0 tcp flags:0x06/0x02 tcpmss match 1300:65535 TCPMSS set 1380
4 73122 11M FORWARD_ALG all * !br+ ::/0 ::/0
5 146K 36M JNI_FILTER all * * ::/0 ::/0
6 72710 25M IP_FILTER_IN all !br+ * ::/0 ::/0
7 73122 11M IP_FILTER_OUT all br+ * ::/0 ::/0
8 73122 11M PARCTL_MAC all br+ * ::/0 ::/0
9 73122 11M URL_FILTER all br+ * ::/0 ::/0
10 73122 11M MAC_FILTER all br+ * ::/0 ::/0
11 146K 36M FORWARD_FIREWALL all * * ::/0 ::/0
(1)当关闭时,防火墙策略为空,
Chain FORWARD_FIREWALL (1 references)
pkts bytes target prot opt in out source destination
(2)开启ipv6 session防火墙后,Forward链策略中新增了两条策略:
Chain FORWARD_FIREWALL (1 references)
pkts bytes target prot opt in out source destination
252 26905 ACCEPT all br+ * ::/0 ::/0
234 72274 ACCEPT all * br+ ::/0 ::/0 ctstate RELATED,ESTABLISHED
这两条策略即为实现IPv6 Session防火墙的核心,基于iptables状态跟踪实现,其实现的转发控制能力如下:
(1)接收从任意br开头的网卡到其它网卡的流量(上行);
(2)接收从网卡到任意br开头的网卡的流量,该流量的状态必须是已经建立双向连接或该连接的衍生连接(下行)。
简单来说,就是终端设备往外访问的一律放行,外部服务器来访问终端设备,如果之前没建立过连接,直接拦截,反之则放行。具体的状态信息可参考如下概念:
- 概念分析
(1)iptables状态跟踪
从Linux2.6.15的内核版本后,iptables开始支持状态跟踪(conntrack),该功能依赖于netfilter的内核模块nf_conntrack。此后,iptables可以根据包的状态进行二次的过滤拦截和状态跟踪。它也是state/ctstate和nat的主要依赖模块。
conntrack将数据流的状态信息以Hash表的形式储存在内存中,包括五元组信息以及超时时间等。这里说的状态跟踪并非是指状态协议(如TCP)中连接状态的跟踪,而是conntrack特有的与网络传输协议无关的状态的跟踪。
(2)conntrack五种状态
conntrack共可以为连接标记五种状态,分别如下:
➟ NEW:新建连接请求的数据包,且该数据包没有和任何已有连接相关联。判断的依据是conntrack当前“只看到一个方向数据包(UNREPLIED)”,没有回包。
➟ ESTABLISHED:该连接是某NEW状态连接的回包,也就是完成了连接的双向关联。
➟ RELATED:匹配那些属于helper模块定义的特殊协议的网络连接,该连接属于已经存在的一个ESTABLISHED连接的衍生连接。简而言之,A连接已经是ESTABLISHED,而B连接如果与A连接相关,那么B连接就是RELATED。这部分不理解没有关系,也很难一句话说清,后面章节会用大量笔墨来阐明它。
➟ INVALID:匹配那些无法识别或没有任何状态的数据包。这可能是由于系统内存不足或收到不属于任何已知连接的ICMP错误消息,也就是垃圾包,一般情况下我们都会DROP此类状态的包。
➟ UNTRACKED :这是一种特殊状态,或者说并不是状态。它是管理员在raw表中,为连接设置NOTRACK规则后的状态。这样做,便于提高包过滤效率以及降低负载。
conntrack是一种状态跟踪和记录的机制,本身并不能过滤数据包,只是提供包过滤的依据。有状态是一种过滤依据,无状态实际也是一种过滤依据。
Part 03 IPv6白名单机制
IPv6 Session防火墙通过两条策略实现了转发防护的能力,那么是否可以在此基础上实现白名单机制,答案是肯定的,使用白名单机制将限定通道两端的发送者和接受者,同时又保持原有的网络策略开启,符合智能网关的标准。
iptables可以通过策略添加实现白名单机制,在智能网关的转发策略中加入允许发起下行请求的IPv6地址,并按照该地址筛选下行的源IP地址的数据包并放行。经测验,开启ipv6 session防火墙,并添加特定白名单后,终端设备即可支持ipv6地址的下行访问。以6.ipw.cn为例,我们新增策略如下:
ip6tables -t filter -I FORWARD -s 6.ipw.cn -j ACCEPT
ip6tables -t filter -I FORWARD -d 6.ipw.cn -j ACCEPT
新增后的iptables策略清单。
Chain FORWARD (policy DROP 3 packets, 246 bytes)
pkts bytes target prot opt in out source destination
7 1833 ACCEPT all * * ::/0 2409:8928:e20:84fe:a11b:b839:66ae:84a7
101 7226 ACCEPT all * * 2409:8928:e20:84fe:a11b:b839:66ae:84a7 ::/0
外网获取ipv6地址结果 ,即设备IPv6地址能够被6.ipw.cn访问。
curl 6.ipw.cn
2409:8a28:efb:b8a6:d1b6:9c3b:2f2e:c3ee
上述结果即说明该IPv6地址可被公网访问,说明白名单机制在理论上可行。
Part 04 总结
本文从实际家庭网络环境出发,分析家庭宽带网络中设备的IPv6实际可用性和安全分析,并尝试了一种基于白名单的IPv6地址使用方式,能够保证地址在防火墙开启的前提下使用公网的访问能力,但从家庭网络全局角度来看,目前缺少整体的安全发现和分析的能力,特别是在IPv6开放的情况下,原有的安全分析设备的支持性和分析能力,需要适配提升。下一篇文章我们来谈一谈,如何提供一种针对家庭网络的安全监测能力。