如何解决 CDN 污染的问题

如何解决 CDN 污染的问题,第1张

解决空气污染,尤其是汽车尾气污染,我想主要有这么几个途径:第一,交通要疏散,经常堵车,汽车一停一开,排出的气会很大。交通要畅通,路要通,车要走得畅,这是减少污染的一个方面。第二,使用的汽车排放要达到国家规定的欧三、欧四的排放标准。开车肯定要排气,但是排出的气体要符合国家规定的标准,不能使用那些已经被淘汰,排气污染比较大、浓度超标的汽车。第三,政府部门要加强对汽车的监督管理。对汽车的监督管理就是要按照国家有关的规定,每年汽车都要进行定期的检测。一旦检测出尾气超过排放标准,就要进行检修。国家也鼓励汽车在尾气排出去之前,安装一些净化器,来减少汽车尾气的排放。

2022年了,随着墙越来越高,以及部分运营商的墙中墙封锁,不仅Steam社区无法正常访问,就连商店也时不时抽风。

ASF的运行需要访问Steam社区检查游戏和掉卡情况,需要特殊手段才能访问到steam社区苟活。

好在Steam社区只是普通的封锁,并不是实质意义上的“墙”,通过一些手段仍然可以躲过互联网审查实现访问。

访笔者根据自己的实际例子介绍阻断方式和解决方法,以及自己在部署时用到的ASF本地反代和https安全部署,希望有遇到同样问题的朋友可以有所帮助。

文章可能会有不严谨的错误,请大家积极指出,我也会尽量完善。

缩写术语#

ASF(ArchiSteamFarm)#

目前最主流的Steam挂卡程序,代码完全开源,不必担心留有后门,可以在多个平台上运行,现已有中文WIKI。本文主要记录在Ubuntu(Linux)服务器上的部署教程。但对于没有用过ASF并不熟悉Nginx的萌新来说,还是建议在Windows上调试成功后再转到云服务器上。

HTTP(Hyper Text Transfer Protocol)#

超文本传输协议,日常浏览的各种网页都是通过HTTP协议传输,但是它的传输过程没有加密,不安全,所以被HTTPS替代。

目前市面上所说的支持HTTP一般是指HTTP和HTTPS功能都可以实现,而不是只支持HTTP。

TLS(Transport Layer Security)#

安全传输层,它的前身是SSL,它实现了将报文加密后再交由TCP进行传输的功能。即HTTP + TLS = HTTPS

SNI(Server Name Indication)#

服务器名称指示,简单来说,是用于在一台服务器的相同端口上部署不同证书的方法。服务器根据收到请求中的SNI域名来处理相应的请求,如果SNI域名为空,会按照预先设置好的默认域名处理请求。

CDN(Content Delivery Network)#

内容分发网络,各个地区部署的服务器在一起形成的高速网络拓扑,用户在每个地区都能实现快速访问。CDN通过SNI响应不同的网站,同时也保护根服务器的安全。

Nginx#

主流的高性能开源HTTP反向代理工具,主要用于反向代理、负载均衡和动静态资源分离。本文只用到了反向代理服务实现访问Steam社区和加防自己的ASF。

反向代理#

在根服务器前部署一台外层服务器做为网关,用户只能访问到外层服务器,从而保护内网服务器不被暴露。做为网关,也可以对报文分析和修改。

代理服务器和根服务器部署在一台主机上称为本地反代。

1. ASF下载与安装

1.1 ASF版本选择#

ASF有着Steam账号的高度控制权,所以安全部署尤为重要。

为保证程序不被恶意篡改,请务必在作者仓库上下载!

随着ASF版本的不断迭代,会修复许多安全漏洞,增强安全性,所以这里推荐使用最新稳定版。

我在部署时使用的版本是5.2.3.7,本文的所有操作均已在这个版本试验通过。

ASF在每个版本号下根据系统的不同又分为不同的文件,根据系统和CPU制造商来选择正确的版本,也可以直接下载源码编译。

我的服务器是跑在Intel CPU上的Ubuntu,所以下载ASF-linux-x64.zip文件。

1.2 ASF下载#

Linux上下载方式很多,例如wget指令。

wget https://github.com/JustArchiNET/ArchiSteamFarm/releases/download/5.2.3.7/ASF-linux-x64.zip

由于不可描述的原因,Github在大陆下载缓慢甚至无法下载。解决方法网上也有很多,可以自己在电脑上下载后再上传到云服务器,也可以通过镜像站下载,这里不再过多赘述。

1.3 ASF安装及使用#

Linux使用unzip命令解压zip文件。

笔者在当前目录下新建了asf文件夹,并解压到里面。

mkdir asf

unzip ASF-linux-x64.zip ./asf/

解压后,运行ArchiSteamFarm文件即可。

如果显示Permission denied或文件名为灰色,则需要执行chmod +x ArchiSteamFarm获取执行权限。

如果显示2022-03-16 15:29:39|ArchiSteamFarm-1377456|INFO|相关字段,说明ASF已经成功安装。

2. Steam社区受屏蔽情况和理论解决方法(跳过也不影响)

起初,国内通过DNS污染以及HTTP报文关键字检测来拦截访问Steam社区内容。

在DNS污染下,浏览器访问会出现ERR_CONNECTION_TIMED_OUT错误,因为DNS会被指向一个不可访问的地址,访问也就超时了。

解决方法就是在本地就做好解析,通过修改Hosts文件直连IP访问。

但是这不是重点,现在的Steam社区也不是这么简单的屏蔽方式。

2018年开始,Steam社区默认采用HTTPS链接,所有的浏览内容都会被加密,报文关键字检测的方法也就失效了。

随后出现了更深层次的审查方法,也就是要详细介绍的SNI检测。

