由于当用户位于防火墙之后可靠地到达我们在中国境外托管的正常终端时,我们正在寻找一种方法来可靠地确定用户当前是否在防火墙后面并使用一组不同的端点网址在中国境内举办。
我们想要做的是客户端可以进行某种检查,例如访问我们知道永远被防火墙阻止的URL(或者只能从内部访问)或检查网络的某些属性配置。
目前正在考虑的事情:
答案 0 :(得分:3)
IP地址范围或者你可以查看一些顶级被阻止网站的关键...也许Facebook,谷歌,华尔街日报?选择各种。
答案 1 :(得分:2)
我怀疑任何试图直接检查大防火墙的方法都不可靠,可能是在短期内,绝对是长期的。但是,由于您的目标是在中国境内或国外选择服务器,因此我建议您使用设备时区作为快速而肮脏的“#34;我在哪里?"校验。例如,如果时区名称为Asia/Chungking
,请使用中文服务器。例如,如果它是Europe/Amsterdam
,请不要使用中文服务器。检查中国大陆的每个时区,你可能会没事。
您可以将时区名称设为TimeZone.current.identifier
。
答案 2 :(得分:1)
更技术性的方法可能是分析防火墙发送的TCP RST数据包。 This(第5页)白皮书显示了研究人员如何能够通过修正TTL值并注意到它与服务器的不同而将TCP RST与防火墙区分开来(文中提到61与42)。
如果客户可能在中国(由其他信息确定),您可以在第一个连接上强制使用RST,保存TTL值,然后在获得不同值的RST时注意。
答案 3 :(得分:0)
我的建议是基于一些假设和一些验证流量来源的先前经验。
<强>假设强>
您不断检查的任何网址最终都会被GFWOC管理员注意到。
一个。这种流量模式将导致永久性阻塞,
湾和/或用于跟踪试图点击此网址的设备(可能作为蜜罐),
℃。和/或重定向到某种内部国家赞助和监控的某种终点。
您可以通过防火墙将更新推送到iOS应用。
选项强>
使用ppk身份验证登录在中国境外创建一个端点,并在您的iOS应用程序中包含ppk文件。端点返回用ppk加密的消息,这样只有iOS应用程序的调用实例才能解密响应,这可能只是&#34; ext_endpoint_reached&#34;或其他一些已知的确认消息。
如果无法正确解密或提供预期的消息,请故障转移到内部托管的端点。如果成功,请继续正常进行。
如果不允许出站加密流量,并且阻止入站加密流量,则可以取消两部分握手。在这种情况下,调用一个在外部端点A上注册一个出站连接。然后设备连接到端点B,它只是同一服务后端的另一个面,以查看它是否有等待某些参数的消息等待iOS应用程序实例。
如果它在B找到的消息与预期的消息匹配,并且这可能是基于时间或日期或其他一些独特因素的简单关键字,则您已成功到达外部端点,而如果您不在收到预期的回复或没有回复,您知道自己被阻止或重定向。
这两个选项都提供了一个故障转移,确认您正在访问防火墙,并且两者都依赖于任何非常奇特的东西来提供外部的,可能是非欺骗性的,确认您在防火墙之外。