史上最通俗易懂的OpenWrt翻墙路由器解释

什么是域名和IP地址

每个网站都可以有两个唯一标识:域名和IP地址。域名相当于人的名字,IP地址相当于该人使用的电话号码。(不同之处:域名是唯一的,人的名字会有重名)

网站为什么要有两个标识?域名是为了方便人类记忆的,比如YouTube.com,而电脑处理却喜欢处理数字,纯数字格式的IP地址就是为了让电脑查找计算方便些

通过域名查询IP的那些事情

我们在浏览器地址栏里输入 www.youtube.com 并回车,到底会发生哪些不可思议的事情呢:

  • 浏览器问就近的某台电脑(叫域名服务器):Hi, youtube.com的IP地址是什么?
  • 域名服务器:不就是 74.125.239.98
  • 浏览器:谢谢。我就到你给我的地址去找内容了

还有种情况,浏览器第一次问的域名服务器不知道某域名的IP地址:

  • 浏览器问就近的域名服务器:Hi, youtube.com的IP地址是什么?
  • 域名服务器:这个我不知道哇,我帮你问问我的上线
  • 上线服务器:我也不知道哇,我也只好问我的上线,等等,别挂掉
  • 某域名服务器:这么简单还来问我,不就是 74.125.239.98
  • 浏览器:谢谢。我就到你给我的地址 74.125.239.98 去找内容

白脸很忙,不看YouTube(看不懂?)

在中国,YouTube为什么被封?YouTube有几千万,上亿个视频,如果某几个视频让某些人看了不爽,就来个宁可错杀百万,不可放过一个,把整个YouTube给封了,全国人民都无法正常访问YouTube了

这个时候,又发生了哪些不可告人的事情呢?

  1. 浏览器问就近的域名服务器:喂, youtube.com的IP地址是什么?
  2. 中国的某域名服务器:这我知道,44.44.44.44,(心里嘀咕,我给你的是太平洋海底的地址,你能找到内容才怪呢,白脸(领导)很忙,天朝很好,访问这种破网站干啥,满屏洋文,我怎么看得懂,哼)
  3. 浏览器:谢谢。我这就去找主人需要的内容。。。找了好久,还是什么也没找到,我的命怎么这么苦。。

阳光底下,每时每刻每秒,这样龌龊的事情在发生千次,万次,亿次...

深刻理解 TCP UPD 通信协议

UDP是什么意思

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17 UDP协议全称是用户数据报协议[1] ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议 与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据

缺点就是优点,UDP通信效更高

既然 UDP 数据发送之后,是无法得知其是否安全完整到达的,那么为什么 在 shodowsocks 中还要用 UDP 呢?不用校验数据是否完整,数据传递的速度自然更快。所以在游戏界,基于 UDP 协议的网络通信又被称作高性能网络。联机游戏要在服务端和客户端之间传递大量数据,对通信要效率要很求很高,因此多用 UDP

UDP的数据可能不完整,这限制了 UDP 协议的用途,更多的地方用的是 TCP 协议。但是也有例外,QQ 就是采用 UDP 协议通信的。一般来说即时通信适合用 TCP,腾讯在 UDP 的基础上进行了高度的封装、优化,使之一定程度兼具 TCP UDP 两者的优点

UDP 最常见的用途是 DNS 查询。我们打开一个网页,会有多次的 DNS 查询动作,在进行 DNS 查询的时候,通信流量默认就是走 UDP 协议。DNS 规范中包含了 TCP 协议,但是 TCP 只是一种备选方案,很多公共 DNS 查询提供商并不提供 TCP 查询的接口

Shadowsocks 是一个优秀的 Socks 代理工具,在很长的一段时间里它仅支持 TCP 代理,后来在 Shadowsocks-libev 上实现了 UDP 转发的功能,然后我们才能在 shadowsocks 客户端把 DNS 查询请求转发到 shadowsocks 服务端,由服务端把查询到的数据返回到客户端,这就避免了 GFW 的域名污染

shadowsocks 如果使用 TCP 协议转发域名查询请求到服务端,客户端和服务端的通信会被 GFW 直接重置

太阳要升起,网民要雄起

但是,还有问题没有解决:

网站有两种,国内的和国外的。如果不分国内国外全部都到国外去查询域名的IP,访问国内的网站就会变慢。虽然有心逃离,还是无法割断哪

有几种解决方案:

  1. 建国外重要网站名单,简称外单(黑名单,gfwlist),外单上的域名都到国外去查询IP,其他就在国内查询

    如果IP地址在外单上,就加密访问,领导不知道我访问了这个地址,这样领导的心情可能会好些

  2. 同样是建立外单。不同的是,我不想花费精力去区分某个IP是不是在外单上,IP地址可能经常在变,这样做不怕累吗。我的办法是,不是中国的IP,全部加密访问

  3. 每个人的用途不同,谁有本事建立通用的外单?

    即使有人建立了包含很多域名的外单,网站内容往往是互相引用的,某外单上网站引用了不在外单上的被封网站,导致打网站贼慢,这个该怎么办?难道要手动查看网页源代码,一个个地搜索查找,逐个测试?

    最简单有交的方法,是给国内重要网站建立名单,简称内单。内单上的网站都在国内dns,其他网站全部到国外dns。访问非中国的IP都流量加密

我曾经用过第一种方案,试图用网友整理的外单(ChinaDNS),但是,在实际使用过程中,经常需要临时增加外单域名并重启路由器,有时一天要重复好多次,不胜其烦.

第三种方案,就是本教程使用的方案,是目前来说比较好的方案

OpenWrt翻墙路由器内部发生的故事(千万别告诉白脸)

  1. 浏览器:喂,谁知道YouTube.com的IP,主人要用
  2. 路由器:稍等,我查下主人设置的内单,稍等。。。不在内单,我通过秘密通道查
  3. 浏览器:喂,告诉我baidu.com的IP
  4. 路由器:哇,内单,马上就给你
  5. 浏览器:请给我IP地址60.188.5.6的内容
  6. 路由器:等下,立即就好。。。中国IP,该那就那去取内容。不是中国IP,借道主人的秘密通道去取内容

相关资源: