什么是ASN?买代理之前要懂的自治系统号
什么是ASN?它是标识 IP 背后那张网络的编号。本文讲 ASN 由谁分配、BGP 怎么把 IP 和 ASN 对上,以及三种免费的自治系统号查询方法。
ASN(自治系统号,Autonomous System Number)是互联网上用来标识一张网络的编号:一家家庭宽带运营商、一家主机商、一所大学、一个大型平台,各有各的号。每个公网 IP 地址都由其中某一张网络对外宣告,所以查一下 ASN,就能知道一个地址由谁负责、属于哪一类网络。
对买代理的人来说,这件事比看上去重要。代理上的“住宅”“ISP”“数据中心”标签,基本上就是根据宣告这个 IP 的网络推出来的。弄懂 ASN,你就能自己核对标签。本文讲这个编号是什么、从哪里来,以及三种免费的查询方法。
什么是自治系统?
自治系统(AS)是由同一个运营方管理、采用同一套路由策略的一组 IP 地址段。说白了,就是互联网其他部分眼中某个组织的那张网络。Cloudflare 的网络是一个 AS,Google 的是另一个,你家宽带运营商的是一个,托管你常去网站的云服务商也是一个。
互联网就是几万张这样的网络连在一起。每张网络自己决定流量怎么进出,也会告诉相邻的网络:哪些地址的流量可以交给它。
有些组织不止一个 AS:按地区各设一个,或者每收购一家公司就多继承一个。所以“一家公司一个号”可以当作入门的理解,但不是规则。
什么是ASN,由谁分配?
自治系统号就是在路由中标识一个 AS 的编号。Cloudflare 的是 13335,通常写作 AS13335;Google 的主要编号是 AS15169。
编号是一级一级分下去的:
- IANA 管着全球的编号池,把一段段编号交给五个地区互联网注册管理机构(RIR)。
- RIR 各管一片地区:AFRINIC(非洲)、APNIC(亚太)、ARIN(北美)、LACNIC(拉美和加勒比)、RIPE NCC(欧洲、中东和中亚部分地区)。
- 需要自己路由策略的组织,通常是因为它同时接入了不止一张别的网络,向所在地区的 RIR(或代表 RIR 的本地注册机构)申请,拿到一个 ASN。
注册记录里保存着持有者的名称,查询工具显示的“AS 名称”或“holder”就是它。ASN 最初是 16 位数字,总共不到 65,536 个;2007 年起扩展为 32 位(RFC 4893),可用数量超过四十亿。另有几段编号留给私有网络和文档示例使用,不会出现在公网路由里。
BGP 怎么把 IP 地址和 ASN 对上
网络之间用 BGP(边界网关协议)交换路由。每张网络对外宣告它能送达的地址段,也就是前缀,比如 1.1.1.0/24,覆盖 1.1.1.0 到 1.1.1.255。宣告在网络之间一路传播,每经过一张网络,就把自己的 ASN 加进一个叫 AS 路径的列表。路径最起头的那张网络,也就是最先宣告这段地址的网络,叫作源 AS(origin AS)。
所以“IP 查 ASN”的意思是:找到包含这个地址、最具体的那条已宣告前缀,读出它的源 AS。查询服务用的是路由采集器收集的 BGP 数据,这些采集器同时监听世界各地大量网络的宣告。
每个地址背后其实有两份记录,分开看会清楚很多:
- 注册记录。 RIR 的 whois 数据库写着这段地址分配给了哪个组织。
- 路由记录。 BGP 显示今天是哪张网络在宣告这段地址。
大多数时候两者一致,但也有不一致的:地址段可能租给了另一家公司,上游运营商可能替客户宣告地址,地址段也可能已经转手、而各个数据库还没更新。地址持有者可以发布 RPKI 记录,声明哪个 ASN 有权宣告自己的地址,这让路由这一侧更可信,但并不是人人都发布。两份记录对不上时,网站实际看到的是路由那一份。
买代理的人为什么要关心 ASN
标签来自网络
三种代理标签对应的是源网络:
- 数据中心:宣告它的网络是主机商或云服务商。
- ISP:宣告它的网络是家庭宽带运营商,而地址运行在服务器上。
- 住宅:宣告它的网络是家庭宽带运营商,而地址属于某户家庭的连接。
术语表里的 ASN 词条用一句话讲了这层关系,IP 标注讲了其余部分。商业 IP 数据库也从同一个地方出发,再加上自己的标记。
网站也在看它
很多反爬系统给一个地址打分时,会参考它所属网络的类型。一条规则就能对某个主机商网络的所有地址限速或弹验证,所以数据中心 IP 往往成片被封,而家庭宽带网络的地址是一个一个判断的。如果昨天还能访问的目标今天拒绝你,爬虫为什么突然被封梳理了常见原因。
ASN 说明不了什么
ASN 告诉你的是网络。同一家家庭宽带运营商内部,它分不出家庭连接和服务器,而这正是住宅代理和 ISP 代理的区别。它也看不到租赁关系:主机商可能在宣告一段登记在电信公司名下的地址,反过来也有。把 ASN 当作最有分量的单项信号,多查几个地址,别把一次查询当成定论。
怎么查 ASN
下面三种方法都免费,也都不需要走代理。从你自己的网络查出口 IP 就行。至于怎么拿到出口 IP:通过代理向回显服务发一个请求,做法见怎么自己查 IP 类型。
在终端里用 Team Cymru 的 whois
whois -h whois.cymru.com " -v 1.1.1.1"
引号里开头的空格是查询的一部分。返回结果是每个地址一行表格:
AS | IP | BGP Prefix | CC | Registry | Allocated | AS Name
13335 | 1.1.1.1 | 1.1.1.0/24 | AU | apnic | 2011-08-11 | CLOUDFLARENET - Cloudflare, Inc., US
1.1.1.1 是 Cloudflare 的公共 DNS 解析服务。这一行给出了源 ASN、所在的已宣告前缀、注册机构和 AS 名称。CC 一栏是地址段登记的地区,不是地址实际使用的地方:1.1.1.1 显示 AU,因为这段地址由 APNIC 分配,但 Cloudflare 在全世界用它提供服务。同样的查询对 IPv6 地址也有效。
如果系统里没有 whois,通常装一个包就有了(Debian 和 Ubuntu 上是 sudo apt install whois)。没有任何网络宣告的地址,每一栏都会返回 NA,比如文档专用地址段里的 203.0.113.10。出口 IP 查出来是 NA,多半是复制错了。
43 端口被封时,用 DNS 查
有些网络会封掉 whois 用的端口。Team Cymru 也可以通过 DNS 回答同一个问题:把 IP 的四段倒过来,后面接上 origin.asn.cymru.com,查它的 TXT 记录。再查一次,就能把 ASN 换成名称。
IP=1.1.1.1
dig +short TXT "$(echo "$IP" | awk -F. '{print $4"."$3"."$2"."$1}').origin.asn.cymru.com"
dig +short TXT AS13335.asn.cymru.com
"13335 | 1.1.1.0/24 | AU | apnic | 2011-08-11"
"13335 | US | arin | 2010-07-14 | CLOUDFLARENET - Cloudflare, Inc., US"
用 RIPEstat,浏览器或脚本都行
RIPEstat 由 RIPE NCC 运营,能查全世界的地址,不管是哪家注册机构分配的。在浏览器里打开下面的地址,或者在代码里调用:
curl -s "https://stat.ripe.net/data/prefix-overview/data.json?resource=1.1.1.1"
返回的是 JSON。只留有用的部分:
{
"status": "ok",
"data": {
"announced": true,
"asns": [{ "asn": 13335, "holder": "CLOUDFLARENET - Cloudflare, Inc." }],
"resource": "1.1.1.0/24",
"block": { "resource": "1.0.0.0/8", "desc": "APNIC (Status: ALLOCATED)" }
}
}
announced 表示有没有网络在路由这个地址,asns 给出源 AS,resource 是地址所在的前缀。没被宣告的地址,announced 是 false,asns 为空。
一次查二十个出口
一个地址说明不了一个池子,二十个就能说明很多。对轮换型产品,比如设为“随机 IP”的住宅线路,先收集一批出口:
for i in $(seq 1 20); do
curl -s -x http://USERNAME:PASSWORD@HOST:PORT https://api.ipify.org; echo
done > exit-ips.txt
HOST、PORT、USERNAME 和 PASSWORD 是占位符,真实的值在控制台每个服务的页面上。然后用 Team Cymru 的批量模式一次查完,只用 Python 标准库:
import socket
import sys
from collections import Counter
def cymru_bulk(ips):
query = "begin\nverbose\n" + "\n".join(ips) + "\nend\n"
with socket.create_connection(("whois.cymru.com", 43), timeout=30) as conn:
conn.sendall(query.encode())
reply = b""
while chunk := conn.recv(4096):
reply += chunk
rows = []
for line in reply.decode().splitlines():
parts = [part.strip() for part in line.split("|")]
if len(parts) == 7 and parts[0] != "AS":
rows.append(parts)
return rows
ips = [line.strip() for line in open(sys.argv[1]) if line.strip()]
rows = cymru_bulk(ips)
for asn, ip, prefix, cc, registry, allocated, name in rows:
print(f"{ip:<16} {prefix:<18} AS{asn:<8} {name}")
print()
networks = Counter(f"AS{row[0]} {row[6]}" for row in rows)
for network, count in networks.most_common():
print(f"{count:>4} {network}")
保存为 asn_bulk.py,运行 python3 asn_bulk.py exit-ips.txt。第一段逐个列出地址,第二段按网络统计地址数量,最多的排在前面。
怎么看统计结果
- 按住宅卖的:应该分散在多家家庭宽带运营商。二十个出口都来自一两家主机商,就是被重新贴了标签的池子。
- 按 ISP 或数据中心卖的:只有少数几个网络是正常的,因为静态 IP 是成段来的。持有者名称要和标签对得上:ISP 应该是家庭宽带运营商,数据中心应该是主机商或云服务商。ISP 还是数据中心代理讲了你需要哪一种。
- 持有者名称没见过:在 RIPEstat 或 PeeringDB 上搜这个 ASN。很多网络在 PeeringDB 上自己填了类型,比如“Cable/DSL/ISP”或“Content”。这是自报的信息,当作参考就好。
标签对不上时,把输出保存下来。在我们的线路上,标错的 IP 由实话实说页上的承诺兜底。ASN 也是怎么自己检查代理 IP 质量里四项检查的第一项,那篇还讲了黑名单和地理位置。
常见问题
ASN 和 IP 地址是一回事吗? 不是。IP 地址标识一个连接点;ASN 标识宣告一段地址的网络,一个 ASN 可以宣告几百万个地址。
一家公司可以有多个 ASN 吗? 可以。大运营商常常有好几个,按地区划分,或者来自收购的公司。名称相近的两个 ASN,通常属于同一个集团。
ASN 能告诉我 IP 在哪里吗? 不太可靠。查询结果里的国家,是地址段或网络登记的地方;地址实际在哪里使用,可能完全是另一回事。
代理服务商能伪造 ASN 吗? 路由数据伪造不了。哪张网络在宣告一个地址来自 BGP,服务商改不了自己不负责路由的地址。服务商能决定的是地址从哪里来,所以多取样本才重要。
下一步
从你在考虑的线路上取几个出口,用上面的方法查一遍,把输出保存下来。一笔小额充值就够了,价格见价格页。如果某个持有者名称让你摸不着头脑,把查询结果贴到 Discord,我们和你一起看。