从 RackNerd DC2 迁移 与 QuadraNet——从 Multacom 大楼的租赁纠纷,到 Dustin Cisneros 的 2019 年”拔线事件”

从近期 RackNerd 洛杉矶 DC2 机房搬迁事件切入,深度追溯洛杉矶 Multacom 大楼 37.6 万美元欠租纠纷背后,尘封十五年的 IDC 行业恩怨。基于 PACER 法院案卷、加州工商档案与行业存档交叉核验,完整还原 RackNerd 创始人 Dustin Cisneros 的双面人生:任职 QuadraNet 销售经理期间,利用 95 百分位带宽计费漏洞与内控缺陷,搭建 AlphaRacks 等壳公司矩阵套利,最终引发 2019 年轰动行业的无预警拔线事件。文章复盘 QuadraNet 自噬衰败、被 Edge Centres 收购的全过程,解析 Dustin 洗白创立 RackNerd 的合规转型路径,为海外低价 VPS 用户提供避坑参考。

> **本文基于一次长程AI调查式对话的整理重现,侧重结构性事实与企业/人物之间的利益链路,而非媒体叙事。**

一次普通机房搬迁,了解 IDC 圈尘封十五年旧账

近期不少 RackNerd 用户收到洛杉矶 DC2 机房节点迁移的官方工单,在普通散户眼里,这只是一次常规的硬件升级、网络优化,无非是短暂的线路抖动、额外的数据备份工作,过后便恢复如常。但对于深耕海外低价 VPS 行业五年以上的圈内从业者、老站长而言,这次迁移绝非一次简单的运维调整,它像一把钥匙,重新打开了洛杉矶 Multacom 大楼尘封多年的恩怨往事。

RackNerd 如今的业务版图遍布全球 21 个数据中心,但洛杉矶 DC2 节点的底层根基,始终绑定在洛杉矶圣塔克拉拉 6171 Century Blvd 的 Multacom 大楼体系内。这栋老式商用机房大楼,曾是老牌机房运营商 QuadraNet 的核心大本营,承载了它最鼎盛时期的机柜资源、带宽链路与 IP 网段;而如今,大楼业主 6171 Century LLC 与 QuadraNet 深陷租金诉讼,起诉对方拖欠租金高达 37.6 万美元,甚至采取封锁机房门禁、限制设备物理访问的强硬手段。

这场当下正在发酵的租赁纠纷,从来不是偶然的商业矛盾,而是 2019 年那场轰动整个海外主机圈无预警拔线事件的后续余波。QuadraNet 的衰落、廉价 VPS 市场格局重构、RackNerd 的崛起,全部因果闭环,都藏在这栋大楼里,也藏在创始人 Dustin B. Cisneros 的双面人生与资本套利布局之中。

本文基于公开法院案卷、加州州务卿工商档案、PACER 联邦法院检索记录、行业论坛历史存档交叉核验,以叙事化笔触还原整件事全貌,同时嵌入标准化事件时间线、核心关系数据表、业务链路结构图,兼顾故事可读性与调查严谨性,全程区分可核验事实、合理强推论、社区网传传闻,不主观臆造、不情绪化渲染。

一、双面创始人 Dustin:光鲜履历与地下操盘的割裂人生

如今的 Dustin B. Cisneros,是妥妥的行业新锐企业家。翻开 RackNerd 官方宣传、Inc.5000 权威榜单、HostAdvice 专业采访,他的履历完美贴合硅谷创业者的标准模板:2008 年入局互联网主机行业,早年创办 SemoWeb LLC 深耕廉价虚拟主机赛道;2013 年入职老牌机房 QuadraNet,一路晋升至销售经理核心岗位;2019 年创立 RackNerd LLC,公司注册于加州兰乔库卡蒙格;2024 年登顶 Inc.5000 全美榜单第 1506 位,三年营收增长率高达 342%,2025 年入选太平洋区域 Inc. 百强企业。对外公开话术里,他始终以「行业资深老兵、以客户体验为核心」自居,绝口不提自己早年操盘的一众廉价 VPS 品牌。

但在 LowEndTalk、WebHostingTalk 两大海外主机社区的历史存档里,藏着 Dustin 不为人知的另一面。任职 QuadraNet 销售经理的六年间,他手握机房批发定价权、新分销商审批权、资源调配权,背地里隐秘操盘AlphaRacks、NFP Hosting、Woothosting、HostMyBytes四大廉价 VPS 品牌,形成庞大的地下运营矩阵。

这份双重身份之所以能长期隐匿不被发现,核心依托两点:一是 QuadraNet 粗放的内部管理漏洞,销售高管拥有极大的自主审批权限,缺乏审计与风控制衡;二是美国加州 LLC 有限责任公司的注册隐私规则,无需公开实际控制人信息,完美为他搭建了隐身屏障。也正是这层身份与权限,让 Dustin 找到了可以长期套利的商业漏洞,改写了整个北美廉价 IDC 行业的格局。

二、QuadraNet 底层商业模式:天生存在漏洞的套利温床

想要读懂 Dustin 的全套操作逻辑,首先要拆解 QuadraNet 当年的核心生意模型。作为洛杉矶头部机房批发商,QuadraNet 手握 Multacom 大楼大量长租机柜,批量采购 Cogent、Telia、GTT 等顶级骨干运营商的大宗带宽,搭建起完整的底层基础设施,业务分为两大核心板块:直接面向大企业的定制化独立服务器、机房托管直销业务,以及面向中小商家的机柜、IP、带宽批发业务。

在批发合作模式下,QuadraNet 只和分销商结算三项固定费用:机柜 / U 位的机位租金、ARIN 官方分配的 IP 地址段月租、以及行业通用的95th percentile(第 95 百分位)带宽费用。其中机位和 IP 定价透明、成本固定,几乎没有套利空间,而 95 百分位带宽计费规则,成为了 Dustin 实现低成本暴利的核心工具。

95th 百分位计费:廉价 VPS 行业的利润杠杆

很多人听过这个计费名词,却不懂底层逻辑。QuadraNet 每 5 分钟采集一次合作分销商的带宽速率,一个月累计近万组采样数据,系统会将所有速率从低到高排序,直接剔除月度最高 5% 的突发流量峰值,以剩余流量的最高点作为最终计费标准。

对于普通 VPS 商家而言,带宽占整体运营成本的 40%-55%,是最大开支项。Dustin 精准拿捏了这个规则的漏洞:绝大多数廉价 VPS 用户日常仅用于搭建小站、轻度代理、数据探针,95% 的时间带宽占用极低,只有偶尔备份、测速时出现短时流量尖峰。数千个散户用户叠加后,整体带宽数据呈现「大批量低值 + 零星高峰」的特征,95 百分位规则会自动抹掉所有尖峰,最终给到 QuadraNet 的计费带宽始终维持在极低水平。

而 Dustin 的操作手法简单且精准:利用 QuadraNet 销售经理的权限,给自己控制的壳公司审批远低于市场的内部专属批发价,在廉价带宽链路上上架海量月租 1-3 美元的超低价 VPS;后端向 QuadraNet 支付极低的带宽账单,前端向用户收取全额年付预收款,赚取中间巨额价差。这并非物理层面的资源偷窃,而是利用职务特权、行业规则漏洞完成的合规套利。

更关键的是,正常入驻 QuadraNet 的分销商,必须经过企业资质审核、押金缴纳、信用背调、付款能力核验全流程,但 Dustin 凭借审批权限,直接为自己的壳公司绕过所有风控门槛,无需押金、无需资质核验,凭空拿到优质资源配额,这也成为 QuadraNet 后续内控崩盘的核心隐患。

三、隐秘壳矩阵:稻草人挂名 + 影子合伙人,完美风险隔离

为了彻底切割自己与四大 VPS 品牌的关联,规避 QuadraNet 内部风控与后续法律追责,Dustin 搭建了一套成熟的壳公司运营体系,利用美国 LLC 隐私漏洞、挂名服务规则,把真实受益人彻底隐藏在幕后。

稻草人 Julian Jin:纸面切割的关键棋子

AlphaRacks 作为整个矩阵的核心主体,在加州州务卿工商登记中,登记的法定代表人并非 Dustin,而是一个名叫 Julian Jin 的陌生人。受加州法律限制,LLC 公司无需公开股东与实际控制人,仅对外展示注册代理公司地址,这就给了挂名操作可乘之机。

结合行业规则与商业逻辑可强推论:Julian Jin 并非品牌真实创始人,只是典型的Straw Man(稻草人挂名者),要么是 Dustin 的熟人借名,要么是美国市面上售价 99 美元标准化挂名服务的第三方人员,唯一作用就是在工商纸面上,切断「QuadraNet 员工 = AlphaRacks 实控人」的关联链路。

最有力的破绽出现在 2019 年 5 月 AlphaRacks 倒闭官方声明中,这份发布在 Twitter 且被网页存档留存的公告,刻意强调「AlphaRacks 由 Julian Jin 全资持有,与 QuadraNet 前员工无任何关联」,但留给数万受灾用户的售后联系方式,赫然是 QuadraNet 官方销售邮箱 sales@quadranet.com

从商业逻辑来看,一家宣称完全独立、自有服务器的第三方公司,绝不可能让用户去找上游机房官方对接售后。唯一合理的解释:这份声明是 QuadraNet 法务部主导的危机公关文案,目的是对外切割责任,把员工套利事件包装成第三方商家自主经营倒闭,规避品牌舆论风险。

多品牌合并:虚增规模,摊薄运营成本

Dustin 对外宣称 AlphaRacks 先后收购 NFP Hosting、Woothosting、HostMyBytes 三大品牌,将所有用户统一迁移至同一网段与 WHCS 管理后台。这并非单纯的业务扩张,而是精准的规模套利手段:一方面合并服务器与带宽采购量,向 QuadraNet 申请更低的批发单价,进一步压缩成本;另一方面对外宣称坐拥 2.3 万 + 用户,在 LowEndBox 等广告平台提升投放可信度,吸引更多用户年付充值,用新用户的现金流覆盖上游机房账单。

整套模式本质是现金流滚雪球玩法,只要新用户持续入局,就能维持运营周转,完全没有应对突发风险的备用方案,也为后续瞬间崩盘埋下伏笔。

影子合伙人 Adam NG:全程隐身的幕后参与者

在 QuadraNet 内部风控通告中,除了 Dustin,还明确点名另一位核心参与者 Adam NG。但这位人物至今没有任何公开可核验的档案:无公开领英资料、无加州 / 内华达州工商注册记录、无司法涉案案卷留存,2019 年与 Dustin 同步被开除后,彻底从行业公开视野中消失。

