近三个月的漫长断网后,伊朗的互联网终于亮起微光。Cloudflare Radar 的最新数据证实了这一趋势:流量与 DNS 查询量出现明显回升,但整体网络活跃度仍停留在断网前 40% 的水平。这不是简单的"开关拨回",而是国家级网络管控下的一种受限恢复。对于关注全球网络连通性的工程师而言,这种宏观流量的骤降与回潮,提供了极有价值的观测样本。
流量尖峰与 DNS 回潮背后的信号
Cloudflare Radar 的数据揭示了两个关键现象:
- DNS 查询率先反弹:当网络限制放松,设备重新连入互联网时,DNS 请求往往是最先爆发的指标。手机上的应用开始检查更新,浏览器尝试加载主页,这些行为都会在 DNS 层面留下尖峰。
- 总量仍处低位:尽管有尖峰,当前整体网络活动只有之前的 40%。这意味着大量底层基础设施、宽带接入或特定服务仍在受限状态,或者民众与企业的在线行为依然保持克制。
40% 这个数字很关键——它说明恢复是不完整的。如果只看"能不能访问某几个网站",很容易误判为全面恢复,但宏观流量百分比戳破了这种错觉。
观测国家级断网的技术视角
观测一个国家的网络中断,单靠"我能不能打开网站"远远不够。国家级断网通常涉及多层干预:
- BGP 路由撤回:国内运营商在路由表中撤回向国际宣告的 IP 段,外部流量根本找不到路径。
- DNS 污染与拦截:特定域名解析被篡改或直接黑洞化。
- 骨干网流量整形:在国际出口处施加极低的带宽上限,让流量"有但极慢"。
要捕捉这些行为,必须依赖拥有全球边缘节点的网络平台汇总的数据。Cloudflare Radar 聚合了其全球网络的请求日志,能按国家维度输出 AS 级别的流量趋势和 DNS 统计,这正是它能在伊朗断网事件中率先发出信号的原因。
实操:用 Cloudflare Radar API 拉取国家级流量趋势
如果你想在自己的运维面板或监控系统中集成这类宏观观测,可以直接调用 Cloudflare Radar 的公开 API。下面这段 Python 脚本演示了如何拉取伊朗(代码 IR)过去 30 天的流量时间序列,并绘制趋势图。
运行前需要安装依赖:
pip install requests matplotlib pandas
脚本代码:
import requests
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
# Cloudflare Radar 公开 API:获取指定国家的流量时间序列
# location=IR 代表伊朗,dateRange=30d 为过去30天
API_URL = "https://radar.cloudflare.com/api/v1/traffic/timeseries"
PARAMS = {
"location": "IR",
"dateRange": "30d"
}
def fetch_and_plot_iran_traffic():
try:
resp = requests.get(API_URL, params=PARAMS, timeout=15)
resp.raise_for_status()
data = resp.json()
# 解析时间序列数据(API 返回结构可能包含多个维度,此处提取总流量百分比)
# 注意:实际返回的 JSON 结构请参考 Cloudflare Radar API 文档,
# 这里以典型的 timestamp + traffic_percentage 结构为例处理
timestamps = []
traffic_vals = []
# 假设数据在 data["traffic"] 或类似键下,按时间戳遍历
# 如果 API 返回结构有变,需根据最新文档调整解析逻辑
for entry in data.get("traffic", []):
ts = datetime.fromisoformat(entry["timestamp"].replace("Z", "+00:00"))
timestamps.append(ts)
# 流量占比,如 0.4 代表 40%
traffic_vals.append(entry.get("percentage", 0) * 100)
if not timestamps:
print("未获取到有效时间序列数据,请检查 API 返回结构。")
print("原始返回前200字符:", resp.text[:200])
return
# 用 Pandas 构建时序并绘图
df = pd.DataFrame({"Time": timestamps, "Traffic (%)": traffic_vals})
df.set_index("Time", inplace=True)
plt.figure(figsize=(12, 5))
plt.plot(df.index, df["Traffic (%)"], label="Iran Traffic Level", color="#f57c00")
plt.axhline(y=100, color="gray", linestyle="--", label="Pre-shutdown Baseline (100%)")
plt.axhline(y=40, color="red", linestyle=":", label="Current Level (~40%)")
plt.title("Iran Internet Traffic Trend (Last 30 Days)")
plt.ylabel("Traffic (% of Baseline)")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("iran_traffic_trend.png")
print("趋势图已保存为 iran_traffic_trend.png")
except requests.exceptions.RequestException as e:
print(f"请求 API 失败: {e}")
if __name__ == "__main__":
fetch_and_plot_iran_traffic()
运行说明:脚本会向 Cloudflare Radar API 发起请求,拉取伊朗近 30 天的流量数据并保存为 PNG 图片。如果 API 的 JSON 返回格式有更新,你可能需要根据官方文档微调 entry["timestamp"] 和 entry.get("percentage") 的键名。将 location 参数改为其他国家代码(如 MM 代表缅甸,BY 代表白俄罗斯),即可观测其他发生过断网风险的区域。
宏观观测的边界与风险提醒
依靠 Cloudflare Radar 这类平台做宏观观测有明显的优势,但也有不可忽视的边界:
- 盲区:如果断网仅针对特定协议(如只封 HTTPS 443,不封 DNS 53),流量统计可能低估实际干扰程度。
- 采样偏差:Cloudflare 的流量更多反映访问其 CDN 和 DNS 解析服务的用户,不能完全等同于该国所有互联网活动。
- 数据滞后:API 数据通常有数小时到一天的延迟,不适合用来做秒级的断网报警。
对于有海外业务的企业,建议将此类宏观指标作为辅助参考,结合自身业务节点在当地的 BGP 路由监控、DNS 解析探测和主动拨测(Synthetic Monitoring),形成立体的连通性感知体系。当宏观流量跌至 40% 时,你的业务真实可达率可能远低于这个数字——因为商业 API 和支付网关往往是管控的首要目标。
断网从来不是瞬间的灾难,恢复也不是一键重启。持续盯着数据,才能看清真实的连通曲线。