**知识
**
案例
随笔
声音
其他
前言
笔者的《涉嫌串通投标的电子标书,真的能出现127.0.0.1吗?》【11】内容其实非常粗糙,但是没想到阅读量竟达10万+。借此机会,笔者也从软件应用层开发角度,谈谈自己的一些关于ip处理相关的令人头大的经历,仅供抛砖引玉,期待高手留言。
混乱的手机上网ip
现在是手机互联时代,但是手机上网的ip问题可谓困扰一堆开发,其中常见的问题有:
(1)人和ip位置不匹配
这个问题可以说是由来已久。在以前,如果手机没开通拜访地接入业务,异地上网漫游时会显示原归属地ip。这就造成了人出差到A城市,IP却来自手机归属地B城市的怪事。现在就相对好一些。
但即便这样,人和ip位置不匹配的问题仍然存在。2022年,微博有用户就出现人在江苏,但IP归属地显示在安徽的情形。微薄的来去之间对此做了解释,那就是“IP属地,不是你的属地,是你上网运营商的属地”【3】。
你说这是不是就是安徽南京?(手动狗头)
(2)运营商级NAT(Carrier-grade NAT)导致不同的人共用同一个出口ip(ipv4)
为缓解IPV4地址不足的问题,运营商一般会给手机分配私有ip,然后一组人共享一个地址池。这导致在web网站看来,明明是不同地址的手机上传文件,但可能来源于相同的ipv4。如果以ip作重复判断,那么就很容易出现误判。
投标的看到这个重复ip判定导致的黑名单应该拳头硬了吧。你以为手机热点上传就稳妥了吗?运营商摆你一道。然而运营商:我也无辜啊(来源:抖音评论)
目前国内手机运营商的解决方法是大力推行ipv6,给上网的手机分配独立的ipv6,但是仍然会给一个NAT ipv4以作兜底。对于不支持ipv6的网站来说,仍然存在误判重复ip的风险。
笔者的手机是电信5G上网,可以看到IPV4仍然是一个内网IP
以上问题,强烈推荐阅读ipip.net创始人高春辉在2017-10-02发布的文章《IP 库之中国特色第三方出口篇~》【4】。
从CDN居然接收到内网ip
这是发生在笔者身上的真事,到现在仍然是个谜。
2022年11月18日,天气不记得,笔者做什么也不记得了,反正刚好有一条来自外网的web访问记录引起了笔者的注意——该记录显示用户ip为10.92.209.98。
明眼的人一看就知道,这是个A类私网地址(10.0.0.0/8),然而该服务器放在公有云,前面还有个CDN,那它是怎么访问过来的?
在排除程序错误之后,笔者找到了该公有云的CDN日志,赫然发现这个ip是从CDN过来的,而且条目还不少,一小时有数千条!
你没看错,这是直接从CDN拉下来的访问日志,里面有大量10.0.0.0/8 ip
这还得了,如果发生入侵了,那溯源线索直接就断了!于是乎赶紧提工单问问,然而公有云的售后解释是可能来自小运营商的网络,此事只能不了了之。
但是写本文的时候,笔者突然发现,可能遇到大杀器了,由此引申下面这个话题:TOA伪造源头ip。
伪造ip的大杀器:TOA伪造源头ip
对于web开发来说,不要随意信任X-Forwarded-For header头中的ip已经是必备安全知识了。但是假如传输层就已经给了你伪造的IP呢?这就是近年来令人不寒而栗的TOA伪造源头ip。
在分层网络管理中,如何主动将用户ip层层传递是一个经久不绝的话题。应用层就是http header头,那么传输层在进行负载均衡时也需要一个办法传递用户ip。于是乎TCP Header中的Options Segment就这样被使用起来了——将客户端ip和端口塞进去,形成一个TCP Option Address,即TOA【5】【6】。该方法没有改变协议,兼容性良好。
聪明的人也许想到了,既然应用层可以伪造X-Forwarded-For,那TOA也是不是可以伪造?答案是,可以。而且最惊悚的地方在于,该方法对应用层来说是绝杀,因为应用层从接收到数据的那一刻起,其源ip就已经被伪造了,无法感知。
有关TOA伪造的解读,推荐阅读“漕河泾小黑屋”的《再谈 IP 伪造》【9】,以及“一个不正经的黑客”的《【不可防御】TOA 伪造来源IP之"殇"》【10】。
内网环境配了外网ip
严格来说这个是偏向运维多一些,在此提一嘴。
许多网管或者devops由于不熟悉网络知识,很容易为内网服务器或者电脑配置成了公网网段,而非私有地址。结果当内网防火墙失效时,很容易将数据发送到公网外。
这并不是危言耸听。2021年美国国防部通过一个Global Resource Systems LLC,使用 AS8003 向互联网路由表宣告了自己(美国国防部)拥有的大批 IPv4 地址段。这导致“如果你在内网使用了6,7,11,21,22,26,28,29,30,33,55,214,215 开头的公网 IPv4 地址。你的内网流量有较高风险会经过互联网传送到美国国防部控制的网络”【8】。这事情当时在运维界轰动不少。
正确答案:192.13.0.0/16也是美国国防部的哦
事实上也有企业或者单位收到了相关的预警信息,内容大致为“个别单位将境外公网IP地址用作内网地址,导致单位数据大规模向境外传输”【7】。因此如果当你写的程序要对接的是内网系统,但是给的内网ip却是公网格式,务必要谨慎确认。
127.0.0.0/8
最后说一下127.0.0.1的一个趣事。
常理来说,127.0.0.1是用于本地环回地址,但实际来说,整段127.0.0.0/8都视作本地环回。RFC 5735《Special Use IPv4 Addresses》是这么说的【1】:
127.0.0.0/8 - This block is assigned for use as the Internet host loopback address. A datagram sent by a higher-level protocol to an address anywhere within this block loops back inside the host. This is ordinarily implemented using only 127.0.0.1/32 for loopback. As described in [RFC1122], Section 3.2.1.3, addresses within the entire 127.0.0.0/8 block do not legitimately appear on any network anywhere.
那么假如因为某些原因(比如网络异常、强制指定lo接口)的时候,操作系统将主机名解释成本地换回地址的时候,会一定是127.0.0.1吗?
答案是,还真不一定。Linux可以把主机名解析成127.0.0.0/8的任意一个地址,比如127.0.0.2,127.0.1.1…….等等等等。
河狸吗?这很河狸(手动狗头)!(截图为深度Deepin 23 Beta版)
更有意思的是,你甚至可以用相同的端口绑定127.0.0.0/8的任何一个地址,从而达到本地运行多个服务的效果。比如说,你可以将一个docker服务绑定到127.0.0.2,再将另一个docker服务绑定到127.0.0.3,达到同时运行,互不干扰运行的目的【2】。
所以如果本地客户端采集主机名解析,结果采集到的不是127.0.0.1,而是127.0.0.2,127.1.0.1,127.210.220.1……本地环回地址,不要慌,是技术性调整(手动狗头,划掉)——是本地环回地址无疑。
尾声
看到这里,作为开发的你也许背后阵阵发凉。ip都没办法做到真实,难道就这样束手无策?
笔者认为,任何的防御手段都有被攻陷的可能,作为开发,只能说尽量抬高攻击者的攻击成本,并且充分做好日志的记录和审计。而更重要的是,开发们在参与项目时,一定要和其他同事通力合作,共同完善对应项目的对外规则条文,同时善于利用法律法规进行预先示警和事后惩戒。这就是三分技术七分管理的重要性。
**参考资料
**
【1】https://www.rfc-editor.org/rfc/rfc5735
【2】https://superuser.com/questions/393700/what-is-the-127-0-0-2-ip-address-for
【3】https://weibo.com/1111681197/LsE3xu22z
【4】《IP 库之中国特色第三方出口篇~》,高春辉,2017-10-02,https://mp.weixin.qq.com/s/2teDwwIhyZ6BYIEQ_HL1vQ
【5】https://cloud.tencent.com/document/product/1552/90737
【7】https://nic.hactcm.edu.cn/info/1026/3283.htm
【8】《美国国防部1.75亿个IP激活,小心你的内网流量传到五角大楼》,云头条,2021-04-26,https://mp.weixin.qq.com/s/f3rp46frULcDx1CkLqigVQ
【9】《再谈 IP 伪造》,漕河泾小黑屋:https://mp.weixin.qq.com/s/AvYuqTYDuk8jdSDfferMBQ
【10】《【不可防御】TOA 伪造来源IP之"殇"》,一个不正经的黑客:https://mp.weixin.qq.com/s/uB7_BSdsTALzNk3M6hCZ9Q