为了保证家庭用网的稳定性,上周多拉了一条有 IPV4 公网( 112.10 开头)的移动千兆宽带( 300M 上),打算专门用来 PT 上传和下载,但实际中发现没有那么美好。部分站点速度非常快,包括 hdhome 、opencd 等;部分站点上传几乎没有速度,包括 hdsky 、chdbits 和 MT 等。再深入看下,发现上传没有速度的站点是因为 BT 客户端 IPV4 的 IP 识别错误,被识别成香港、联通等 IP ,导致无法链接。论坛里面发了贴,没有回复,周末捣鼓了下,基本搞明白了原因,过程记录下:
首先,做了 traceroute ,包括 traceroute
chdbits.co ,traceroute
tracker.hdskey.me,traceroute
tracker.m-team.cc 等等,仔细看了下路径,发现内站的几乎都是一样网络部署,都采用了 cloudflare 的 cdn (用作防火墙?),通过 cloudflare 代理链接到站点的 tracker 服务器。
然后,既然 cloudflare 本身就是代理,躲在 cloudflare 后面的 tracer 服务器怎么拿到用户的 IP 呢,Google 了一把,很快找到了 cloudflare 的 doc ,
https://support.cloudflare.com/hc/en-us/articles/200170786-How-do-I-restore-original-visitor-IP-with-Nginx ,内站大多是 nexusphp 架构,看下 Nginx 相关的内容,很快找到 cloudflare 默认配置:
#use any of the following two
real_ip_header CF-Connecting-IP;
#real_ip_header X-Forwarded-For;
再点
https://developers.cloudflare.com/fundamentals/get-started/http-request-headers 链接,看下两个 http header 的说明:X-Forwarded-For maintains proxy server and original visitor IP addresses. CF-Connecting-IP provides the client IP address, connecting to Cloudflare, to the origin web server. This header will only be sent on the traffic from Cloudflare's edge to your origin webserver. 两个的区别在哪里?文档里面写的很清楚,X-Forwarded-For 会把路径上所有的 IP 都带上,通过逗号分割; CF-Connecting-IP 只包含最后一个 IP ,譬如 getRemoteAddress 方法。
然后,为什么我的 IP 地址 家园可以解析,其他站点不可以?首先,家园可以,说明 cloudflare 可以把这个 IP 地址给到 tracker 服务器;然后,其他站点移动公网 IP 地址解析错误,电信 IP 地址解析没问题,再联想 解析出来的 IP ,原因就不难猜测:首先,移动运营商 为了降低网络之间的费用结算,中间做了某些不可描述的运营商内部的代理,他把原始的地址通过 X-Forwarded-For 传递了下去;而站点采用了 CF-Connecting-IP 这个配置,所以 只拿到了最后一个出口的 IP ,所以,对于可能中间有代理的情况下,会解析到最后的 IP ;而家园 应该是采用了 X-Forwarded-For ,通过字符串解析,取第一个 IP ,所以可以解决代理的问题,进而拿到了正确的 IP 。
最后,如果是移动公网 IP 来搞 PT 的话,大家不用纠结,作用也不是很大,然后,坛子里面有大佬可以解决这个问题嘛?跪求解决方案。。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/823687
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.