什么是TCP指纹?如何模拟TCP指纹?

1、前言:什么是TCP指纹

很多指纹浏览器的用户,都听说过TCP指纹这一说法,那么,什么是TCP指纹?它和浏览器指纹之间有着怎样的关系? 本文尝试向各位读者做一番关于TCP指纹的启蒙式漫谈,但在谈及TCP指纹之前,我们首先需要了解什么是TCP协议。

一般在谈及TCP协议时,通常是带着IP地址一起谈,也就是常说的“TCP/IP”。 如果读过 《纯净IP地址--跨境人的爱恨情仇》一文,想必对IP地址应该有一个比较清晰的了解: IP地址是在互联网协议下提供的一种统一的地址格式。我们曾经举过一个例子:如果把整个互联网比喻成一座城市的话, 那么每一台能够上网的设备就是这座城市的楼房,而上网设备的IP地址就是这栋楼房的门牌号码。

通过IP地址标识不同的上网设备后,我们就可以在上网设备之间进行网络通讯了。既然要通讯,通讯双方必须要遵循一定的协议, 这就像无线电设备之间采用摩斯密码进行电磁波通讯一样,摩斯密码的长短信号就是无线电设备之间共同遵循的协议。同样道理,在上网设备之间进行网络通讯, 也需要遵循某种协议,这个协议一般而言就是TCP(Transmission Control Protocol)协议。当然,除了TCP协议之外,还有UDP等其它协议,但这不在本文的讨论范围之内。

假设我们有一台Windows主机、一台Linux主机,还有一台iPhone手机,在这三台设备之间,通过TCP协议进行网络通讯时, 显然,不同操作系统在处理TCP协议时有着自己特有的实现机制,尽管它们发过来的通讯内容都遵循TCP协议,但在具体的实现机制上, 不同的操作系统有着细微的差异,如此一来,我们就可以通过这些差异来判断这台设备是Windows主机还是Linux主机, 再或者是其它设备——我们把这种通过分析TCP协议实现机制的差异来判断主机操作系统的特性,称之为TCP指纹。

还是以摩斯密码为例,在摩斯密码表中,“一短一长”代表英文字母A,但发报员张三或者李四在发报时有着不同的手法,有的可能按的时间长一些, 有的可能按的时间短一些,尽管他们发出的内容都是“一短一长”,但我们还是可以通过发报手法的差异来判断当前的发报员是张三还是李四。

2、Windows TCP指纹与Linux TCP指纹

如前文所述,由于Windows操作系统和Linux操作系统在对TCP协议实现机制上的细微差异,当您使用不同的操作系统访问网站时, 网站可以通过对您电脑发送的TCP协议实现机制的差异进行分析,从而判断出您当前电脑的操作系统。

以Windows为例,我们使用一台Windows主机上的浏览器访问 https://browserleaks.com/ip ,可以看到, Browserleaks.com网站可以通过TCP指纹判断出当前浏览器所在电脑的操作系统是Windows:

《Windows操作系统下的TCP指纹》

同样道理,如果使用Linux操作系统上的浏览器访问上述网站,该网站同样可以判断出当前浏览器所在电脑的操作系统是Linux:

《Linux操作系统下的TCP指纹》

3、TCP指纹会影响到浏览器指纹的真实性

《什么是浏览器指纹?10分钟让您彻底了解关于浏览器指纹与指纹浏览器的背后一切》一文中,我们详细介绍了什么是浏览器指纹, 同时,我们也知道,浏览器指纹中包含着操作系统信息,如下图所示:

《浏览器指纹中包含操作系统信息》

“指纹信息的真实性”是衡量浏览器指纹非常重要的核心指标,既然浏览器指纹已经包含了操作系统类型,而网站又可以通过TCP指纹判断操作系统类型, 显然,这两者必须一致,如果这两者不匹配,岂非告诉网站:我的浏览器指纹是伪造的?

因此,对于指纹浏览器而言,必须要面对的一个问题是:解决“在浏览器指纹中包含的操作系统类型”与“通过TCP指纹判断的操作系统类型”的一致性问题

举个简单的例子,我们在指纹浏览器中创建一个账号,为其绑定一个浏览器指纹,在指纹中包含的操作系统类型为Windows;同时,又为此账号绑定一个IP地址, 而此IP地址位于某一台Linux主机;此时,当使用此账号代表的浏览器分身环境访问网站时,网站通过指纹信息判定客户端操作系统为Windows, 但通过IP地址发送过来的TCP指纹判定客户端操作系统为Linux,显然,网站会认为当前访问者的身份是有问题的。

聪明的您肯定会想到:IP地址绑定在一台Windows主机上不就可以了?是的,这种做法当然可以解决TCP指纹问题,但对很多指纹浏览器厂商而言, 这种解决方案的代价太高,究其原因,主要是Windows操作系统的授权问题。

我们以公有云厂商提供的IP地址为例,这些IP地址可以绑定在Windows主机上,也可以绑定在Linux主机上,但由于Linux系统是免费、开源的, 且只需要较小的硬件资源即可非常流畅的运行,因此,Linux主机的成本往往是Windows主机的50%左右。以阿里云为例, 一台1核1G的主机勉强能够运行Windows,再加上Windows的授权费用,其成本大概在65元左右每月,但一台同样配置的Linux主机成本大概在40元左右每月, 如果我们再降低一下配置,1核0.5G的主机依然可以流畅的运行Linux,此时的IP持有成本可能只需要35元左右每月。

显然,更完美的解决方案应该是:如何在Linux主机中模拟Windows TCP指纹。

3、花漾解决之道:在Linux主机中完美模拟Windows TCP指纹

在花漾4.1版本中,正式推出了在Linux主机中完美模拟Windows TCP指纹的特性,这意味着,凡是在花漾中购买的公有云IP,无论其主机类型是Linux还是Windows, 通过该主机发送的TCP协议内容,会根据浏览器指纹中指定的操作系统类型,进行TCP指纹的自动模拟。

给大家做个简单的演示,我们在花漾中购买一个操作系统为Linux的IP地址,如下图所示:

《在花漾中购买一个绑定在Linux主机上的IP地址》

我们将此IP地址绑定在某个账号上,同时,该账号绑定的浏览器指纹实例中的操作系统为Windows:

《账号绑定的指纹实例中的操作系统类型为Windows》

访问此账号以打开花漾指纹浏览器,并再次访问 https://browserleaks.com/ip 网站,可以发觉, 此时,网站判定的TCP指纹也为Windows,与指定的浏览器指纹实例中的操作系统类型保持一致。

《在花漾中购买的IP地址能够完美模拟Windows TCP指纹》

4、结论

如前文所述,通过对TCP指纹的分析,我们可以得出这样几个结论:

1、“指纹信息的真实性”永远是衡量指纹浏览器产品非常重要的核心指标

2、浏览器指纹信息包含操作系统类型,TCP指纹也包含操作系统类型,这两者必须保持一致,否则就违背了上述第一点

3、凡是只考虑浏览器指纹信息,而忽略了IP地址可能会暴露出TCP指纹信息的指纹浏览器厂商,都是在耍流氓

4、任何一家专业、严谨的指纹浏览器厂商,必须考虑如何让TCP指纹与浏览器指纹保持一致