封禁DNS根服务器能否让一个国家在网络中消失?

        互联网是美国人发明的,跟服务器也在美国,那么老美有没有能力通过跟服务器封禁一个国家的网络呢?咱们就从技术上来分析一下,通过封禁根服务器,能不能实现将一个国家从互联网消失。

要回答这个问题,需要了解一些互联网工作的基本常识。

我们平时上网,其本质就是用你手里的客户端软件(比如微博、抖音、微信、浏览器等等)去访问它们背后的服务器(微博服务器、抖音服务器、微信服务器、其他网站的服务器等等),请求数据然后呈现给你。

那如何访问呢?

这些服务器都有属于它们的IP地址,这是一个在互联网中使用的身份标识号码,凭借这个数字,我们手机和电脑发出的网络数据包就能被网络中的“快递系统”不断转发,最终投递到目标服务器。

但这些号码数字对我们人类来说没那么好记忆,所以,人们发明了域名这个东西。

www.baidu.com,这就是百度的域名。

这个东西可比数字好记多了!

但互联网的协议是用IP地址进行身份识别的,现在搞了这么个域名,怎么用起来呢?

计算机科学家们又搞了一个翻译系统出来:域名解析系统DNS

在访问真正的服务器之前,先通过这个解析系统,把这个域名“翻译”成对应的IP地址,拿到这个IP地址后,再去进行后面的网络访问。

当然,这个过程都被现在的软件自动化的进行了,比如你在浏览器里输入www.baidu.com之后按下回车,浏览器自动完成了这个解析的过程,这对我们普通的用户来说是透明的(看不见的)。

那么问题来了,这个负责域名解析的东西是什么样的?

它是一台服务器吗?它位于哪个地方呢?

首先,它不是一台服务器,万一崩了,那全世界都上不了网了。

其次,它也不是一个简单的多点集群,全世界的网站这么多,每个节点要存储所有的域名——IP映射关系,那也是不切实际的。

事实上,真正的域名解析系统它是一个分层级的庞大系统。

  • 本地DNS服务器

  • 权威域名服务器

  • 顶级域名服务器

  • 根域名服务器

我们每个电脑和手机里面都设置了本地DNS服务器(简称LDNS),需要解析域名的时候,就向LDNS发出请求。

大家可以在自己的电脑上执行nslookupipconfig命令,查看自己电脑上配置的DNS服务器地址是什么:

我们以www.example.com这个域名为例,来看一下DNS的解析过程。

  • 你的电脑问LDNS:www.example.com的IP是什么?

  • LDNS:查无此域名,问一下根服务器看看:www.example.com的IP是什么?

  • 根服务器:我可是十三大长老,哪管这些。你去问负责.com域名解析的顶级域名服务器吧,它肯定知道。

  • LDNS问.com顶级域名服务器:大佬,www.example.com的IP是什么?

  • .com顶级域名服务器:这我也不知道,你问问ns.example.com看看,它负责解析所有example.com下面的域名。

  • LDNS问ns.example.com:大佬,www.example.com的IP是什么?

  • ns.example.com:这我知道,是xxx.xxx.xx.xxx

  • LDNS:谢谢大佬

  • LDNS回复你的电脑:查到了,是xxx.xxx.xx.xxx,可累死我了···

整个过程大概是下面这图所示,不过需要说明的是,并不是每一次DNS请求都会经历这样的过程,有些时候中间节点有缓存,路径就会变得不一样了。

由此可见,根域名解析服务器在整个过程中扮演的角色至关重要。

那么,问题又来了,全世界有多少根DNS?

答案是13个,其中10个在美国,英国和瑞典各1个,日本1个。

这13个根的名字和IP在这里可以公开查阅:

https://www.internic.net/domain/named.root

他们的名字从A.root-servers.netM.root-servers.net

其中,A开头那个是主根,其他12个(B、C、D、E、F、G、H、I、J、K、L、M)是辅根。

由于技术上的历史原因,根服务器只有13个,想知道具体原因的朋友,可以看看这篇文章:

为何根域名服务器只有13个?

但是需要注意的是,这里说的13个,并非真的只有13台物理机器,全球的互联网如果都只靠这十三台计算机维系,那风险还是很大的。

在逻辑上,根确实只有13个,但每个根都有镜像啊!

所以,根服务器实际上总共有1518个(截止2022-02-27)之多,在下面这个网站,你可以看到全球所有的根服务器分布情况:

https://root-servers.org/