行业 LowEndTalk 等论坛流传着一条未经证实的传闻:Adam NG 后续化名入职 SpinServers 继续从事低价 VPS 分销业务。但经过多轮公开档案检索,没有任何法院文书、工商记录能佐证这一说法,因此仅作为社区流言留存,无法定性为事实。从整件事格局来看,Adam NG 是典型的影子操作者,手握机房后台权限参与分成,全程不出面、不公开,出事由 Dustin 与 Julian Jin 挡在前台。

四、2019 年拔线事件完整复盘:合法止损下的数万用户牺牲

标准化事件时间线

大致时间核心关键事件
2019 年 5 月中旬QuadraNet 内部完成风控审计,查实 Dustin 利用职务权限、虚假资质为壳公司套取低价资源,认定存在利益冲突与合同欺诈
审计当日QuadraNet 直接执行端口封禁、物理拔线、IP 段路由封禁,AlphaRacks 全系品牌所有服务器全网离线,无任何前置通知
停机数日内工单系统、服务器管理面板全面失联,用户无任何数据备份、迁移渠道
2019 年 5 月 17 日AlphaRacks 发布法务拟定倒闭声明,以 Julian Jin 名义切割关联,预留 QuadraNet 官方售后邮箱
同期Dustin B. Cisneros 与 Adam NG 被 QuadraNet 正式开除,劳动关系即刻终止

整个事件最具争议的点,在于 QuadraNet 自始至终没有给用户预留任何数据迁移窗口期。而从法律层面,QuadraNet 手握绝对主动权,依据双方签署的主服务协议(MSA),合同明确要求合作分销商必须提交真实经营资质、无利益冲突;若存在欺诈性签约、重大违约行为,机房有权无条件单方面终止服务、扣留设备,且无需为下游散户提供数据备份与迁移 SLA。

站在企业合同视角,QuadraNet 的操作完全合规;但站商业伦理与用户权益角度,数万无辜站长、开发者、小企业主沦为企业内控纠纷的牺牲品,付出了惨痛代价。事件最终的用户结局近乎无解:所有服务器设备被 QuadraNet 留置扣押,用户数据基本全部永久丢失;AlphaRacks 作为空壳 LLC 公司,账户无任何可执行资产,用户 PayPal 退款申诉大多因超时效、追责主体不符失败;用户与 AlphaRacks 签署的服务协议无法约束 QuadraNet,想要穿透公司壳层追责实控人,又缺乏司法案卷举证,追偿路径彻底断裂。

五、深度拆解:为何无刑事立案、无公开诉讼?

这是整件事外界最疑惑的核心问题:波及数万用户、存在明确员工套利与合同欺诈,最终却无人被罚款、无人被判刑,甚至没有一场公开诉讼。我们通过 PACER 联邦法院、CourtListener、洛杉矶县高等法院多维度关键词检索,得出明确结论:没有任何可公开核验的 QuadraNet 起诉 Dustin 的案卷,网传 2022 年双方诉讼、听证会等说法,均为论坛自媒体杜撰,无案号、无法律文书佐证,纯属谣言

美国司法五大核心追责障碍

追责壁垒详细解析
受害主体错位刑法直接受害方为 QuadraNet 本身,散户属于间接受害者;且 QuadraNet 自身内控严重失职,存在连带过失,降低司法立案优先级
主观举证门槛极高刑事欺诈必须证明「蓄意主观欺骗」,Dustin 仅需辩称属于销售灰色激励权限,即可形成合理怀疑,无法定罪
单案金额碎片化单个用户损失仅 20-200 美元,集体总金额看似庞大,但检察官不会消耗司法资源处理小额集体纠纷
LLC 法人面纱保护债务与纠纷全部归属壳公司,若无资产混同实锤,无法追溯 Dustin 个人法律责任
检察自由裁量检察机关以重大刑事案件定罪率为核心 KPI,散户互联网小额纠纷不属于优先办案范畴

从实际处置逻辑来看,QuadraNet 选择了最符合自身利益的方式:内部开除当事人、行使合同自助救济扣留设备、签署保密协议与互不追诉条款。之所以不愿公开起诉,核心顾虑在于庭审会触发证据开示,自身管理失控、内控漏洞会被彻底公开,重创企业商业口碑,得不偿失。

中美 IDC 行业监管与追责模式对比

对比维度中国监管体系美国本次处置结果
行业准入强制增值电信牌照,无证直接关停追责,行业有准入门槛仅 LLC 填表注册即可营业,无前置资质审核约束
集体受害处置大规模用户受损易触发公安经侦主动介入,公权力强势干预默认归属民事合同纠纷,公权力不主动介入民间商事矛盾
事件后果公示判决书全网公开,涉事人易纳入失信名单,行业受限壳公司破产了事,责任人可换主体重新创业,无公开惩戒记录

这并非美国纵容商业欺诈,而是两国法律体系、监管逻辑的底层差异:中国将大规模民众财产受损纳入公共秩序管辖,公权力主动下场;美国优先遵循私法自治,把纠纷留给企业与个人自行解决,制度齿轮最终消解了追责的可能性。

六、QuadraNet 的自我反噬:PacificRack 复刻悲剧走向衰败

拔掉 AlphaRacks 网线后,QuadraNet 看似止损,却犯下了致命的战略误判。当时 AlphaRacks 倒闭留下数万价格敏感型用户市场真空,QuadraNet 自恃有机房、IP、带宽底层资源,认为完全可以亲自下场承接业务,随即推出零售 VPS 品牌 PacificRack,主打 2-5 美元低价套餐,支持支付宝、PayPal 支付,精准投放 LowEndBox 低价社区,意图吃掉这块市场红利。

但 QuadraNet 始终没认清一个核心本质:机房批发商与 VPS 零售商是两套完全相反的运营逻辑。QuadraNet 的核心能力是机柜运维、骨干网络搭建、大客户批发对接,缺乏零售必备的精细工单售后、网络滥用应急处理、资源调度平衡、用户退款体系。

PacificRack 上线后迅速口碑崩盘,无故封号静默停机、私自篡改服务器配置、IP 无理由封禁成为常态,工单往往数周无人回复,仅在负面舆论发酵时才临时冒泡敷衍。更有业内技术观察推测,其 VLAN 网段设计存在严重运维漏洞,大量 IP 塞入同一广播域,极易引发网络拥堵,虽无公开实锤,但用户大面积卡顿已是不争事实。

讽刺的是,2024 年 3 月 PacificRack 正式发布关停公告,要求用户限期自行备份数据,逾期强制停机,官方不提供任何数据协助与退款服务。五年前 QuadraNet 对 AlphaRacks 用户做的无预警停机、弃用户数据于不顾,五年后完整复刻在自己的零售品牌身上,形成极具宿命感的闭环。

而这只是 QuadraNet 衰落的开始。深陷 Multacom 大楼 37.6 万美元欠租诉讼、现金流持续断裂后,2025 年 QuadraNet 被迫出售旗下 20 万 + IPv4 核心地址段给 HostPapa——IPv4 是 IDC 行业最核心的硬通货,变卖核心资产等同于饮鸩止渴。2024 年 4 月,澳洲边缘数据中心运营商 Edge Centres 完成对 QuadraNet 的全资收购,其全美 10 城节点、AS 网络链路被逐步整合,曾经的洛杉矶老牌机房巨头,彻底沦为被收购的历史遗留资产,失去独立运营能力。

七、Dustin 洗白重生:RackNerd 的合规化转型与现状

2019 年风波沉寂数月后,Dustin 以全新实体 RackNerd LLC 重新入局,彻底抛弃了早年依托 QuadraNet 员工特权的灰色套利模式,完成商业模式的全面洗白与升级。

如今的 RackNerd 彻底摆脱单一机房依赖,不再依靠内部权限套取低价资源,转而与 ColoCrossing、Sharktech、MC 等多家主流机房签订正规公开批发合同。其中ColoCrossing 是 RackNerd 最核心的上游供应商,二者无任何股权关联、无共同母公司,是纯粹的房东与租户关系:ColoCrossing 拥有自建机房与骨干带宽,RackNerd 租用机柜、IP 与带宽,搭建 KVM 虚拟化平台二次零售,这也是海外 IDC 最标准的「机房批发商 – 品牌转售商」模式。

对比 Dustin 前后两种经营模式,风险结构发生根本性改变:AlphaRacks 时代完全依附单一机房员工权限,随时可能被无预警拔线,品牌无长期信誉赌注;如今 RackNerd 遵循正规商业合同解约流程,断网风险可预判,同时冲击 Inc.5000 权威榜单,绑定品牌口碑,经营风险大幅降低。

目前 RackNerd 已布局全球 21 个战略数据中心,依靠高额联盟营销、黑五常态化促销快速扩张,营收规模稳步增长。但历史遗留的信用成本始终无法抹去:行业论坛永久留存 2019 年拔线黑料,任何企业尽职调查都能追溯到创始人过往经历;同时品牌依旧高度依赖年付预收款现金流滚动,没有自有物理机房,底层命脉始终掌握在上游机房手中。对于普通用户而言,RackNerd 仅适合搭建可快速重建的无状态轻量业务,绝不建议存放唯一核心数据。

八、全业务链路拓扑结构图

┌─ QUADRANET 核心业务链路 ─────────────────────────────┐
│ 底层资产:Multacom大楼机柜 + Cogent/Telia大宗带宽        │
│ 核心权限:销售经理Dustin 拥有定价/审批/风控绕过权限     │
│        │
│        ▼
│  壳公司集群:AlphaRacks(Julian Jin挂名)+NFP/Woot/HostMyBytes
│  运营模式:内部低价批发 + 95th百分位带宽套利
│  盈利逻辑:1-3美元低价VPS零售 + 年付预收款现金流滚存
│        │
│  2019危机:内部审计曝光 → 开除Dustin/Adam NG → 全域拔线
│  连锁后果:数万用户数据灭失 → 自营PacificRack溃败
│  最终结局:37.6万欠租纠纷 → 变卖20万IP → 被Edge Centres收购
└────────────────────────────────────────────────────┘

Dustin个人发展链路:2019风波沉寂 → 创立RackNerd
转型核心:放弃内部特权 → 多机房正规签约 → 品牌化合规运营

九、全文核心复盘与行业启示

回望整场从 Multacom 大楼租赁纠纷延伸出的十五年行业恩怨,从来不是简单的善恶对错,而是规则漏洞、内控缺失、制度差异交织出的必然结果。

2019 年的拔线事件,本质不是商家恶意跑路,而是内部员工利用机房批发计费规则、企业内控漏洞完成的商业套利;QuadraNet 依法止损但手段野蛮,无辜用户沦为最大牺牲品。整场风波没有刑事追责、没有公开诉讼,根源不在于监管缺位,而是 LLC 法人隔离、司法举证门槛、检察资源分配三重制度壁垒共同导致。

QuadraNet 的衰落并非单纯被 Dustin 掏空,而是自身粗放管理、战略误判、零售运营能力缺失的集中爆发;而 Dustin 借助行业规则完成原始积累后,果断切换合规赛道,依靠多机房分散布局、品牌化营销,成功洗白并跻身行业新锐。

对于普通 VPS 用户而言,RackNerd 如今的稳定性,从不取决于创始人的经营理念,而是依赖 ColoCrossing 等上游机房的合同连续性;Multacom 大楼的租赁纠纷、DC2 机房的反复迁移,都是底层基础设施脆弱性的真实体现。在廉价 IDC 行业里,永远不要轻信永久低价与品牌光环,历史的黑料不会消失,只会隐藏在一次次机房迁移与品牌迭代之中。

> *整理自一次系统性质询对话 https://yb.tencent.com/s/zXjC07ntim6k(工具检索:PACER/CourtListener/CA SOS/行业档案交叉校验),部分链路(Julian Jin 真实身份、Adam NG 去向)受限于 LLC 隐私规则不可再深入。*

假如按人口比例平均分配IP

IP地址,要是按人口比例来分,是不是才算真公平?之前有人问过中国有没有完整的/8段IP,查资料发现不仅没有,实际分配量和人口占比比起来还差不少。顺着这个思路,我干脆把美国的情况也一起扒了扒,算完一组数据,还挺有感触的,今天就把这些思考整理成日志记下来。

先跟不熟悉的朋友科普下基础概念:咱们说的/8段,就是常说的A类IP地址,每个这样的段里固定有16777216个IP(大概1677万个),这是IPv4时代里很大的一个地址块了。而全球IPv4地址总量看着多,有42.95亿个,但扣掉私网、组播、环回这些不能公网使用的保留地址后,实际能分配的公网IP也就39.2亿个左右,这个数据是查了APNIC的IPv4枯竭报告得出来的,算是行业里比较公认的估算值。

这里先放一张我整理的常见/8段归属表,很多人容易误解这些段属于中国,其实不然:

前缀实际管理方中国利用率说明
14.0.0.0/8APNIC96%亚太区共享,含日韩等国地址
59.0.0.0/8APNIC100%区域分配,非中国独有,含澳新机构使用
101.0.0.0/8APNIC89%中国占比高,但含APNIC保留及其他亚太用户
114.0.0.0/8APNIC61%中国电信为主,但含亚太其他运营商子网
183.0.0.0/8APNIC98%中国电信使用,仍有部分地址分配给亚太其他实体

计算按人口比例中国应得的 IPv4 地址数及对应 / 8 段数量,需基于全球 IPv4 总可分配地址数权威人口统计数据进行量化计算,核心逻辑是「中国人口占全球比例 × 全球可分配 IPv4 总量」,再换算为 / 8 段(每段固定含 16,777,216 个地址)。以下是完整计算过程、数据来源及结论:

计算

1. 全球 IPv4 总可分配地址数

IPv4 地址空间总量为 2³² = 4,294,967,296 个(约 42.95 亿),但需扣除 IANA 保留地址段(不可用于公网分配),主要包括:

  • 私网地址:10.0.0.0/8(1677 万)、172.16.0.0/12(1048 万)、192.168.0.0/16(6.55 万)
  • 组播地址:224.0.0.0/4(2684 万)
  • 环回地址:127.0.0.0/8(1677 万)
  • 其他保留段(如测试地址、未分配段)

实际可分配公网 IPv4 总量:约 3,920,000,000 个(39.2 亿)(行业通用估算值,误差 ±1%,来源:APNIC《IPv4 地址枯竭报告》)。

2. 人口数据(2023 年权威统计)

  • 中国人口:14.12 亿(国家统计局 2023 年常住人口数据,含港澳台)
  • 全球人口:79.54 亿(联合国《世界人口展望 2022》修订版)
  • 中国人口占全球比例:14.12亿 ÷ 79.54亿 ≈ 17.75%

理论分配量计算

1. 应得 IPv4 地址总数

按人口比例分配公式:中国应得地址数 = 全球可分配IPv4总量 × 中国人口占比代入数据:39.2亿 × 17.75% ≈ 6.96亿(精确值:3920000000 × 0.1775 = 695800000)

2. 对应 / 8 段数量

每个 / 8 段(A 类地址)的地址数固定为 2²⁴ = 16,777,216 个(约 1677.72 万)。应得 / 8 段数量 = 应得地址总数 ÷ 单个 / 8 段地址数代入数据:695,800,000 ÷ 16,777,216 ≈ 41.47 个

简化场景(不扣除保留地址)

若直接按 IPv4 总量(42.95 亿)计算(忽略保留段):42.95亿 × 17.75% ≈ 7.62亿对应 / 8 段:762,000,000 ÷ 16,777,216 ≈ 45.42 个

对比再看美国:现有IP量有多“富余”?

沿用上述核心算法公式,计算美国的相关数据。既然聊到公平性,肯定要看看现在IP持有量最多的美国。先找现有数据,不同平台统计略有差异,IPIP.NET显示美国已分配IPv4约14.54亿个,DICloak的数据则是15.18亿个,我取个中间值,按14.8亿个来算比较客观。

再算美国的理论应得量。美国2024年官方统计人口大概3.38亿,占全球人口的比例就是3.38亿÷79.54亿≈4.25%。按这个比例算,美国应得的IP数量是39.2亿×4.25%≈1.67亿个,对应/8段的话,就是1.67亿÷1677万≈9.96个,差不多10个完整的/8段。

这一对比就很直观了:美国实际持有的14.8亿个IP,是理论应得量1.67亿的8.8倍;现有/8段数量(查IPinfo的地址段列表,美国独占或主要使用的/8段就有几十个,远超10个)更是远远超出人口比例对应的份额。说句实在的,这就是早期互联网发展的“先发优势”,1990年代前欧美就占了全球60%的/8段,美国单国就握了大概150个,相当于把大量IP资源提前锁在了自己手里。

三、一组对比表,看清差距本质

为了更清晰,我把核心数据整理成了表格,一眼就能看出差异:

国家人口占全球比例理论应得IP数对应/8段数量实际已分配IP数实际与理论比值
中国17.75%约6.96亿约41个约3.49亿0.56(56%)
美国4.25%约1.67亿约10个约14.8亿8.8(880%)
计算场景中国应得 IPv4 地址数对应完整 / 8 段数量剩余地址数(约)
扣除保留段(实际可分配)6.96 亿41 个0.47×1677 万≈808 万
不扣除保留段(理论总量)7.62 亿45 个0.42×1677 万≈704 万

与实际分配的差距

根据 APNIC 最新数据(2024Q4),中国实际分配的 IPv4 地址约 3.9 亿(仅占全球可分配总量的 9.95%),仅为理论应得量(6.96 亿)的 56%,对应 / 8 段仅约 23 个(3.9 亿 ÷1677 万≈23.25),远低于人口比例对应的 41 个。

数据来源与引用说明

  1. 数据来源可追溯
  2. 公式合理性:人口比例分配是「资源公平分配」的理论假设,核心是「每人获得平等的地址配额」,未考虑经济发展、互联网渗透率等实际因素,但能直观反映分配公平性。
  3. 误差说明
    • 保留地址扣除量存在 ±1% 误差(不同机构统计口径略有差异),但不影响核心结论(41-45 个 / 8 段)。
    • 人口数据为 2023 年静态值,若按 2025 年预测(中国 14.05 亿、全球 81.2 亿),比例约 17.3%,应得 / 8 段约 40-44 个,差异极小。
  4. 实际分配的历史原因:IPv4 分配采用「先到先得」机制,1990 年代前欧美国家已占据全球约 60% 的 / 8 段(仅美国就持有约 150 个 / 8 段),中国因互联网起步较晚(1994 年接入国际互联网),错失大段分配机会。
  5. IPv6 的解决方案:IPv6 地址空间(2¹²⁸)无需按人口比例分配,中国已获得 APNIC 分配的大量 IPv6 /32 段(每个 / 32 含 2⁹⁶个地址,远超全球人口需求),目前 IPv6 活跃用户数已超 8 亿,成为全球最大 IPv6 网络。

在 .NET MiniAPI (Kestrel) 中实现静态文件服务 + 可排序目录浏览功能

在开发轻量级 API 时,.NET MiniAPI 凭借其简洁高效的特性成为首选。但实际场景中,我们常需要暴露静态文件(如 API 文档、配置文件、共享资源),甚至允许客户端浏览目录下的文件列表。默认情况下,MiniAPI 的静态文件服务不支持目录浏览,且原生目录列表无排序功能,本文将详细记录如何实现「指定目录暴露 + 目录浏览 + 列表排序」的完整方案,附完整代码和优化细节。

一、需求背景

在 MiniAPI 中实现以下核心功能:

  1. 暴露服务器上的指定物理目录(如 GeoIP 文件夹),支持客户端通过 URL 访问文件;
  2. 启用目录浏览功能,允许客户端列出目录下的文件/子目录;
  3. 目录列表支持按「名称、大小、修改时间」排序(点击表头切换升序/降序);
  4. 优化目录列表样式,保持简洁易用,同时兼容 AOT 编译。

二、实现步骤(基于 .NET MiniAPI > 8.0)

1. 环境准备

创建 .NET MiniAPI 项目(若已有项目可跳过):

dotnet new web -n MiniApiStaticFileDemo
cd MiniApiStaticFileDemo

2. 核心配置:暴露指定物理目录 + 启用目录浏览

Program.cs 中配置静态文件中间件和目录浏览功能,核心是指定物理目录、URL 访问路径,并关联自定义排序格式化器。

2.1 Program.cs 完整配置

using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
using System.Text;

var builder = WebApplication.CreateSlimBuilder(args);
var app = builder.Build();

// 关键配置:指定要暴露的物理目录
string baseDir = AppContext.BaseDirectory; // 程序运行目录
string exposeDir = Path.Combine(baseDir, "GeoIP"); // 要暴露的目录(如 GeoIP 文件夹)
string urlPrefix = "/geoip"; // 客户端访问前缀(通过 /geoip 访问该目录)

// 1. 配置静态文件服务:暴露指定物理目录
app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(exposeDir), // 物理目录路径
    RequestPath = urlPrefix, // URL 访问路径(例:http://localhost:5000/geoip/文件名称)
    OnPrepareResponse = ctx =>
    {
        // 可选:添加响应头,禁止缓存静态文件
        ctx.Context.Response.Headers.Append("Cache-Control", "no-cache, no-store");
    }
});

// 2. 启用目录浏览(默认禁用),并关联自定义排序格式化器
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = new PhysicalFileProvider(exposeDir),
    RequestPath = urlPrefix, // 与静态文件访问路径保持一致
    Formatter = new SortableDirectoryFormatter("GeoIP 目录列表") // 自定义格式化器(支持排序)
});

