笔者最近使用阿里云CDN(内容分发网络)来给 OSS 源站点做加速,CDN的管理后台可以设置IP黑名单的来屏蔽恶意的流量请求。笔者用手机的这台电脑做了测试,CDN的后台日志记录了笔者最近的IP访问记录,于是笔者想先查看下本机的公网IP地址,然后在后台选择该 IP 地址来做屏蔽黑名单的测试。但是让我笔者疑惑的问题出现了,笔者在不同的网站上面查的公网IP居然是不相同的?笔者接入的带宽运营商是方正宽带。

运营商:「方正宽带」  不同站点IP查询记录
日期|IP查询网站

ipshudi

ip138

baidu chinaz
Day: 10.15

100.102.18.22

(保留地址: 运营商级NAT IP地址)

59.109.149.63

(中国北京北京 方正宽带)

59.109.121.31 (中国北京北京 方正宽带)

60.10.12.102

(中国河北廊坊安次区 联通)

Day: 10.16

100.102.3.228

(保留地址: 运营商级NAT IP地址)

59.109.145.139

(中国北京北京 方正宽带)

59.109.121.175 (中国北京北京 方正宽带)

222.129.60.69

(中国北京北京 联通)

备注:「IP 地址单元格」的括号里面是IP的归属,在ip138首页输入IP地址查询可以获取到。

一、横向比较与分析

按日期横向来比较,不同网站查询到的IP地址不一样。为了方便说明,这里先忽略第一列的「保留地址」,只看后面三列的数据,ip123 和 baidu 查询 IP 都属于方正宽带,chinaz 查询到的IP属于联通,这是因为长城宽带租用了基础运营商-联通的带宽,所以如果走联通的出口获取到的就是联通的公网IP。这里也可以这么理解,当笔者本机请求 ip138、baidu、chinaz 这三个站点时,因为请求的「目标站点」不一样的,选择的出口不一致,因此接入公网的IP就不一样了。 这种情况在小的运营商里很常见(通过基础运营商电信、联网、移动接入公网),尤其是长宽、歌华、宽带通(俗称二手运营商)等,据说接入的是联网、电信这样宽带服务不会出现类似的问题。简单点说,你的网络运营商有多个出口,不同出口的IP公网地址不同。

二、纵向比较与分析

如果以某个网站为基准纵向对比,同样的运营商(ISP),为什么查询到的IP公网地址也不相同呢?答案是「动态NAT技术」。

1. NAT技术原理介绍:

这里为了方便理解,先介绍下NAT(一种网络地址转换技术)。简单来说,我们的IP地址分为「公网/外网IP」和「私网/内网IP」,因为ipv4设计的局限性,随着全球联网设备的不断增加,公网IP地址已经接近枯竭,因此采用NAT技术可以实现将一个公网IP和多个内网IP地址之间的转换,解决了IP公网地址短缺的问题。通过这种方式,多个用户能够「共享」同一个公网IP,所以即使运营商只分配了一个公网IP,多个用户也能同时访问 Internet。

在 IPv4 地址资源越来越紧张的今天,很多电信运营商,已经不再为用户分配公网IP;而是直接在运营商自己的路由器上运营 NAT,为用户分配内网 IP。这样,只需要少量的 IP 地址,就可以支撑大量用户的上网需求。这样的 NAT 又叫做 CGN(Carrier-grade NAT,电信级 NAT)。

2、什么是动态NAT?

使用公有地址池,并以先到先得的原则分配这些地址。当具有私有IP地址的主机请求访问 Internet 时,动态 NAT 从地址池中选择一个未被其它主机占用的 IP 地址一对一的转化。当数据会话结束后,路由器会释放掉公有IP地址回到地址池,以提供其他内部私有IP地址的转换。

3、动态选择公网IP地址

内网中有设备需要去访问我们公网,需要做一个NAT地址转换,把我们私网的IP地址转换成我们公网的IP地址,这时就需要使用动态NAT了,使用地址池中的公网地址进行IP地址转换,去访问我们的公网,因为选择的公网IP是随机的或者变化的,所以我们查询到IP地址就不一样了。

三、保留地址:运营商级NAT IP地址

现在来说下最开始提到的「保留地址」,ipshudi 网站查到的两个IP地址有个特点,他们的地址都是在「100.64.0.0~100.127.255.255」这个范围以内,这个保留地址也是用于内网,但是这个内网不是一般内网而是Carrier-grade NAT,这个英文对应的翻译是“运营商级NAT”。进一步搜索得知2012年4月的 RFC 6598 (IANA-Reserved IPv4 Prefix for Shared Address Space) 将100.64.0.0/10 (Shared Address Space) 地址块,用于给运营商ISP使用。

常见的保留地址见下图,这个数据是我们网上可以搜到的,但是因为比较老旧了,所以看不到上面提到的「Carrier-grade NAT」保留地址:

更加「完善」的保留地址:

既然在「ipshudi」网站查到的两个IP地址都是NAT处理后的内网地址,它们就是动态生成的,所以不一样也就可以理解了。

「注意」:为什么一个内网地址可以在「ipshudi」这样的第三方站点查到呢?笔者在CDN后台的请求IP日志里也找到了和「ipshudi」同样的内网地址。内网IP是不可以直接和外网站点就行连接和通信的,那这个地址是怎么获取到的呢?所以笔者的猜想是:「ipshudi」和 「CDN站点」在笔者接入的方正宽带的内网里也有服务器,既然用户和第三方服务器都都在同一个内网,所以获取到的IP地址也是内网地址,见下表的第一行:

四、结语

既然用户的IP地址是变化的,那么CDN用后台记录的IP来做黑名单管理可能就不是那么准确了。因为用户发起请求的的公网IP在不断变化,恶意请求源IP就无法准确定位了。另外,如果单个公网IP通过NAT由多个用户共享并联网,那么被黑名单屏蔽的公网IP可能会影响到其他的正常请求服务的用户了。

为了弄明白上面的这个问题,笔者查阅了相关文章,重拾起「计算机网络」的基础知识,对一些疑惑的知识点有了更清晰和更深入的理解。推荐几篇非常好的文章,能帮助你快速建立计算机网络的整体知识结构和图谱,并且轻松掌握一些比较难理解的基础知识,可以进一步帮助你的工作和学习。

互联网协议入门(一) - 阮一峰的网络日志

入网指南 01 | 一文读懂你身边的「网络」

入网指南 02 | 当你发消息的时候,发生了什么

入网指南 03 | 交换机在交换什么? - 少数派

入网指南 04 | IP 地址大揭秘 - 少数派

家庭网络中的「NAT」到底是什么? - 少数派

为什么在不同网站查询本机的公网IP不一样?相关推荐

  1. 查询电脑手机出口公网IP地址(含IPv4和IPv6)

    百度搜ip有时候查到的公网出口ip地址不准确,找到一个比较准的.IPv4和IPv6出口地址都可以查,分享一下. 1)查询当前上网使用的出口IP. http://dns.ricearth.com/ip ...

  2. 查询本机/代理/指定IP信息(归属地) Api

    查本机IP信息: https://ip.cn/api/index?ip=&type=0 https://2022.ipchaxun.com/ http://api.k780.com/?app= ...

  3. linux shell 通过 第三方 网站 网页 得到 外网 公网 ip

    有如下网站接口: # 纯ip地址 curl api.ip.sb# 纯ip地址 curl ifconfig.me# 纯ip地址 curl ifconfig.co# 纯ip地址 curl ident.me ...

  4. 如何知道本机的公网ip

    再说用cmd ipconfig 我把你刀了 其实很简单: 1.打开百度 2.输入"本机ip"即可

  5. Linux命令终端如何查询本机的内外网IP地址

    文章目录 查询本机外网 IP 地址 查询本机内网 IP 地址 查询本机外网 IP 地址 [root@htlwk0001host ~]# curl ifconfig.me # 太慢了,不行[root@h ...

  6. Linux服务器查询自己的公网IP

    查询Linux主机的公网IP,在命令行中数据如下命令即可. $ curl ip.sb $ curl ip.gs # 现在也可以用,不好使的时候就用上面那个 $ curl https://ipw.cn ...

  7. 20220603怎么查询公网IP

    怎么查询公网IP 别扒拉我代码 于 2022-01-14 10:45:34 发布 13853  收藏 1 文章标签: tcp/ip 服务器 网络协议 程序人生 版权 如果我们连接的是公司或者学校的局域 ...

  8. 【python】获取本机局域网ip和公网ip

    1.本地局域网IP 局域网ip比较好获取,只需要udp协议访问一下DNS地址即可 import socketdef get_host_ip():s = socket.socket(socket.AF_ ...

  9. Linux查询服务器公网IP的方法汇总

    Linux查询服务器自己的公网IP的方法大全: curl ifconfig.mecurl cip.cccurl ip.sbcurl ipinfo.io curl ipinfo.io/ipcurl ic ...

  10. linux 查本机公网ip 网站接口 nmap工具

    网站接口 # 国内某网站的接口,只返回IP curl whatismyip.akamai.com# 更多用法访问ifconfig.co wget -qO - ifconfig.cocurl icanh ...

最新文章

  1. 滴滴自动驾驶,现在是一个怎样的“富二代”创业项目?
  2. (转载兼整理)Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
  3. 《去哪网编程题》身份证分组
  4. function click_click事件的累加问题解决
  5. python是后端语言还是前端语言_从前端到后台-语言选择
  6. linux输入ls后不显示_零基础学习之Linux基础命令小结
  7. 循环计数_倒计数器:CountDownLatch | 循环栅栏:CyclicBarrier
  8. tcp的粘包和拆包示例以及使用LengthFieldFrameDecoder来解决的方法
  9. 关于bash如何进行并发执行!
  10. 有一些无声话语,只有寻梦的人彼此听得见
  11. ds18b20数字温度传感器特点及使用介绍
  12. 针对初学者的 MQL 5 中的自定义指标
  13. 《论持久战》的主要原则
  14. Artifact xxx:war exploded: Error during artifact deployment. See server log for details.
  15. 管理学原理简答题和论述题
  16. navicat导入excel表中数据出错问题
  17. 雷军给陈年总结的小米十条经验
  18. Discuz x2 数据字典
  19. PHP-深入理解Opcode
  20. 贝努利模型 matlab代码,贝努利(Bernulli)-模型.ppt

热门文章

  1. A Game of Thrones(60)
  2. 股市底部上证指数与物价上涨的关系01
  3. 光子/粒子的波长,频率及能量的对应表
  4. 共轭先验分布及其应用
  5. python求梯形面积_python计算梯形面积
  6. c#记录合并PDF和word
  7. 在ensp中配置交换机interface GigabitEthernet 1/0/1报错
  8. 路由器Telnet及ACL配置
  9. 计算机445 135 139端口,Win7如何关闭445 135 138 139端口
  10. linux ps查看进程,Linux命令之ps:查看进程状态