从A到M,每一个根服务器背后都有许多镜像节点,分布在全球不同的地方。

下面是我们中国所拥有的根镜像服务器:

单是北京,就拥有8个节点。

再次注意,根服务器的IP只有13个,但是却有一千多个物理服务器节点。

那这是怎么办到的呢?这里用到了一个叫“任播”的网络技术。简单理解就是:可以让世界上不同的多台计算机,拥有同一个IP地址

注意,这里的IP地址是公网地址,如果是私有地址那没啥讨论的。

小伙伴儿们可能一脸问号了,具体在网络路由的时候,具体选择哪一台计算机呢?

这个问题说来话长,也不是今天的重点,感兴趣的同学可以看看这个:

https://docs.microsoft.com/zh-cn/windows-server/networking/dns/deploy/anycast

我国境内发出的对根DNS的请求,基本上都由国内的镜像完成了,并没有路由到国外的根服务器上去。

注意这一点,非常重要!

这么多台根服务器,它们是如何协同工作的呢?

简单来说:所有的辅根从主根同步数据,而所有的镜像从对应的根服务器来同步数据。

按照这个逻辑,A根就是超级大boss,只要它改了,其他一千多个节点都得跟着改。

那么,如果某一天美国把A根中关于.cn的相关信息全部删掉,那全世界的根服务器都会跟着删掉,那中国将从互联网消失吗?

这个时候,建设自主可控的根镜像服务器的重要性就体现出来了。

服务器在我这儿,我不同步删除的内容,或者同步完加上删除的内容,就能破解这个问题!

因为前面交代了,国内对根DNS的请求,基本都是国内镜像完成的,并没有路由出去。

当然,其他国家的根镜像我们控制不了,他们可能无法访问.cn的域名,但只要他们想要访问,就会加回去,并拒绝同步美国删除的内容,如此一来,最后只有美国人自己访问不了.cn的域名。

同样的道理也适用于俄罗斯,在root-servers网站上,也可以看到俄罗斯同样建设了许多的根镜像服务器,比如首都莫斯科:

他们同样可以拒绝同步删除俄罗斯的国家域名.ru的解析信息。

所以,想通过封禁根域名解析服务让一个国家从互联网消失,没那么容易。

但如果是一个没有建设根镜像服务器的国家呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,用于获取手机的唯一标识ID(IMEI)并将其记录在数据库,同时提供封禁功能: ```python import sqlite3 from flask import Flask, request, jsonify app = Flask(__name__) DATABASE = 'phones.db' def get_db(): db = sqlite3.connect(DATABASE) db.execute('CREATE TABLE IF NOT EXISTS phones (id INTEGER PRIMARY KEY AUTOINCREMENT, imei TEXT UNIQUE, banned INTEGER DEFAULT 0)') db.commit() return db @app.route('/phones', methods=['POST']) def add_phone(): imei = request.json['imei'] db = get_db() try: db.execute('INSERT INTO phones (imei) VALUES (?)', (imei,)) db.commit() return jsonify({'message': 'Phone added successfully'}) except sqlite3.IntegrityError: return jsonify({'error': 'Phone already exists'}) @app.route('/phones/ban', methods=['POST']) def ban_phone(): imei = request.json['imei'] db = get_db() db.execute('UPDATE phones SET banned = 1 WHERE imei = ?', (imei,)) db.commit() return jsonify({'message': 'Phone banned successfully'}) @app.route('/phones', methods=['GET']) def get_phones(): db = get_db() phones = db.execute('SELECT imei, banned FROM phones').fetchall() result = [] for phone in phones: result.append({'imei': phone[0], 'banned': bool(phone[1])}) return jsonify(result) if __name__ == '__main__': app.run(debug=True) ``` 这个示例使用了Flask框架和SQLite数据库来实现手机唯一标识ID的记录和封禁功能。代码定义了以下路由: - `POST /phones`:添加手机的唯一标识ID到数据库。 - `POST /phones/ban`:将指定的手机标识ID封禁。 - `GET /phones`:获取所有手机标识ID及其封禁状态。 您需要在运行代码之前安装Flask和SQLite库,可以使用`pip install flask sqlite3`命令进行安装。 请注意,此示例仅为演示目的,实际应用可能需要更多的验证、身份验证和安全性措施。在生产环境,您可能需要使用更安全的数据库和身份验证方式来保护数据和功能。 还请注意,在某些国家/地区,获取手机的唯一标识ID(如IMEI)可能受到法律限制。在开发时,请确保遵守当地法律和隐私政策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值