2.1 SNI#

正常情况下,TLS握手需要经历以下几个阶段。

在Client Hello阶段,由于双方还未协商好加密方式,报文仍然是明文状态,其中Extension字段包含了SNI信息,也就包含了当前正在访问的域名steamcommunity.com,可以抓包获取到。

正常情况下,服务端根据这个域名发送相应的域名证书,进行接下来的握手步骤,在协商完后开始使用加密通信。

但是,SNI已经暴漏,审查机构会对当中的域名进行检测和阻断,也就是TCP重置攻击,通过对双方疯狂发送RST报文使连接重置,如果是浏览器访问就会出现ERR_CONNECTION_RESET错误。

看完了可能会困惑,为什么要有SNI这个东西存在,握手过程没有它不也没有影响吗?

是的,在以前,每个服务器只会绑定一个域名,SNI完全没有存在的必要,访问某个服务器也一定只访问这个域名。

但是随着CDN的迅速发展,大多数网站为了提升响应速度和安全等级,都会将服务交给CDN托管,也就是说每个CDN服务器都会为多家网站提供服务,例如Steam就将业务部署在CDN服务商Akamai上。

CDN服务器会根据用户要访问的域名提供相应的内容,也就是识别SNI中的域名返回相应的页面。所以SNI对于现在的互联网环境已经不可或缺了。

2.2 那么有什么办法可以解决呢?#

答案很碰巧,就是在Client Hello阶段不携带SNI或者携带无效的SNI,隐藏真实的连接网站来规避互联网审查。

当CDN检测到无效的SNI,会返回一张默认证书以便能够继续连接。碰巧的是,Akamai所返回的默认证书就是Steam的泛域名证书(毕竟Steam是最大的客户)。

这种技术叫做域前置,截至目前对Steam、Pixiv、Github等大型网站都有效。

下面就来介绍具体的实施过程。

3. 配置Nginx本地反向代理连接Steam社区(国外云服务器跳过)

好在这种阻断方式只是普通的封锁,并不是实质意义上的“墙”,可以通过本地反向代理绕过审查。

Windows端可以通过steamcommunity 302轻松解决(羽翼城大佬YYDS)。

Linux端可以参考他的文章 Linux/Macos环境下使用 steamcommunity 302 教程。

鉴于Nginx是主流以及它还跑有其他服务,这里根据大佬的思路在Nginx上实现。

将Steam社区等域名添加到Hosts文件中并指向localhost,这里的localhost仅做为一个本地安全跳板,供Nginx正常监听的同时又能防止流量外泄。Nginx将监听到的数据中的SNI信息去除,再送向CDN的IP,使用IP而不使用域名是为了防止DNS污染,既实现完整通信又不被互联网审查到。

3.1 配置Host#

将访问困难的域名添加到Hosts文件中,配置如下:

localhost steamcommunity.com

localhost www.steamcommunity.com

localhost store.steampowered.com

localhost api.steampowered.com

一些云服务器在每次重启后会恢复默认Hosts,服务器提供商不同解决办法也不同,具体操作请自行百度。

下面的Nginx配置也会用到这些域名。

3.2 生成并安装证书#

整个通信过程必须使用HTTPS加密协议,一是为了避免审查机构的报文关键字检测,二是Steam禁止明文HTTP访问,会自动跳转到HTTPS访问。

作为本地反代服务器,Nginx将监听的报文头处理后再发送给CDN,但是此时的Nginx服务器在宿主机看来是“不可信”的,除非强制让其可信,也就是在主机安装CA根证书,同时HTTPS反代也需要部署中间证书。

网上的许多教程都是用命令生成的证书,步骤比较复杂。不会操作的可以运行steamcommunity 302自动生成证书,上传到服务器。

302工具第一次使用后会在根目录生成一堆证书和密钥。

只需要将steamcommunity.crt、steamcommunity.key和steamcommunityCA.pem三个文件上传到服务器。

三个文件的作用

将steamcommunity.crt和steamcommunity.key放在任意一个能读取到的路径就好。例如放在/etc/nginx/ca-certificates/下方便管理,在Nginx配置文件中也方便填写相对路径。

不同的系统,安装CA证书的方法也不同。

例如在Ubuntu中,将steamcommunityCA.pem命名为steamcommunityCA.crt扔进/usr/local/share/ca-certificates/,然后执行update-ca-certificates安装。

3.3 配置Nginx参数#

Nginx的配置文件位于/etc/nginx/nginx.conf,这里给出基本配置:

server {# 部署一个虚拟主机

listen localhost:443 ssl# 监听localhost的443端口

server_name steamcommunity.com# 添加要监听的域名,与Hosts文件里的域名一致

server_name www.steamcommunity.com

server_name store.steampowered.com

server_name api.steampowered.com

ssl_certificate ca-certificates/steamcommunity.crt# 设置证书,这里使用了相对路径,绝对路径也行

ssl_certificate_key ca-certificates/steamcommunity.key# 设置与证书匹配的密钥,同上

location / {# 当监听的端口检测到通往上述域名的流量时,执行下列操作

proxy_pass https://223.119.248.24/# 将流量送往223.119.248.24主机,理论上任何一个Akamai服务器IP都可以

proxy_set_header Host $http_host# 务必要加上,否则会报错URL非法

}

}

做完后记得让Nginx重新读取配置,也就是找到Nginx的主程序然后nginx -reload。

问:为什么要监听443端口?

答:因为ASF使用Https协议请求Steam获取数据,也就是日常浏览网页的方式。Https协议默认通过443端口传输,所以proxy_pass https://223.


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/504187.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-17
下一篇2023-06-17

发表评论

登录后才能评论

评论列表(0条)

    保存