什么是CGNAT?运营商级NAT对代理意味着什么
什么是CGNAT?运营商级NAT如何让许多用户共用一个公网 IP,100.64.0.0/10 是什么地址段,以及怎么判断你自己的网络是否在 CGNAT 后面。
CGNAT(运营商级 NAT,Carrier-Grade NAT)是互联网服务商让许多用户共用一个公网 IPv4 地址的做法。你的路由器拿到的是一个共享内部地址段里的地址,通常在 100.64.0.0/10 内,运营商的设备再把它转换成一个公网地址,而这个公网地址同时也有很多别的用户在用。网站看到的,就是这个共用的地址。
如果你在用代理,这会带来几个值得了解的后果:出口 IP 的信誉,网站为什么不太愿意封某些地址,以及你能不能放心地把自己的 IP 加进白名单。本文讲 CGNAT 怎么工作、谁在用、它改变了什么,最后给出一个两分钟就能做完的自测。
什么是CGNAT,为什么会有它?
IPv4 总共只有约 43 亿个地址,各地区的互联网注册管理机构在 2010 年代陆续发完了新的地址段。用户还在增加的运营商,没办法再给每个用户一个公网 IPv4 地址,只能共用。
长远的办法是 IPv6,地址多到每台设备都分得到。现在很多网络两者并行:支持 IPv6 的网站走原生 IPv6,其余仍需 IPv4 的流量走 CGNAT。
运营商级NAT是怎么工作的?
你家里其实已经在用 NAT 了。手机和电脑拿到的是 192.168.1.20 这样的私有地址,路由器在出口处把它们转换成自己的 WAN 地址。
CGNAT 在运营商那一侧又加了一层转换:
- 你的设备从私有地址发出请求。
- 路由器把它转换成自己的 WAN 地址。在 CGNAT 下,这个 WAN 地址不是公网地址,而是来自共享地址段。
- 运营商的 CGNAT 设备再转换一次,换成一个公网地址,外加一个端口号,端口来自分给你的那一段端口。
- 网站看到的是这个公网地址和这个端口。
流量先后经过三个地址空间(你的家庭网络、运营商的共享地址段、公网),所以工程师有时把它叫作 NAT444。一个公网地址同时被许多用户共用,靠端口区分各自的连接。一个地址由多少用户共用,取决于运营商,而运营商很少公开这个数字。
由此带来一个实际结果:要把某个行为追溯到具体用户,运营商需要公网地址、源端口和精确的时间。这也是 RFC 6302 建议网站运营方在记录地址的同时记录源端口的原因。
100.64.0.0/10 是什么地址段?
100.64.0.0/10 是 RFC 6598 在 2012 年 4 月划出的共享地址空间。它从 100.64.0.0 到 100.127.255.255,四百多万个地址,只用于一件事:运营商的 CGNAT 设备和用户路由器之间的那一段链路。
之所以单独划一段,是因为常见的私有地址段(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)已经被用在千家万户的内网里。如果运营商在自己那一侧也用 192.168.1.0/24,就会和用户自家的网络冲突。单独的地址段避开了这个问题。
这段地址永远不会在公网上路由。查一下 ASN 就能看到:Team Cymru 的 whois 对 100.64.0.1 返回 NA,RIPEstat 把这段标为“Shared Address Space”。也有运营商用 10.0.0.0/8 这样的私有地址段做同样的事,所以 WAN 地址不在 100.64.0.0/10 里,并不能排除 CGNAT。
谁在用CGNAT?
- 蜂窝网络运营商。 手机用蜂窝数据上网时,几乎都是这样共用公网 IPv4 地址的。
- 很多宽带运营商。 在新建的光纤网络、固定无线、卫星网络上很常见,在 IPv4 地址分得少的地区也很常见。有的运营商把所有用户都放在 CGNAT 后面,有的只对新用户这样做;有的可以按需提供公网 IPv4 地址,或者收费提供。
- 任何缺地址的运营商。 不管是什么网络,技术都一样。
CGNAT对代理意味着什么
一个地址,许多人,同一份信誉
网站和 IP 数据库按地址记录信誉。在 CGNAT 后面,一个地址承载着许多互不相干的人的流量,所以它的记录是大家共有的。你碰到的验证码,可能是同一地址后面的别人昨天招来的。反过来也一样:这个地址可能有很长一段正常浏览的历史,让它看起来很可信。
如果你按怎么自己检查代理 IP 质量里的步骤查出口的信誉,要记住这一点。一个记录有些斑驳的共享地址,和一个脏的代理 IP 是两回事。
网站为什么不太愿意封CGNAT地址
封掉一个 CGNAT 地址,等于封掉它后面的所有用户,而其中大多数是普通顾客。能认出共享地址的网站,往往改用别的手段:限速、Cookie、浏览器检测和验证码,封也多是短时间的。有些信誉数据库会标出它们认为是共享的、或属于蜂窝网络的地址。各个网站做法不同,也都不公开规则,所以这只能算一种倾向。
同样的道理也解释了一个你可能见过的现象:你明明没发几个请求,网站却回你 429 Too Many Requests。网站按地址计数时,算的是这个地址后面所有人的请求。怎么解决 429 Too Many Requests讲了应对办法。
住宅出口可能就在CGNAT后面
住宅代理通过某户家庭的网络连接把你的请求发出去。如果这户家庭的运营商用了 CGNAT,网站看到的就是运营商的共享地址。对你来说,这可能意味着:
- 不是你挣来的信誉,好的坏的都有,如上所述。
- 位置比较粗。 国家通常是对的。城市则可能指向运营商 CGNAT 设备所在的地方,那可能是离得有点远的区域中心。
- 粘性会话中途换地址。 CGNAT 设备通常会让同一个用户在一段时间内保持同一个公网地址,但也可能重新分配。登录步骤要写成可以重跑的。轮换代理和粘性代理对会话讲得更细。
从外面通常没法确定一个出口是不是在 CGNAT 后面。有些 IP 数据库会猜,准确度参差不齐。某个出口表现异常时,先多取几个样本比较,再下结论。
顺带说明:ProxyPanda 卖的是住宅、ISP 和数据中心代理,不卖蜂窝网络代理。如果你需要一个几周都不变的地址,静态 ISP 和数据中心 IP 按租期出租,下单时就能选国家、地区和城市。
我自己的网络在CGNAT后面吗?
有三个理由值得弄清楚:
- IP 白名单。 控制台可以把你连接时用的 IP 加进某个服务的白名单,之后只用
HOST和PORT就能连上。在 CGNAT 后面,你的公网地址是共用的,而且会变。把它加进白名单,同一地址后面的其他人不用密码也能用你的服务;地址一变,你自己反而用不了。这种情况请用用户名和密码。 - 入站连接。 给游戏服务器或家里摄像头做端口转发行不通,因为公网地址不归你。
- 在家老碰到验证码。 网站老让你证明自己是人,共享地址是可能的原因之一。
自测方法
- 查路由器的 WAN 地址。 登录路由器管理页面,在状态页里找“WAN IP”“Internet IP”或“外网 IP”。要看路由器,不要看电脑:有些 VPN 和组网工具会自己给电脑分一个 100.64.0.0/10 里的地址。
- 查网站看到的地址。 在同一个网络里运行:
curl -s https://api.ipify.org; echo
- 比较两者。 下面这个脚本帮你比较,并给出最可能的情况。只用 Python 标准库:
import ipaddress
import urllib.request
SHARED = ipaddress.ip_network("100.64.0.0/10")
wan = ipaddress.ip_address(input("WAN IP from your router's status page: ").strip())
with urllib.request.urlopen("https://api.ipify.org", timeout=30) as reply:
public = ipaddress.ip_address(reply.read().decode().strip())
print(f"router WAN: {wan} seen by websites: {public}")
if wan == public:
print("Same address: no carrier-grade NAT on your IPv4 connection.")
elif wan in SHARED:
print("WAN address is in 100.64.0.0/10: you are behind CGNAT.")
elif wan.is_private:
print("WAN address is private: CGNAT, or another router in front of yours.")
else:
print("Two different public addresses: something upstream translates your traffic.")
如果 WAN 地址是私有地址,先看看你的路由器是不是接在另一台路由器后面(比如运营商给的光猫兼路由器),再去怪运营商。两台路由器串联也会得到同样的结果。
进不了路由器?试试路由跟踪
traceroute -n 1.1.1.1
Windows 上改用 tracert -d 1.1.1.1。如果紧跟在你自己路由器后面的那一跳在 100.64.0.0/10 里,基本可以判断是 CGNAT。但这只是迹象,因为有些运营商在内部网络里也用这段地址,却不做任何转换。上面比较 WAN 地址的方法更可靠。
api.ipify.org 报告的是你的 IPv4 地址。CGNAT 是 IPv4 的事:在 IPv6 下,一户家庭通常能分到自己的一段地址。
常见问题
CGNAT 不好吗? 日常上网基本感觉不到。代价是信誉共享、不能接受入站连接,以及地址没法放心地加进白名单。
100.64.0.0/10 算私有地址吗?
不算 RFC 1918 意义上的私有地址。它是留给运营商的共享地址空间,永远不会在公网上路由。Python 的 ipaddress 模块判断它既不是私有地址、也不是公网地址,正好对得上。
能摆脱 CGNAT 吗? 问你的运营商。有的可以按需提供公网 IPv4 地址,有时收费,有的完全不提供。
用代理或 VPN 能绕过 CGNAT 吗? 它们改变的是网站看到的地址。你自己的连接要到达代理或 VPN 服务器,仍然要经过 CGNAT。代理和 VPN 的区别对两者做了比较。
下一步
如果你正要配置一个新的代理服务,先做一下上面的自测,再根据结果选择用户名密码还是白名单。各条线路的价格见价格页,小额充值就够试一条。碰到看不懂的结果,到 Discord 来问。