// 测试接口
app.MapGet("/", () => Results.Ok("MiniAPI 静态文件服务 + 可排序目录浏览已启用"));

app.Run("http://*:5000");

3. 关键实现:自定义可排序目录格式化器

默认的目录浏览列表无排序功能,且样式简陋。我们通过实现 IDirectoryFormatter 接口,自定义目录列表的 HTML 输出,添加「名称、大小、修改时间」排序功能,同时优化样式和安全性。

3.1 完整 SortableDirectoryFormatter 类

创建 SortableDirectoryFormatter.cs 文件,核心功能包括:

  • 过滤隐藏文件(以 . 开头的文件);
  • 目录在前、文件在后的默认排序;
  • 点击表头切换排序方向(升序/降序);
  • 支持按名称、文件大小、修改时间排序;
  • XSS 防护、跨平台路径处理。
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.FileProviders;
using System.Globalization;
using System.Text;

public class SortableDirectoryFormatter : IDirectoryFormatter
{
    private readonly string _pageTitle;
    // 时间格式:年-月-日 时:分:秒(UTC 时区)
    private const string CustomDateTimeFormat = "yyyy-MM-dd HH:mm:ss +00:00";

    // 构造函数:支持自定义页面标题
    public SortableDirectoryFormatter(string pageTitle = "目录列表")
    {
        _pageTitle = pageTitle ?? "目录列表";
    }

