先了解一下SNAT:
SNAT Source Network Address Translation 源网络地址转换,其作用是将ip数据包的源地址转换成另外一个地址,可能有人觉得奇怪,好好的为什么要进行ip地址转换啊,为了弄懂这个问题,我们要看一下局域网用户上公网的原理,假设内网主机A(192.168.2.8)要和外网主机B(61.132.62.131)通信,A向B发出IP数据包,如果没有SNAT对A主机进行源地址转换,A与B主机的通讯会不正常中断,因为当路由器将内网的数据包发到公网IP后,公网IP会给你的私网IP回数据包,这时,公网IP根本就无法知道你的私网IP应该如何走了。所以问它上一级路由器,当然这是肯定的,因为从公网上根本就无法看到私网IP,因此你无法给他通信。为了实现数据包的正确发送及返回,网关必须将A的址转换为一个合法的公网地址,同时为了以后B主机能将数据包发送给A,这个合法的公网地址必须是网关的外网地址,如果是其它公网地址的话,B会把数据包发送到其它网关,而不是A主机所在的网关,A将收不到B发过来的数据包,所以内网主机要上公网就必须要有合法的公网地址,而得到这个地址的方法就是让网关进行SNAT(源地址转换),将内网地址转换成公网址(一般是网关的外部地址),所以大家经常会看到为了让内网用户上公网,我们必须在routeros的firewall中设置snat,俗称IP地址欺骗或伪装(masquerade)。
再了解一下SDP零信任敲门:
零信任SDP服务框架大概分5个模块,其中敲门模块至关重要,是访问SPA隐身网关的最重要一环。
1、用户接入模块
2、控制器模块
3、敲门模块
4、安全隧道模块
5、隐身网关模块(包含连接器)
那么SDP UDP协议敲门的SNAT漏洞是什么?看你下图
举个例子:
攻击者和合法用户都在同一栋大楼里上班,在公司同一个网段里,对外访问网络时需要SNAT源地址转换,对外敲门的访问IP在网关和SPA 敲门处理服务看来都是一样的,因此当零信任网关对合法用户放通访问端口的时候,攻击者也可以通过该端口对网关进行访问攻击。
这就是著名的UDP协议敲门的SNAT漏洞。
UDP敲门技术存在三个致命缺陷:
UDP敲门放大漏:同一网络下(出口有SNAT),一个终端敲门成功,通网络下所有终端均无需再次敲门。 UDP丢包:UDP无连接状态,且运营商经常会屏蔽非知名UDP端口的访问,在互联网出现丢包后无反馈信息,可用性差;
性能问题:UDP敲门成功后,需要为对应的终端IP添加iptables规则,放通TCP访问,当用户较多、频繁上线下线时,iptables操作严重损耗性能,影响业务稳定性。
解决方案主要有两种
1、改UDP敲门为TCP敲门,敲开后复用TCP连接进行通信,但会牺牲安全性,需要防范TCP syn ddos攻击。但是TCP的敲门稳定性更为优越,有利有弊吧。
2、敲开门后,访问网关携带身份信息,这是最有效的解决方案。
本人逆向过某SDP零信任客户端产品,当敲开门后,所有的TCP请求包都需要携带身份凭证信息,否则网关会直接拒绝连接。
身份凭证加密串:可以由用户ID、IP、Guid、DeviceId等组成,一般由SDP控制器加密下发给客户端,然后客户端将其携带在TCP数据包里,通过SDP隧道携带给SDP隐身网关,网关进行解析,如果解析身份凭证失败则拒绝连接,或者断开连接。网关解析身份凭证成功后,需要根据控制器,敲门服务等生成的缓存快速验证用户身份,若身份验证成功,则访问成功。
简单点如:JWT Token
业内多数解决方案为:客户端访问隐身网关资源时请求携带身份凭证