超文本传输协议,日常浏览的各种网页都是通过HTTP协议传输,但是它的传输过程没有加密,不安全,所以被HTTPS替代。目前市面上所说的支持HTTP一般是指HTTP和HTTPS功能都可以实现,而不是只支持HTTP。
安全传输层,它的前身是SSL,它实现了将报文加密后再交由TCP进行传输的功能。即HTTP+TLS=HTTPS
服务器名称指示,简单来说,是用于在一台服务器的相同端口上部署不同证书的方法。服务器根据收到请求中的SNI域名来处理相应的请求,如果SNI域名为空,会按照预先设置好的默认域名处理请求。
内容分发网络,各个地区部署的服务器在一起形成的高速网络拓扑,用户在每个地区都能实现快速访问。CDN通过SNI响应不同的网站,同时也保护根服务器的安全。
主流的高性能开源HTTP反向代理工具,主要用于反向代理、负载均衡和动静态资源分离。本文只用到了反向代理服务实现访问Steam社区和加防自己的ASF。
在根服务器前部署一台外层服务器做为网关,用户只能访问到外层服务器,从而保护内网服务器不被暴露。做为网关,也可以对报文分析和修改。代理服务器和根服务器部署在一台主机上称为本地反代。
起初,国内通过DNS污染以及HTTP报文关键字检测来拦截访问Steam社区内容。在DNS污染下,浏览器访问会出现ERR_CONNECTION_TIMED_OUT错误,因为DNS会被指向一个不可访问的地址,访问也就超时了。解决方法就是在本地就做好解析,通过修改Hosts文件直连IP访问。但是这不是重点,现在的Steam社区也不是这么简单的屏蔽方式。2018年开始,Steam社区默认采用HTTPS链接,所有的浏览内容都会被加密,报文关键字检测的方法也就失效了。随后出现了更深层次的审查方法,也就是要详细介绍的SNI检测。
将Steam社区等域名添加到Hosts文件中并指向localhost,这里的localhost仅做为一个本地安全跳板,供Nginx正常监听的同时又能防止流量外泄。Nginx将监听到的数据中的SNI信息去除,再送向CDN的IP,使用IP而不使用域名是为了防止DNS污染,既实现完整通信又不被互联网审查到。
将访问困难的域名添加到Hosts文件中,配置如下:
127.0.0.1steamcommunity.com127.0.0.1www.steamcommunity.com127.0.0.1store.steampowered.com127.0.0.1api.steampowered.com一些云服务器在每次重启后会恢复默认Hosts,服务器提供商不同解决办法也不同,具体操作请自行百度。下面的Nginx配置也会用到这些域名。
整个通信过程必须使用HTTPS加密协议,一是为了避免审查机构的报文关键字检测,二是Steam禁止明文HTTP访问,会自动跳转到HTTPS访问。作为本地反代服务器,Nginx将监听的报文头处理后再发送给CDN,但是此时的Nginx服务器在宿主机看来是“不可信”的,除非强制让其可信,也就是在主机安装CA根证书,同时HTTPS反代也需要部署中间证书。
steamcommunityCA.pem:通过Openssl(302工具内置了Openssl)自签的CA根证书。只有在服务器中添加并信任根证书,它所签发的二级证书才会被信任。steamcommunity.crt和steamcommunity.key:上述CA根证书签发的二级证书,Nginx在反代时使用该证书和私钥对流量进行加密。只有服务器信任了CA根证书,用二级证书加密的流量才会被视为安全。
将steamcommunity.crt和steamcommunity.key放在任意一个能读取到的路径就好。例如放在/etc/nginx/ca-certificates/下方便管理,在Nginx配置文件中也方便填写相对路径。不同的系统,安装CA证书的方法也不同。例如在Ubuntu中,将steamcommunityCA.pem命名为steamcommunityCA.crt扔进/usr/local/share/ca-certificates/,然后执行update-ca-certificates安装。
Nginx的配置文件位于/etc/nginx/nginx.conf,这里给出基本配置:
ASF.json存放ASF的全局配置,主要是程序上的配置,基本格式如下:
{"Headless":true,"IPCPassword":"网页登入密码","SteamOwnerID":Steam帐号64位ID}变量名数据类型默认值备注IPCbooltrueIPC是否随进程一同启动。自V5.1.0.0版本开始,IPC已默认启用IPCPasswordstringnull访问IPC需要的密码,空即为不设置UpdateChannelbyte1更新及更新渠道设置,0为不更新,1为稳定通道,2为实验通道如果Github渠道下载过慢。改变值以禁止自动更新请务必设置IPC密码(IPCPassword),因为它是ASF的最后一道防线!
平常在电脑上安装ASF,ASF-ui默认监听localhost:1242端口,考虑到仅在本地访问所以Http通信足矣。但如果是部署在服务器上,ASF-ui就要暴露在公网上被我们所访问。在公网上不能保证自己的IP不被监听,如果继续使用Http通信,流量中的明文密码将会泄漏。因此,我们要将明文流量通过TLS加密,也就是使用Https协议,这样即使被别有用心的人监听到也只是加密的数据,对方无法解密,也就确保了密码相对安全。ASF自身支持以Https方式启动ui,也可以使用Nginx本地反代Http协议下的ASF。
不管哪种方式,都需要申请ssl证书才能启用HTTPS。而申请ssl证书需要一个合法域名。国内几乎申请不到免费的域名,免费方案下只能从外网免费申请了,我用的是Freenom申请了一年的.ml后缀域名。得到域名拥有权后再到国内云服务商上申请国内解析权,这样解析速度就和国内购买的域名一样了。
至于ssl证书申请,可以使用各大云免费申请一年,提交申请后半小时内就能下来。如果域名备案了,就可以放心使用443端口,否则就会被互联网审查机构拦截阻断。毕竟ASF一般都是私用,选择默认1242端口就好。使用其他自定义端口没有实际增加安全性,但可以避免过于明显的扫描。
一定要记得在服务器上放行相应端口!
下面简述几种常见的安全部署方案:
如果只部署在localhost,除非本机被攻破,否则ASF是安全的。IPC.config配置如下:
此时的IPC.config配置可以默认,默认了话就是监听本地1242端口,然后通过Nginx监听公网443端口。nginx.conf配置如下: