V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
changwei
V2EX  ›  全球工单系统

都 8012 年了,腾讯云 cdn 居然还不能获取访问 cdn 节点的用户 ip

  •  
  •   changwei · 2018-06-12 14:57:19 +08:00 · 4342 次点击
    这是一个创建于 2386 天前的主题,其中的信息可能已经有所发展或是发生改变。

    别家的云可以通过其他方式来获取连接到 cdn 节点的真实 IP (例如将真实 IP 写入特定的 HTTP 头部),腾讯云 cdn 还只能用 x-forward-for 这种会被伪造的有安全风险的方式来获取

    我有些 PHP 网站需要通过这个来判断要不要弹验证码(策略是:同一个 IP 输错多少次验证码或者密码就弹验证码,要是用户伪造了 x-forward-for,我的验证码就失效了)

    加这个功能没有多少技术难度吧。

    第 1 条附言  ·  2018-06-12 18:57:25 +08:00
    不好意思,**是我的实验错误导致错怪了腾讯云**,腾讯云的设计是合理的,cdn 会根据实际情况覆盖写入 x-forwarded-for 这个头部,无论用户如何伪造都是无效的,cdn 会根据实际的转发情况将这个头部重写,只有 php 裸奔在 web server 的时候才会被欺骗。

    至于我自己的错误,是因为我伪造的时候 x-forwarded-for 写成了 x-forward-for,导致没有成功,然后无脑喷了一波,删不了帖子,只能下沉一天了。算是一个很乌龙的英文错误把,我现在立刻面壁思过。

    腾讯云的客服很耐心的打电话过来帮我解决了问题,灰常感谢!!!
    11 条回复    2019-06-25 20:16:08 +08:00
    surfire91
        1
    surfire91  
       2018-06-12 15:07:43 +08:00
    瞎猜:
    其实 x-forward-for 也可以?如果腾讯云 CDN 内部不转发,直接拿最后一段,也就是直连腾讯云 CDN 的 ip。
    Felldeadbird
        2
    Felldeadbird  
       2018-06-12 15:17:51 +08:00
    x-forward-for 是腾讯拿回来给你的客户真实 IP。 如果按照常理来看,确实是会被伪造。但是,我觉得腾讯的技术人员应该不会犯这种低级玩意吧? 他们应该是将他们获取到的客户真实 IP,header 到 x-forward-for 而已。
    mydns
        3
    mydns  
       2018-06-12 15:20:09 +08:00
    前年提交的 CDN 工单 直接告知页面 10 秒超时改不了
    zpf124
        4
    zpf124  
       2018-06-12 15:23:06 +08:00
    连接到 cdn 节点的真实 ip 按道理作为一个代理服务器 cdn 会给你添加到 x-forward-for 这个头里啊。

    所以最终结果就两种,
    (之前多段 ip), 连接到 cdn 的 ip
    或者
    (之前多段 ip), 连接到 cdn 的 ip, cdn 的 ip

    你抓一个请求头看看包不包含 cdn 自己的 ip 就完了
    widdy
        5
    widdy  
       2018-06-12 15:33:11 +08:00
    楼主先伪造一个 x-forward-for,看看 CDN 转发给你的对不对,在来喷啊。
    phithon
        6
    phithon  
       2018-06-12 15:34:05 +08:00
    别家的云可以通过其他方式来获取连接到 cdn 节点的真实 IP (例如将真实 IP 写入特定的 HTTP 头部),腾讯云 cdn 还只能用 x-forward-for 这种会被伪造的有安全风险的方式来获取

    可以考虑再理解一下 x-forward-for 是什么。
    Reficul
        7
    Reficul  
       2018-06-12 16:02:37 +08:00 via Android
    x-forward-for 不是头?这个头的确可以伪造,所以你要加 ip 白名单,不能信任非来自 CDN 的找个头。
    tencentcloud
        8
    tencentcloud  
       2018-06-12 16:11:08 +08:00
    @changwei 您好,非常抱歉之前的工单答复给您造成误解。腾讯云 CDN 可以通过 x-forward-for 字段和访问日志两种方式来获取用户 IP。x-forward-for 字段是后端通过配置,获取真实客户端 IP 然后写入的,我们也可以支持后端特殊配置为其他字段来获取用户 IP。

    如您需要添加此项配置,欢迎您在工单里面反馈,我们会及时为您处理。感谢您的理解与支持。
    feverzsj
        9
    feverzsj  
       2018-06-12 16:27:19 +08:00
    http 就别用 ip 判断,本身就不靠谱
    Hardrain
        10
    Hardrain  
       2018-06-12 16:28:12 +08:00   ❤️ 2
    1. XFF header 的规则是这样,每经过一个代理 /CDN,这个代理 /CDN 就把上一个代理 /CDN/用户的 IP 附加到 XFF 后面,逗号分隔。这符合 HTTP 对于一个 Header 多个参数的规范。
    例: 后端----前端(反代)------CDN/缓存------负载均衡器------用户

    后端收到的 XFF 内容如下:用户 IP, 负载均衡器 IP, CDN/缓存 IP

    参考: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For

    2. 关于获取 XFF 中用户的 IP:
    Apache 和 Nginx 都有相关模块,请参考文档。
    https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html
    http://nginx.org/en/docs/http/ngx_http_realip_module.html

    3. PHP 获取 XFF header 的内容:
    关于 PHP 获取 Header: https://secure.php.net/manual/zh/function.getallheaders.php
    不过这个只适用于 Apache+mod_php,底下评论里有 Apache+PHP-FPM/Nginx 这类只能用 FPM 的 HTTP Server 所适用的解决方案

    如果 XFF 有多个 IP,用 explode()逗号做 delimiter 转成数组再处理

    4. 关于伪造 XFF,楼主想必看了些关于"伪造 XFF 绕过基于 IP 的 ACL"的文章。但我不得不说,you're so rigid. XFF 是 header,改个名字(X-Real-IP, X-Client-IP, etc)就不能被伪造了?

    对付伪造, @Reficul 所说的才是有效的解决方案。你需要的是白名单,即只接受(你所用 CDN 的)指定 IP 发来的请求中的 XFF。

    参考 Apache mod_remoteip 的 RemoteIPTrustedProxy 和 RemoteIPTrustedProxyList 参数
    Nginx 的 set_real_ip_from 参数。

    -------

    可算是把饭"喂到嘴"了,恁可以自己去查查文档吗?
    zhuzhenyu
        11
    zhuzhenyu  
       2019-06-25 20:16:08 +08:00   ❤️ 1
    问题来了,腾讯云 CDN 的 IPv4 和 IPv6 的 地址段是多少,想设置在信任列表里。腾讯云 CDN 文档中没有找到像 cloudflare 这样的 [IP Ranges]( https://www.cloudflare.com/ips/) 页面.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5899 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:57 · PVG 09:57 · LAX 17:57 · JFK 20:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.