    public async Task GenerateContentAsync(HttpContext context, IEnumerable<IFileInfo> contents)
    {
        // 1. 过滤隐藏文件 + 初始排序(目录在前,文件在后)
        var safeContents = contents ?? Enumerable.Empty<IFileInfo>();
        var fileList = new List<IFileInfo>(safeContents.Where(f =>
            !string.IsNullOrEmpty(f.Name) && !f.Name.StartsWith(".")
        ));
        fileList.Sort((a, b) =>
        {
            if (a.IsDirectory != b.IsDirectory)
                return a.IsDirectory ? -1 : 1;
            return string.Compare(a.Name, b.Name, StringComparison.OrdinalIgnoreCase);
        });

        // 2. 生成面包屑导航(支持多层目录跳转)
        var breadcrumbBuilder = new StringBuilder();
        string currentPath = "/";
        breadcrumbBuilder.Append($"<a href=\"{HtmlEncode(currentPath)}\">/</a>");
        var requestPath = context.Request.Path.Value;
        if (!string.IsNullOrEmpty(requestPath))
        {
            var pathSegments = requestPath.Split('/', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
            foreach (var segment in pathSegments)
            {
                currentPath = Path.Combine(currentPath, segment + "/").Replace(Path.DirectorySeparatorChar, '/');
                breadcrumbBuilder.Append($"<a href=\"{HtmlEncode(currentPath)}\">{HtmlEncode(segment)}/</a>");
            }
        }

        // 3. 构建 HTML 页面(含样式 + 排序脚本)
        var htmlBuilder = new StringBuilder(4096);
        htmlBuilder.AppendLine("<!DOCTYPE html>");
        htmlBuilder.AppendLine("<html lang=\"zh-CN\">");
        htmlBuilder.AppendLine("<head>");
        htmlBuilder.AppendLine($"<title>{_pageTitle} - {HtmlEncode(requestPath ?? "/")}</title>");
        // 样式:保持简洁,适配不同设备
        htmlBuilder.AppendLine(@"<style>
            body { font-family: ""Segoe UI"", ""Microsoft YaHei"", sans-serif; font-size: 14px; max-width: 1200px; margin: 0 auto; padding: 20px; }
            header h1 { font-size: 24px; font-weight: 400; margin: 0 0 20px 0; color: #333; }
            #index { width: 100%; border-collapse: separate; border-spacing: 0; border: 1px solid #eee; }
            #index th { background: #f8f9fa; padding: 10px; text-align: center; cursor: pointer; user-select: none; position: relative; border-bottom: 2px solid #ddd; }
            #index td { padding: 8px 10px; border-bottom: 1px solid #eee; }
            #index th:hover { background: #f1f3f5; }
            #index td.length, td.modified { text-align: right; }
            a { color: #127aac; text-decoration: none; }
            a:hover { color: #13709e; text-decoration: underline; }
            .sort-arrow { position: absolute; right: 8px; font-size: 0.8em; color: #999; }
            .dir-name { font-weight: 500; }
        </style>");
        htmlBuilder.AppendLine("</head>");
        htmlBuilder.AppendLine("<body>");
        htmlBuilder.AppendLine($"<header><h1>{_pageTitle}:{breadcrumbBuilder}</h1></header>");
        htmlBuilder.AppendLine("<table id=\"index\">");
        htmlBuilder.AppendLine("<thead><tr>");
        htmlBuilder.AppendLine("<th data-col=\"name\">名称 <span class=\"sort-arrow\">↑</span></th>");
        htmlBuilder.AppendLine("<th data-col=\"size\">大小 <span class=\"sort-arrow\"></span></th>");
        htmlBuilder.AppendLine("<th data-col=\"modified\">最后修改时间 <span class=\"sort-arrow\"></span></th>");
        htmlBuilder.AppendLine("</tr></thead><tbody>");

        // 4. 生成文件/目录列表行
        if (fileList.Count == 0)
        {
            htmlBuilder.AppendLine("<tr><td colspan=\"3\" style=\"text-align:center; padding:20px; color:#666;\">目录无可用文件</td></tr>");
        }
        else
        {
            foreach (var file in fileList)
            {
                var fileName = file.IsDirectory ? $"{file.Name}/" : file.Name;
                var fileClass = file.IsDirectory ? "dir-name" : "";
                var fileSize = file.IsDirectory ? "-" : FormatFileSizeWithComma(file.Length);
                var fileModified = file.LastModified.ToUniversalTime().ToString(CustomDateTimeFormat, CultureInfo.InvariantCulture);
                var encodedFileName = Uri.EscapeDataString(file.Name);
                var fileUrl = $"{context.Request.Path}/{encodedFileName}".Replace("//", "/");

                htmlBuilder.AppendLine("<tr>");
                htmlBuilder.AppendLine($"<td class=\"name {fileClass}\"><a href=\"{HtmlEncode(fileUrl)}\">{HtmlEncode(fileName)}</a></td>");
                htmlBuilder.AppendLine($"<td class=\"length\">{HtmlEncode(fileSize)}</td>");
                htmlBuilder.AppendLine($"<td class=\"modified\">{HtmlEncode(fileModified)}</td>");
                htmlBuilder.AppendLine("</tr>");
            }
        }

        htmlBuilder.AppendLine("</tbody></table>");
        // 5. 排序核心脚本(点击表头切换排序)
        htmlBuilder.AppendLine(@"<script>
            document.addEventListener('DOMContentLoaded', function() {
                const table = document.getElementById('index');
                if (!table) return;
                const headers = table.querySelectorAll('thead th[data-col]');
                const tbody = table.querySelector('tbody');
                let currentSort = { col: 'name', order: 'asc' };

                // 表头点击事件
                headers.forEach(th => {
                    th.addEventListener('click', function() {
                        const newCol = this.dataset.col;
                        currentSort.order = (currentSort.col === newCol) ? (currentSort.order === 'asc' ? 'desc' : 'asc') : 'asc';
                        currentSort.col = newCol;
                        updateSortArrows();
                        sortTable();
                    });
                });

                // 更新排序箭头
                function updateSortArrows() {
                    headers.forEach(th => {
                        const arrow = th.querySelector('.sort-arrow');
                        arrow.textContent = (th.dataset.col === currentSort.col) ? (currentSort.order === 'asc' ? '↑' : '↓') : '';
                    });
                }

                // 排序逻辑
                function sortTable() {
                    const rows = Array.from(tbody.querySelectorAll('tr'));
                    if (!rows.length) return;

                    rows.sort((a, b) => {
                        const cellA = a.querySelector(`td.${getCellClass(currentSort.col)}`).textContent.trim();
                        const cellB = b.querySelector(`td.${getCellClass(currentSort.col)}`).textContent.trim();

                        switch (currentSort.col) {
                            case 'name':
                                const isDirA = cellA.endsWith('/');
                                const isDirB = cellB.endsWith('/');
                                if (isDirA !== isDirB) return isDirA ? -1 : 1;
                                return currentSort.order === 'asc' ? cellA.localeCompare(cellB, 'zh-CN') : cellB.localeCompare(cellA, 'zh-CN');
                            case 'size':
                                if (cellA === '-') return -1;
                                if (cellB === '-') return 1;
                                const sizeA = BigInt(cellA.replace(/,/g, ''));
                                const sizeB = BigInt(cellB.replace(/,/g, ''));
                                return currentSort.order === 'asc' ? (sizeA < sizeB ? -1 : 1) : (sizeA > sizeB ? -1 : 1);
                            case 'modified':
                                const dateA = new Date(cellA.replace(' +00:00', 'Z')).getTime();
                                const dateB = new Date(cellB.replace(' +00:00', 'Z')).getTime();
                                return currentSort.order === 'asc' ? (dateA - dateB) : (dateB - dateA);
                            default: return 0;
                        }
                    });

                    tbody.innerHTML = '';
                    rows.forEach(row => tbody.appendChild(row));
                }

                function getCellClass(colName) {
                    return colName === 'name' ? 'name' : colName === 'size' ? 'length' : 'modified';
                }

                updateSortArrows();
            });
        </script>");
        htmlBuilder.AppendLine("</body></html>");

        // 输出响应
        context.Response.ContentType = "text/html; charset=utf-8";
        await context.Response.WriteAsync(htmlBuilder.ToString(), Encoding.UTF8);
    }

    // 辅助方法:文件大小格式化(带千分位)
    private static string FormatFileSizeWithComma(long bytes)
    {
        return bytes.ToString("N0", CultureInfo.InvariantCulture);
    }

    // 辅助方法:HTML 编码(防 XSS)
    private static string HtmlEncode(string value)
    {
        if (string.IsNullOrEmpty(value)) return string.Empty;
        return value.Replace("&", "&amp;")
                    .Replace("<", "&lt;")
                    .Replace(">", "&gt;")
                    .Replace("\"", "&quot;")
                    .Replace("'", "&#39;")
                    .Replace("`", "&#96;");
    }
}

4. 核心功能说明

4.1 静态文件服务配置

  • PhysicalFileProvider(exposeDir):指定要暴露的物理目录(如 GeoIP 文件夹,位于程序运行目录下);
  • RequestPath = "/geoip":客户端通过 http://localhost:5000/geoip/文件名 访问文件;
  • OnPrepareResponse:可选配置,添加缓存控制头,避免浏览器缓存静态文件。

4.2 目录浏览功能

  • UseDirectoryBrowser:启用目录浏览(默认禁用),需与静态文件服务的 FileProviderRequestPath 保持一致;
  • SortableDirectoryFormatter:自定义目录列表格式化器,替代默认的简陋列表,支持排序和样式优化。

4.3 排序功能实现

  • 前端:通过 JavaScript 监听表头点击事件,切换排序字段(名称/大小/修改时间)和排序方向(升序/降序);
  • 排序逻辑:
    • 名称排序:目录优先,文件在后,按字母/中文拼音排序;
    • 大小排序:目录显示 -,文件按数值大小排序(去除千分位逗号);
    • 时间排序:将 UTC 时间转换为时间戳排序,兼容 2025-10-18 08:16:06 +00:00 格式。

三、关键优化点(兼容生产环境)

1. 安全性优化

  • XSS 防护:通过 HtmlEncode 方法对文件名、路径等用户可控内容进行编码,避免脚本注入;
  • 隐藏文件过滤:默认过滤以 . 开头的文件(如 .gitignore.env),防止敏感文件泄露;
  • 可选:添加身份认证(如 API Key、JWT),限制目录浏览权限(例:RequireAuthorization())。

2. 兼容性优化

  • 跨平台支持:使用 Path.Combine 和路径分隔符替换,兼容 Windows/Linux/macOS;
  • AOT 编译兼容:避免反射和动态代码,支持 .NET 8+ AOT 编译(可直接发布为原生可执行文件);
  • 空值安全:处理 contentsnull、文件名为空等异常场景,避免程序崩溃。

3. 体验优化

  • 面包屑导航:支持多层目录跳转(如 /geoip/GeoLite2/),方便用户回溯;
  • 时间格式标准化:统一使用 yyyy-MM-dd HH:mm:ss +00:00 格式,避免时区混淆;
  • 响应头优化:指定 charset=utf-8,确保中文文件名正常显示。

四、测试效果

  1. 运行项目:dotnet run
  2. 在程序运行目录下创建 GeoIP 文件夹,放入测试文件/子目录;
  3. 访问 http://localhost:5000/geoip,即可看到目录列表:
    1. 默认按名称升序排列,目录在前,文件在后;
    2. 点击表头「名称」「大小」「最后修改时间」可切换排序方式;
    3. 点击文件名/目录名可直接访问(目录会进入下一级列表)。

五、扩展场景

  1. 静态资源托管:用于托管 API 文档(如 Swagger、Redoc)、前端静态文件(Vue/React 构建产物);
  2. 内部文件共享:团队内部临时共享文件(结合身份认证,避免公开访问);
  3. 日志文件查看:暴露日志目录,支持按修改时间排序查看最新日志文件。

六、总结

通过 .NET MiniAPI 的静态文件中间件 + 自定义目录格式化器,我们仅需少量代码就实现了「指定目录暴露 + 可排序目录浏览」功能。该方案简洁高效,兼容生产环境,适用于轻量级文件服务场景。如需进一步增强,可扩展权限控制、文件上传、下载限速等功能。

下载 Demo : MiniApiStaticFileDemo.zip

如果有任何问题或优化建议,欢迎在评论区交流~

解决 wsl 重启后 /etc/resolv.conf 中的DNS丢失

今天在wsl中不知道操作了什么,重启后apt更新报错,发现resolv.conf的DNS变成了“127.0.0.1”,然后用 echo 写入 DNS,重启后又是没有了。

按微软的文档,设置修改 /etc/wsl.conf

[network]
generateResolvConf = false

然后写入 DNS 到 resolv.conf

echo "nameserver 192.168.1.1" > /etc/resolv.conf
echo "nameserver 114.114.115.115" > /etc/resolv.conf

重启后,一样,添加的nameserver没有了。

在windows中,直接编辑 \wsl.localhost\Debian\etc\resolv.conf

提示“系统无法辨识文件名”,无法直接修改。

看了服务,猜测是不是某些服务控制修改的,如:resolvconf,rdnssd,systemd-resolved,先关闭启动:

systemctl disable --now resolvconf.service rdnssd.service systemd-resolved.service

再次 echo DNS 到 resolv.conf, 重启后,还是不行。。。

无奈,直接删除了resolv.conf: rm /etc/resolv.conf

再生成写入:

echo "nameserver 192.168.1.1" > /etc/resolv.conf
echo "nameserver 114.114.115.115" > /etc/resolv.conf

然后再设置只读:sudo chattr -f +i /etc/resolv.conf

再次重启,DNS没有丢失。

如果要在windows中直接修改,设置为属性可写:sudo chattr -i /etc/resolv.conf

不知道为什么必须要先删除,才再建resolv.conf,才可以修改成功。。。

【end】

使用 hping 时报错的处理

Linux中使用Nmap , hping, ping 提示以下错误时

PHP: [main]	can't	open	raw	socket

Bash: Couldn’t open a raw socket. Error: Permission denied (13)

非root进程调用带有网络原始套接字(raw socket) 的相关命令时,会报错,需要使用getcap 设置 capabilities

(具体参考:https://cloud.tencent.com/developer/article/1539041)

# 以 ping 为例,先 which 查看命令地址
which ping

# 如无返回就是没有设置cap
getcap /usr/bin/ping

# 设置cap
sudo setcap cap_net_raw+ep /usr/bin/ping

# 再次getcap 已有设置值
getcap /usr/bin/ping
#/usr/bin/ping cap_net_raw=ep

setcap 之后问题就解决了。

到底是谁的 CIDR?

原文:Whose CIDR Is It Anyway?

https://labs.ripe.net/author/jschauma/whose-cidr-is-it-anyway

【以下由 微软Bing 机翻】

IP 地址空间并没有被平均分配,经过多年的重新分配和重新分配,我想到的问题是:谁拥有它的哪些部分?在有关互联网集中化的系列文章的最新一篇中,Jan Schaumann 深入研究了数据,试图获得更清晰的视图。


今年是 2035 年,是桌面版 Linux 的一年(祈祷,这将是它!),IPv6 的广泛采用迫在眉睫,而 Amazon 刚刚购买了它没有拥有的最后一个 /8:。255.0.0.0/8

我们是怎么走到这一步的?

首先,我认为我们比 2035 年更接近这种情况,因为 Amazon 已经在内部使用 E 类地址,为什么不呢:

$ traceroute www.amazon.com
traceroute to e15316.dsca.akamaiedge.net (23.209.110.82), 64 hops max, 40 byte packets
 1  244.5.5.97 (244.5.5.97)  8.543 ms
    244.5.5.81 (244.5.5.81)  3.580 ms
    244.5.5.97 (244.5.5.97)  6.846 ms
 2  240.0.56.98 (240.0.56.98)  0.388 ms
    240.0.56.65 (240.0.56.65)  0.367 ms
    240.4.112.65 (240.4.112.65)  0.352 ms
 3  242.0.227.213 (242.0.227.213)  1.687 ms
    242.0.227.81 (242.0.227.81)  1.448 ms
    242.0.227.83 (242.0.227.83)  1.055 ms
 4  240.3.180.14 (240.3.180.14)  1.319 ms
    240.3.180.12 (240.3.180.12)  1.320 ms
    240.3.180.15 (240.3.180.15)  1.991 ms
[...]

当该网络块最终由 IANA 分配时,这将很有趣(例如,本草案中提议的1)和 Amazon 基本上会说“对不起,我们有 dibs。你不能指望我们重新编号所有 EC2,所以你还不如把整个 /4 给我们,kthanxbye。

(旁注:当然,它们的 IPv6 地址会做其他人做的事情,并将 IPv4 地址编码在其 v6 地址的底部字节中:

$ traceroute6 www.amazon.com
traceroute6: `www-amazon-com.customer.fastly.net' has multiple addresses; using `2606:2cc0::374'
traceroute6 to www-amazon-com.customer.fastly.net (2606:2cc0::374) from 2600:1f18:400c:b800:bdf1:6584:1971:4efe, 64 hops max, 12 byte packets
 1  2620:107:4000:2210:8000:0:f405:667  58.911 ms  # 244.5.102.7
    2620:107:4000:2210:8000:0:3ec:3e71  0.831 ms
    2620:107:4000:2210:8000:0:3ec:3e73  0.808 ms
 2  2620:107:4000:a792::f000:3841  0.419 ms        # 240.0.56.65
    2620:107:4000:a792::f000:3843  0.473 ms
    2620:107:4000:a792::f000:3842  0.4 ms
 3  2620:107:4000:cfff::f20c:2b01  17.258 ms       # 242.12.43.1
    2620:107:4000:cfff::f20c:2b81  12.562 ms
    2620:107:4000:cfff::f200:e353  2.026 ms
 4  2620:107:4000:c5c0::f3fd:1  1429.46 ms  1299.83 ms
    2620:107:4000:c5c0::f3fd:3  1368.37 ms
 5  2620:107:4000:cfff::f202:d4c3  2.15 ms
    2620:107:4000:cfff::f202:d545  1.931 ms
    2620:107:4000:cfff::f202:d445  1.358 ms
 6  2620:107:4000:8001::24  2.469 ms
    2620:107:4000:8001::44  10.271 ms
    2620:107:4000:8001::24  1.16 ms
[...]
$

这种做法对于戴着各种帽子的信息安全书来说非常有用,因为巨大的 IPv6 地址空间变得更加易于管理,通过这种方式,您可以收集有关目标的其他信息,所以谢谢你 – 但我跑题了。

总之,我想你明白我要说的是什么了:我们被告知,IANA 将 IP 空间分配给地区注册管理机构,他们进一步管理分配的网络块。一些早期采用者从 Jon Postel(最初的 IANA)那里得到了一份特别的礼物:他们自己的 /8。

在区域注册表级别,可用的 IP 空间没有均匀分配。如果我们去掉保留的 IP 空间(总共 35 /8,包括 E 类、组播和选定的其他网络块),只查看分配给不同区域互联网注册机构 (RIR) 的实际可用 IP 地址,那么我们会发现 ARIN 管理着超过 50% 的 IPv4 IP 空间,而 AFRINIC 只管理着 2.7%。相比之下,IPv6 地址空间的分配要均匀得多:

当然,当我们用完 IP 地址时,网络块被重新分配和重新分配,在区域注册表之间转移,公司开始交易网络块,如果你有一个备用的 /9 左右,这被证明是一个非常好的快速赚钱方式。

这样的例子有很多,例如谷歌在 2017 年从 Merit Networks 购买了 35.192.0.0/12,但让我们以亚马逊为例:

哦,在 2023 年,AWS 开始对公有 IPv4 地址的使用收费:0.005 USD/小时

但我开始这项研究基本上是因为我碰巧正在查看 AWS 发布的 ip-ranges 文件,我心想:“嗯,光是一家公司就有这么多 IP 地址。这甚至不是 Amazon 的全部,只是 AWS:

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[].ip_prefix' | wc -l
    9180
$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | \
    jq -r '.prefixes[].ip_prefix' | \
    awk -F/ '{ sum += 2^(32-$2) } END { printf("%'"'"'d\n", sum) }'
144,578,747
$

顺便说一句,如果你应用 Amazon 的逻辑,对每个 IP 地址每小时收取半美分的费用,那么那里的 CIDR 每年为 Amazon 提供 63 亿美元的净价值。不算太寒酸。

但是,看着 Amazon 在这里拥有的巨大股份,以及各种其他 netblock 交易、重新分配和重新分配,我在想:我们甚至知道谁拥有 IP 空间的哪些部分吗?我的意思是,当然,我们有点“知道”,因为这些信息是必须可用的……地方。但是我们如何看待这些数据呢?

现在,如果您自己恰好不是 RIR,您该如何查找这些信息呢?我们知道 CIDR 块分配在 中,虽然它非常简单,而且当你是人类时,输出真的很容易阅读,但试图大规模地使用数据做任何事情都会一团糟whoiswhoiswhois

“有些人在遇到问题时会想’我知道,我会用 whois。’现在他们遇到了非结构化的文本问题。

幸运的是,RIR 自己发布了统计数据,以有据可查的格式显示了他们在此处联合进行的 ASN、IPv4 和 IPv6 分配(或按 RIR 为 AFRINIC、ARIN、APNIC、RIPE NCC 和 LACNIC)。这些数据如下所示:

$ curl -s https://ftp.ripe.net/pub/stats/ripencc/nro-stats/latest/nro-delegated-stats | \
    grep "|ipv4|"
[...]
iana|ZZ|ipv4|0.0.0.0|16777216|19810901|reserved|ietf|iana
apnic|AU|ipv4|1.0.0.0|256|20110811|assigned|A91872ED|e-stats
apnic|CN|ipv4|1.0.1.0|256|20110414|assigned|A92E1062|e-stats
apnic|CN|ipv4|1.0.2.0|512|20110414|assigned|A92E1062|e-stats
apnic|AU|ipv4|1.0.4.0|1024|20110412|assigned|A9192210|e-stats
apnic|CN|ipv4|1.0.8.0|2048|20110412|assigned|A92319D5|e-stats
apnic|JP|ipv4|1.0.16.0|4096|20110412|assigned|A92D9378|e-stats
apnic|CN|ipv4|1.0.32.0|8192|20110412|assigned|A92319D5|e-stats
apnic|JP|ipv4|1.0.64.0|16384|20110412|assigned|A9252414|e-stats
apnic|TH|ipv4|1.0.128.0|32768|20110408|assigned|A91CF4FE|e-stats
[...]
$

这非常有用,但请注意,我们没有得到实际的 CIDR 分配 — 我们得到的是起始地址和 IP 地址计数。我们确实得到了国家/地区代码信息(是的!),但没有 AS 信息,也没有所有权数据。所以不完全是我们正在寻找的。

但是,嘿 – 我们记得因为 whois 很愚蠢,互联网已经同意使用 RDAP 来代替了?那会很整洁!RDAP 是 RESTful 的!这是 JSON!它在 RFC 中指定(这么多很多很多很多 RFC),甚至还有真正有用的文档

$ curl -s -L https://rdap.db.ripe.net/ip/2.19.4.0
{
  "handle" : "2.19.0.0 - 2.19.15.255",
  "startAddress" : "2.19.0.0",
  "endAddress" : "2.19.15.255",
  "ipVersion" : "v4",
  "name" : "AKAMAI-PA",
  "type" : "ASSIGNED PA",
  "country" : "EU",
  "parentHandle" : "2.16.0.0 - 2.23.255.255",
  "cidr0_cidrs" : [ {
    "v4prefix" : "2.19.0.0",
    "length" : 20
  } ],
  "status" : [ "active" ],
  "entities" : [ {
    "handle" : "AKAM1-RIPE-MNT",
[...]

这看起来非常有用,但当然,最后我使用了所有这些交叉事实来源的组合:我只是从 开始,查找 RDAP 信息,提取 ,确定紧随其后的地址,然后重复 RDAP 查找,以这种方式迭代整个 IPv4 空间。0.0.0.0endAddress2然后,我对 Team Cymru 的 IP 到 ASN 服务执行了 DNS 查找,并使用通常的 Perl、 和 shell 胶水大杂烩,将所有这些数据与已发布的 RIR 统计数据进行交叉引用。awk(1)

现在,使用多个事实来源的问题是 — 正如任何曾经尝试过创建、使用或与之交互的人(例如资产清单)所告诉您的那样 — 您充其量只能获得所有不同来源的交叉视图。还有 bug。

“whois 很愚蠢*,请使用 RDAP。那会很棒!…他们说

使用标准化协议从互联网上的不同来源收集大量数据的有趣之处在于,它如何破坏您对标准化协议的信念,同时让您对遇到的所有边缘情况感到困惑。

RDAP 有很多优点,但该服务由五个以上的主要方(RIR 加上各种区域 NIC)运行,我发现了许多错误和问题:

  • 带和不带负载正文的 HTTP 重定向
  • 在 RIR 之间重定向循环3
  • RDAP IP 查询结果不包括 AS 编号(有时包含)whois
  • AFRINIC 有 API 限制,但不会告诉您它们是什么
  • 超过未知 API 限制时,AFRINIC 返回 429 状态代码 (yay),但没有 Retry-After 标头 (boo)
  • https://rdap.registro.br/会告诉你他们的 API 限制是每 20 秒 1 个请求;如果你超过它,那就是 403 Forbidden – 再见!(是时候轮换源地址了…
  • AFRINIC 有时会返回 -1 的网络掩码(例如196.28.253.0/22)
  • endAddressCIDR0_CIDRS4
  • ARIN 和 LACNIC 在 RDAP 中不包含国家/地区代码信息
  • JPNIC 不包含分配类型,实际上是将其设置为null

所以是的……

RDAP:与 “” 相同 GIGO,但至少它是 JSON。

whois

按国家/地区代码划分的 IPv4 分配

在收集并关联所有数据后,我最终得到了大约 300K 的信息5近 240 个国家/地区的 CIDR 分配。6CIDR 分配计数排名前 10 的国家/地区7是:

  1. 🇷🇺 俄罗斯(> 17K 分配)
  2. 🇩🇪 德国 (12.5K)
  3. 🇧🇷 巴西 (12.1K)
  4. 🇬🇧 英国 (11.8K)
  5. 🇮🇳 印度 (9.4K)
  6. 🇨🇳 中国 (9.3K)
  7. 🇦🇺 澳大利亚 (7.2K)
  8. 🇳🇱 荷兰 (7.2K)
  9. 🇯🇵 日本 (7.1K)
  10. 🇺🇸 美国 (6.5K)

但并非所有 CIDR 都是相等的 – 分配了数百个 /24 并不能弥补分配一个 /8。也许计算 IP 地址可能会更好?我们可以轻松地将这些数字相加,然后将它们与 IPv4 地址空间的总量进行比较:

  1. 🇺🇸 美国(1.61B 个 IP,占所有 IPv4 的 43.8%)
  2. 🇨🇳 中国 (343.17M, 9.3%)
  3. 🇯🇵 日本 (189.81M, 5.1%)
  4. 🇬🇧 英国 (127.41M, 3.5%)
  5. 🇩🇪 德国 (124.21M, 3.4%)
  6. 🇰🇷 韩国 (112.5M, 3.1%)
  7. 🇧🇷 巴西 (87.14M, 2.4%)
  8. 🇫🇷 法国 (82.18M, 2.2%)
  9. 🇨🇦 加拿大 (68.52M, 1.9%)
  10. 🇮🇹 意大利 (54.03M, 1.5%)

这里突出的当然是分配给美国的大量 IP 地址,以及美国和中国合计占 50% 以上的事实,是整个 IPv4 地址空间 75% 以上的前十个国家。

按国家/地区代码划分的 IPv6 分配

对于 IPv6 分配,我的数据仅基于 RIR 统计数据。总的来说,那里的信息没那么有趣,仅仅是因为 IP 空间如此之大,以至于集中化真的不是问题。为了完整起见,我在此处列出了 IPv6 的发现:

有趣的是,显然,中非共和国、厄立特里亚和朝鲜(以及南极洲、福克兰群岛、法属南部和南极地区、科索沃、斯瓦尔巴群岛和扬马延岛以及西撒哈拉)都没有 IPv6 分配。

按 RIR 分配的 IPv4

非洲人

如果我们从区域注册管理机构的角度来看,我们会注意到 AFRINIC 覆盖的不仅仅是非洲,尽管 AFRINIC 的前十名分配(占其所有分配的 80% 以上)都位于非洲大陆。嗯,除了香港:

这里需要注意的一点是,RIR 统计数据仅确定了 AFRINIC 向其分配 IP 块的 54 个国家/地区,但从 RDAP 收集的数据暗示了更广泛的传播。这表明这里正在进行相当活跃的 CIDR 区块交易。

另一个惊喜(至少对我来说)是向毛里求斯这个相对较小的国家进行了大量拨款。通常,我预计分配与人口大致成正比,尽管一个国家的经济权重在这里起着更大的作用:至少在 2014 年,毛里求斯在非洲排名第三。但话又说回来,AFRINIC 的总部设在毛里求斯……啊啊。

APNIC 的

毫不奇怪,APNIC 将中国列为拥有 IP 地址最多的国家/地区,其次是日本和韩国,前十名中的其他国家至少都在亚洲,尽管它们再次高度集中:中国、日本和韩国几乎占 APNIC 分配的所有 IP 地址的 75%:

阿林

ARIN 在此处分配的 IP 地址的地理分布仅来自 RIR 统计数据,因为 ARIN 提供的 RDAP 数据不包括国家/地区代码。与其他 RIR 一样,我们看到的分配远远超出了其假定的地理区域,当然,不出所料,主要的异常值是美国,占 ARIN 所有分配的 95% 以上:

  1. 🇺🇸 美国(1.59B 个IP,95.4% 的 ARIN,~37% 的所有 IP)
  2. 🇨🇦 加拿大 (68.2M, 4.1%)
  3. 🇵🇷 波多黎各 (757K)
  4. 🇨🇿 捷克共和国 (395K)
  5. 🇯🇲 牙买加 (222K)
  6. 🇧🇧 巴巴多斯 (168K)
  7. 🇧🇸 巴哈马 (138K)
  8. 🇬🇧 英国 (136K)
  9. 🇻🇮 美属维京群岛 (118K)
  10. 🇧🇲 百慕大 (108K)

LACNIC

与 ARIN 一样,LACNIC 的 RDAP 服务不提供国家/地区代码(尽管提供),因此此处的统计数据同样仅基于 RIR 统计数据:nic.br

  1. 🇧🇷 巴西(87.14M 个 IP,占 LACNIC 的 45.8%)
  2. 🇲🇽 墨西哥 (29.02M, 15.3%)
  3. 🇦🇷 阿根廷 (19.46M, 10.2%)
  4. 🇨🇴 哥伦比亚 (17.37M, 9.1%)
  5. 🇨🇱 智利 (10.03M, 5.3%)
  6. 🇻🇪 委内瑞拉 (6.71M, 3.5%)
  7. 🇵🇪 秘鲁 (3.24M, 1.7%)
  8. 🇪🇨 厄瓜多尔 (2.71M, 1.4%)
  9. 🇺🇾 乌拉圭 (2.44M, 1.3%)
  10. 🇨🇷 哥斯达黎加 (2.34M, 1.2%)

请注意,LACNIC 似乎是受区域限制最严格的注册机构,如果您愿意的话,它几乎保持在指定的边界内。也就是说,其他 RIR 向 LACNIC 进行的 IP 区块交易似乎较少。

成熟的 NCC

现在,我们冗余的欧洲 IP 网络协调中心是具有最广泛全球影响力的 RIR,负责全球 164 个国家/地区的分配:

  1. 🇩🇪 德国(130.75M IP,占 RIPE NCC 的 15.2%)
  2. 🇬🇧 英国 (130.48M, 15.2%)
  3. 🇫🇷 法国 (87.03M, 10.1%)
  4. 🇮🇹 意大利 (56.69M, 6.6%)
  5. 🇳🇱 荷兰 (48.7M, 5.7%)
  6. 🇷🇺 俄罗斯 (47.29M, 5.5%)
  7. 🇪🇸 西班牙 (33.9M, 3.9%)
  8. 🇸🇪 瑞典 (28.93M, 3.4%)
  9. 🇨🇭 瑞士 (25.2M, 2.9%)
  10. 🇵🇱 波兰 (20.35M, 2.4%)

按分配类型划分的分配

我查看的另一件事是不同 RIR 分配了哪些类型的网络块。此信息可在 RDAP 响应中找到,请记住,RDAP 很棒,因为它定义明确!例如,RFC9083 告诉我们:

type – 一个字符串,其中包含根据该 RIR 的注册模型对网络进行的特定 RIR 分类

哦,天哪,一根绳子。井。是的。因此,不同的 RIR 选择定义不同的字符串也就不足为奇了:

例如,请参阅 APNIC 对不同分配类型的解释;通常,“PA”代表“提供商可聚合”,而“PI”代表“独立于提供商”。

按类型划分的所有 22 个不同分配的完整分布如下所示:

这些数据有一个警告:JPNIC 的 RDAP 结果始终将“Allocation Type”字段设置为 。但是,让我们按 RIR 比较这些分配。null

为了帮助我们回答谁拥有 CIDR 的问题,将本地注册管理机构的分配与最终用户的分配分开可能是有意义的。遗憾的是,不同的 RIR 对这些 RIR 使用不同的类型(在上面的每张图片中以红色圈出),但实际上这是一个很难区分的地区。

例如,ARIN 的“DIRECT ALLOCATION”应该用于本地注册管理机构和 ISP/电信公司,但尚不清楚例如,可能为其 ATM 网络重新分配净块的银行是否被视为本地注册管理机构;就我们在这里的目的而言,他们是同一个所有者。哦,当然,RIPE NCC 的“传统”分配可能是也可能不是最终用户分配。谁知道呢。

分配大小

接下来,我查看了分配的 net blocks 有多大。我发现了 25 种不同的 CIDR 大小,其中 ~5K 分配为 /n < /16,~7.2K 分配为 /n > /24。大多数是 /24s、/22s 和 /23s,但当然还有 23 个 /8s、11 个 /9s,以及光谱两端不可忽略的异常值:

数据科学书告诉我,饼图很糟糕,所以下面是相同数据的帕累托图:

让我有点惊讶的是 /32 分配的显著数量 (1,387),但除此之外,/24 分配是迄今为止最常见的分配,这也反映在所有 RIR 的分配中——除了 LACNIC,它似乎更偏爱 /22。(您可以在此处查看每个 RIR 的帕累托图: AFRINIC、APNIC、ARIN、LACNIC、RIPE NCC

为了方便起见,我还检查了 IPv6 分配大小(70 种不同的分配大小;22 个 CIDR /n < /32(252K 个分配),18 个 CIDR /n > /48(572 个分配),9 个 CIDR /n > /100(22 个分配)),其中 /24 也是最受欢迎的一个。当然,在 IPv6 中,/24 大约是 2 个十分 IP 地址,而不是 256 个,但没关系。

按网络名称划分

但我仍在寻找网络区块的实际所有者名称。RDAP(很像 )使用“网络名”标识子网,因此我们可以按分配频率以及分配给给定网络名的 IP 地址总数来计算这些子网。whois

每个 “网络名称” 可能与大量不同的自治系统 (AS) 编号相关联,而 “网络名称” 当然不一定具有很强的描述性或揭示性:要尝试将这些名称映射到实际的组织名称,您需要相当多的人为关联。

此外,有时您需要知道(或推断)不同的实体实际上是同一个实体:“Amazon Technologies Inc.”和“Amazon.com Inc.”显然是相关的,但被确定为“Level 3 Parent LLC”和“Century Link Communications”拥有的网络具有相同的父所有者(在本例中为 Lumen Technologies, Inc.)这一事实远非明显。8

按 AS 编号划分的分配

尝试通过将 IP 地址与 AS 编号相关联来映射数据(如上所述,主要通过 Team Cymru 的 IP 到 ASN 服务),我发现了大约 63K 个不同的 AS 编号:

(是的,这张图中突出显示的“斯塔克工业”是布赖恩·克雷布斯最近在不同的上下文中讨论的那个。我之所以提到它,只是因为它让我觉得这是一个非常科技兄弟的名字。

但观察到的 AS 频率是一个因素。如果我们统计给定 CIDR 的 IP 地址并按 AS 映射这些地址,则会出现不同的视图:

换句话说,我们发现自己是触摸大象的盲人之一——我们从不同的侧面得到不同的观点,却没有真正得到完整的视角。尝试将 AS 编号和网络名称组合在一起并手动将它们与实体相关联,我得出了拥有最多 IP 地址的顶级组织的粗略分布,这些地址占所有 IP 空间的很大一部分,并且至少在一定程度上回答了我们最初的问题。前十名(无论如何,按这个计数计算)是:

  1. 美国国防部(352M 个 IP 地址,占所有 IPv4 地址的 8.19%)
  2. 亚马逊(181M,4.21%)
  3. 中国电信 (112M, 2.61%)
  4. AT&T (111M, 2.59%)
  5. Verizon (101M,2.35%)
  6. 康卡斯特 (71M, 1.64%)
  7. Lumen Technologies (65M, 1.52%)
  8. Microsoft(59M,1.37%)
  9. 软银 (48M, 1.1%)
  10. 韩国电信 (46M, 1.08%)

这里需要指出的一点(除了 DoD 是一个明显的异类)是只有两家公司不是电信提供商:Amazon 和 Microsoft。所有其他公司实际上是 ISP 和 Telco。

总结

嗯,这是很多数据,都呈现出略有不同的观点。这些数据是否回答了我们关于谁拥有哪些 CIDR 的主要问题?只是在某种程度上,真的。整个练习有点令人沮丧,但以下是一些结论性发现:

首先,区分 “最终用户” 和 LIR 真的很难。Amazon 是否是 LIR,因为不同的客户通过 AWS 使用他们的 IP 空间?

我们还发现不同的 RIR 定义存在很多不一致之处,这使得数据难以关联,并且 RDAP 中的一些数据在单个 RIR 内不一致、有缺陷或不完整。我已经向不同的 RIR 报告了一些发现;一些发现已经得到解决,但总的来说,我认为这是一个有很大改进空间的领域。

另一件让我有点惊讶的事情是,区域互联网注册管理机构似乎比您想象的要少得多,因为区块被交易、转让或分配给其所在地区以外的实体。

但总的来说,根据我所看到的,看起来大约 30% 的 IP 地址只由少数组织管理,当然,国防部仍然拥有其中的大部分9

我们已经看到,除了 ISP/电信公司或 LIR(对他们来说拥有大部分 IP 空间似乎是合理的)之外,前十名中只有两家大型互联网公司。这两家公司也恰好控制着互联网或行业和市场的其他方面,这再次暗示了中心化的趋势。

最后,对 IPv6 进行相同的练习就没那么有趣了。它太多了,以至于交易 netblocks 等的考虑因素并不那么相关。IPv6 很无聊。这是一件好事。我真的很喜欢无聊 – 我们应该做更多这样的事。甚至可能在 2035 年之前。

Apt update : failed to fetch expkeysig abf5bd827bd9bf62 nginx signing key signing-key@nginx.com

apt update ,更新 nginx 时报错。 提示 Nginx 签名无效, 无法获取.

failed to fetch https://nginx.org/packages/mainline/debian/dists/bookworm/inrelease the following signatures were invalid: expkeysig abf5bd827bd9bf62 nginx signing key <signing-key@nginx.com>
解决处理:
  1. 导入 Nginx.org GPG 密钥
curl -fSsL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null

2. 验证密钥是否成功导入

gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

3. 导入 Nginx.org APT 存储库

bash 下执行以下 echo 命令 :

Mainline 存储库 、稳定存储库 二选一!

要导入 Nginx Mainline 存储库,请使用:

echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

或者,对于 Nginx 稳定存储库:

echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

ICANN终止OpenTLD(Freenom)认证 – 域名转移到Gandi

”人人都熟悉的名字“ — Freenom.com

已经使用了近十年,很好的一家,良心域名注册商,还是被遭到了毒打。Freenom以极低的价格提供域名注册,费用号称成本价,比如.NL 、.EU,还提供TK、CF、GA、GQ、ML 域名的免费注册。最早就是从免费的.TK 域名知道它的。

大约从2023年初开始,已经很久不能注册新域名了。之前看到说是,被Facebook母公司Meta , 在美国加利福尼亚州法院起诉 。被起诉后 Freenom 就由于技术原因新注册申请暂停,当前正在研究解决方案,希望尽快恢复运营。

2024年1月15日我还曾在Freenom续费域名,到2月初,发现域名已经无法续费了。2024/2/12收到了Gandi.net 的支持邮件,告知ICANN终止了OpenTLD(Freenom)的认证- 域名转移到Gandi:

Gandi Support: OpenTLD (Freenom) ICANN accreditation termination – Transfer to Gandi – Recover your domain

Dear registrant,
We are reaching out to you as the owner of the domain name as32.net which was registered with the registrar OpenTLD B․V․, trading as Freenom.
Following the termination of OpenTLD accreditation, ICANN has selected Gandi as the gaining registrar for the gTLD domain names previously managed by OpenTLD. You can find more information about this transfer on the following ICANN page:
https://www.icann.org/resources/pages/bulk-transfers-2017-10-06-en.
If you have not already recovered the management of this domain name at Gandi, please follow the link below. You will be able to import the domain name into your Gandi account if you already have one, or create a Gandi account to be able to manage your domain name.
Import your domain name
We kindly request your attention to the following points:
– Gandi does not provide proxy and privacy services. Consequently, your contact information has been sent to the registry. However in the Whois public database, personal data remain hidden in accordance with ICANN rules. Only the organisation name for legal persons, the state (if available) and the country of the owner contact are published. Email addresses of domain name contacts are anonymized.
– The expiration date of the domain name remains unchanged. You can verify the expiration date via your Gandi account and proceed with renewal if necessary.
Should you have any question, our support team will be delighted to help you:
https://helpdesk.gandi.net.
Thank you for your attention to this matter.
____________________________________________________________

about this transfer on the following ICANN page:
https://www.icann.org/resources/pages/bulk-transfers-2017-10-06-en.

请注意:下表列出了因注册服务机构的认证被 ICANN 终止后所致的批量转移事件。此外,批量转移日期将在终止日期之后。

Terminated RegistrarGaining RegistrarTermination Date
OpenTLD B.V. (IANA #1666)Gandi SAS (IANA #81)25 November 2023
https://www.icann.org/resources/pages/bulk-transfers-2017-10-06-zh

https://www.rayks.com/article/freenom-pending.html

2024 年 2 月 12 日,知名域名注册服务提供商 Freenom 通过其官方网站发布公告,表示 Freenom 及其相关公司已决定退出域名业务,包括注册机构的运营。


Freenom 公司已于 2023 年 3 月 9 日全面停止了新域名的注册业务,但未回收已注册域名且域名到期续费功能也保持开放状态,直到近期宣布“退出域名业务”决定后开始大量收回已注册域名。
Freenom 公司官方宣布内容译文及原文如下:
新闻声明
阿姆斯特丹,2024 年 2 月 12 日。Freenom 今天宣布已解决 Meta Platforms, Inc. Freenom 承认 Meta 在实施其知识产权和保护其用户免受欺诈和滥用方面的合法权益。
Freenom 及其相关公司也已独立决定退出域名业务,包括注册机构的运营。在 Freenom 结束其域名业务的同时,Freenom 将把 Meta 旗下公司视为可信赖的通知方,并将实施阻止列表,以应对未来的网络钓鱼、DNS 滥用和抢注行为。
如需进一步咨询,请联系:
Karin Versteeg
kversteeg@freenom.com
—————————————————原文如下—————————————————
Press Statement
Amsterdam, 12th of February 2024. Freenom today announced it has resolved the lawsuit brought by Meta Platforms, Inc. on confidential monetary and business Terms. Freenom recognizes Meta’s legitimate interest in enforcing its intellectual property rights and protecting its users from fraud and abuse.
Freenom and its related companies have also independently decided to exit the domain name business, including the operation of registries. While Freenom winds down its domain name business, Freenom will treat the Meta family of companies as a trusted notifier and will also implement a block list to address future phishing, DNS abuse, and cybersquatting.
For further inquiries, please contact:
Karin Versteeg
kversteeg@freenom.com
域名注册商 Freenom 宣布退出域名业务 大规模回收免费域名

https://www.rayks.com/article/freenom-pending.html

相关消息:

https://domainnamewire.com/2023/11/10/icann-terminates-opentld-famous-for-its-connection-to-tk-domains/

https://domainnamewire.com/2023/09/21/icann-sends-breach-notice-to-freenoms-accredited-domain-registrar/

https://www.icann.org/uploads/compliance_notice/attachment/1211/hedlund-to-zuurbier-20sep23.pdf

https://zhuanlan.zhihu.com/p/682465154

https://zhuanlan.zhihu.com/p/627211282

https://www.zhihu.com/question/591955285

https://www.zhihu.com/question/644205158

使用 update-alternatives 命令切换软件版本

update-alternatives 的功能,类似于在桌面系统上设置默认打开程序。

# update-alternatives --help
用法:update-alternatives [<选项> ...] <命令>

命令:
  --install <链接> <名称> <路径> <优先级>
    [--slave <链接> <名称> <路径>] ...
                           在系统中加入一组候选项。
  --remove <名称> <路径>   从 <名称> 替换组中去除 <路径> 项。
  --remove-all <名称>      从替换系统中删除 <名称> 替换组。
  --auto <名称>            将 <名称> 的主链接切换到自动模式。
  --display <名称>         显示关于 <名称> 替换组的信息。
  --query <名称>           机器可读版的 --display <名称>.
  --list <名称>            列出 <名称> 替换组中所有的可用候选项。
  --get-selections         列出主要候选项名称以及它们的状态。
  --set-selections         从标准输入中读入候选项的状态。
  --config <名称>          列出 <名称> 替换组中的可选项,并就使用其中
                           哪一个,征询用户的意见。
  --set <名称> <路径>      将 <路径> 设置为 <名称> 的候选项。
  --all                    对所有可选项一一调用 --config 命令。

<链接> 是指向 /etc/alternatives/<名称> 的符号链接。
    (如 /usr/bin/pager)
<名称> 是该链接替换组的主控名。
    (如 pager)
<路径> 是候选项目标文件的位置。
    (如 /usr/bin/less)
<优先级> 是一个整数,在自动模式下,这个数字越高的选项,其优先级也就越高。

选项:
  --altdir <目录>          改变候选项目录。
                             (默认是 /etc/alternatives)。
  --admindir <目录>        设置 statoverride 文件的目录。
                             (默认是 /var/lib/dpkg/alternatives)。
  --instdir <目录>         改变安装目录。
  --root <目录>            改变文件系统根目录。
  --log <文件>             改变日志文件。
  --force                  允许使用候选项链接替换文件。
  --skip-auto              在自动模式中跳过设置正确候选项的提示
                           (只与 --config 有关)
  --quiet                  安静模式,输出尽可能少的信息。
  --verbose                启用详细输出。
  --debug                  调试输出,信息更多。
  --help                   显示本帮助信息。
  --version                显示版本信息。

注册软件: update-alternatives –install

以jdk为例,安装了jdk以后,先要在update-alternatives工具中注册;

# update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_91/bin/java 200
# update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_111/bin/java 300

其中:

  • 第一个参数:--install表示向 update-alternatives 注册服务名。
  • 第二个参数:是注册最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链;
  • 第三个参数:服务名,以后管理时以它为关联依据。
  • 第四个参数:被管理的命令绝对路径。
  • 第五个参数:优先级,数字越大优先级越高。

常用示例

显示程序的可替换信息:update-alternatives –display <名称>

 # 显示PHP程序的可替换信息
update-alternatives --display php

php - manual mode
  link best version is /usr/bin/php8.3
  link currently points to /usr/bin/php8.2
  link php is /usr/bin/php
  slave php.1.gz is /usr/share/man/man1/php.1.gz
/usr/bin/php8.2 - priority 82
  slave php.1.gz: /usr/share/man/man1/php8.2.1.gz
/usr/bin/php8.3 - priority 83
  slave php.1.gz: /usr/share/man/man1/php8.3.1.gz

注册添加程序的可替换信息:update-alternatives –install <名称>

# 设置PHP
update-alternatives --install /usr/bin/php php /usr/local/lsws/lsphp74/bin/php 74
update-alternatives --install /usr/bin/php php /usr/local/lsws/lsphp81/bin/php 81
update-alternatives --install /usr/bin/php php /usr/local/lsws/lsphp82/bin/php 82

列出 程序替换组中所有的可用选项:update-alternatives –list <名称>

update-alternatives --list php

/usr/bin/php8.2
/usr/bin/php8.3 

交互式修改:update-alternatives –config <名称> 显示可用选项的列表,选择对应的索引确认。

#设置默认浏览器
update-alternatives --config www-browser 

There is 1 choice for the alternative www-browser (providing /usr/bin/www-browser).

  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/w3m     25        auto mode
  1            /usr/bin/w3m     25        manual mode

Press <enter> to keep the current choice[*], or type selection number:

#设置默认使用的php版本
update-alternatives --config php

There are 2 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
  0            /usr/bin/php8.3   83        auto mode
* 1            /usr/bin/php8.2   82        manual mode
  2            /usr/bin/php8.3   83        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1

删除替代方案

用 remove 去掉编辑器组中的微替代品:

update-alternatives --remove editor /usr/bin/micro

可以直接使用下面的全部清除:

update-alternatives --remove-all java

解决 apt-get update 从 packages.sury.org 更新 apache2 与 php 时签名无效的错误

apt-get update 显示错误,从 packages.sury.org 更新 apache2 与 php 时签名无效,如下显示:

错误:6 https://packages.sury.org/apache2 bookworm InRelease
  下列签名无效: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>

错误:7 https://packages.sury.org/php bookworm InRelease
  下列签名无效: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>

------------------------------------------------------------------

Err:6 https://packages.sury.org/apache2 bookworm InRelease
The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

Err:7 https://packages.sury.org/php bookworm InRelease
The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。GPG 错误:https://packages.sury.org/apache2 bookworm InRelease: 下列签名无效: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。GPG 错误:https://packages.sury.org/php bookworm InRelease: 下列签名无效: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: 无法下载 https://packages.sury.org/apache2/dists/bookworm/InRelease 下列签名无效: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: 无法下载 https://packages.sury.org/php/dists/bookworm/InRelease 下列签名无效: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。

————————————————————————————————–

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://packages.sury.org/apache2 bookworm InRelease: The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://packages.sury.org/php bookworm InRelease: The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: Failed to fetch https://packages.sury.org/apache2/dists/bookworm/InRelease The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: Failed to fetch https://packages.sury.org/php/dists/bookworm/InRelease The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key deb@sury.org

W: Some index files failed to download. They have been ignored, or old ones used instead.

解决办法:

参考 packages.sury.org 站点 README.txt 文件的脚本。

apache2 https://packages.sury.org/apache2/README.txt
php https://packages.sury.org/php/README.txt

apache2

apt-get update
apt-get -y install lsb-release ca-certificates curl
curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
dpkg -i /tmp/debsuryorg-archive-keyring.deb
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-apache2.gpg] https://packages.sury.org/apache2/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/apache2.list'
apt-get update

php

apt-get update
apt-get -y install lsb-release ca-certificates curl
curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
dpkg -i /tmp/debsuryorg-archive-keyring.deb
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
apt-get update

【END】