OWSS (OpenWrt + ShadowSocks) FQ完全手册 (基础知识)

本文所写的环境基于 NETGEAR WNDR3800 路由器和 OpenWrt Barrier Breaker 14.07 ,其中 ShadowSocks-libev-polarssl 版本为 1.4.8-1

我原来使用的是PPTP的路由器翻墙方案,但是发现PPTP的不安全性(经常受到Q的各种干扰)和其设计缺陷,导致网速特别慢,于是便改用L2TP,但是L2TP现在也已经不安全,并且容易掉线(怀疑是受到了Q的丢包导致),于是变想到了 ShadowSocks 的高并发及多线程和不需要长连接的特性,于是便在路由器上准备采用 OpenWrt + ShadowSocks 的 FQ方案,下面就开始正文吧。

先来介绍一下网络相关的基础知识吧..

你的上网过程

我需要在这里把你的上网过程先描述一遍,以打开一个网页 (例如 google.com) 为例子,这中间可能涉及到很多你不了解的专业术语,但没关系,这些我们都会在后面慢慢解释。

你的上网过程

你的上网过程

1. 在你打开浏览器之后,在地址栏输入 “https://www.google.com/nexus/” 这个地址
2. 浏览器会自动先识别出这是位于域名 www.google.com 下的一个页面,需要访问google.com 这个域名对应的服务器
3. 接着,浏览器会调用相应的的操作系统的 API 去解析这个域名,然后你的 Windows 系统会向电脑连着的路由发送解析请求
4. 路由器上如果之前有个域名的解析结果,并保留在了缓存里,就可以直接返回解析结果了
5. 如果路由器没有关于这个域名的缓存,那路由就会向之前在路由器里设置好的 DNS 服务器请求解析这个域名
6. 一般的 DNS 服务器会经过一个递归解析过程,把解析到的google.com 的 IP 返回给路由,路由再返回给你的电脑
7. 最后,你的电脑就可以通过 IP 地址,直接访问google.com 的服务器了,然后向服务器的 443 端口请求 “https://www.google.com/nexus/” 这个地址的内容
8. 如果网络通畅的话, google.com 的服务器在收到请求后就会把结果返回给你的电脑,网页就打开了。
专业词汇太多看不懂?OK,一个个解释。

 

什么是 IP

我想这是困住很多人的第一个问题,我觉得你们知道 google 是什么的可能性都比这个高。IP准确的说是 IP 地址, 解释过来就是 Internet Protocol Address, Internet 协议地址。你可以把它假想成各家各户的门牌号, 你要找一个地址, 最靠谱的方法就是知道准确的门牌号。IP 地址又分为公网地址和内网地址两种, 这个怎么理解呢? 你可以认为长安街 1 号这种地址是公网地址, 因为这是所有人都可以走的公共道路, 人人都可以到达这里。而长安街 1 号里面, “2 号楼 3F302” 这个地址就是内网地址了,因为那是别人的私有领地,你可以通过长安街到他小区门口,但未必可以进入这个小区,因为门卫大多数情况下会不让你进入的。但小区的人却完全可以出来到道路上的任何地方, 就是说,内网地址大多数情况下是可以随意访问公网地址的,而公网地址要访问内网地址却需要路由器的转发或者映射。

实用点说的话, 你通过 ADSL 拨号, 光纤猫接入, 这些方法分配到的 IP 一般都是公网 IP, 直接接在电脑上, 别人通过这个 IP 可以访问到你的电脑了。但是一般你都会在猫后面接个路由, 然后分配出一些类似 192.168.1.XXX 的地址, 你的电脑上往往是通过这些地址接入互联网的, 这些都是内网 IP, 隔着路由别人是无法直接访问到你的电脑的, 因为这个内网地址对外面的人来说根本不可见。

内网地址的范围是有规范的, 而公网地址绝对不能使用这些地址, 范围如下:

1. 10.0.0.0/8: 10.0.0.0∼10.255.255.255
2. 172.16.0.0/12: 172.16.0.0∼172.31.255.255
3. 192.168.0.0/16: 192.168.0.0∼192.168.255.255
4. 100.64.0.0/10 : 100.64.0.0 ∼100.127.255.255

上面的表格中,右边的表示也许比较直观,而左边用的掩码表示方法看起来有点费解,但这却是实际网络应用中最常用的格式。首先我们要知道,一个 IP 地址是计算机中的一个 32 位的 2 进制数,分成 4段,每段 8 位,所以你看到 IP 地址每段的最大值是 255,但实际上 255 是用于表示广播地址不会分配给任何主机的,而 0 是用于表示整个网络号的,也不会分配给主机,所以一般你路由能分配的 IP 最后一段肯定是 1∼254(在 DHCP 3 支持的情况下)。

一个 IP 地址看起来是 4 段,其实是两个部分,分别是网络号和主机号,按网络号范围的不同,IP 地址分为 ABCDE5 类,DE 类为特殊地址类我们不考虑,现在看看 A 类地址是怎么定义的:
A 类地址的网络号由一段 (8 位) 数字表示, 网络地址最高位必须是 0, 所以 A 类地址有 2 7 − 2(126) 个网段; 剩下的 3 段 (24 位) 表示主机号, 每个网段有 224 到 16777214个主机。类似的可以知道 B 类和 C 类地址的计算方法, 如果还不清楚可以去参考百度百科的相关页面。

大概知道了 IP 的格式和分类,掩码表示法要怎么理解呢? 我们看一下 “172.16.0.0/12” 的解释过程

1. 我们说了 0 表示网络号,准确的说应该是 0 提示网络号,前面的 172.16 就是网络号,这段是固定的值
2. 最后的 12 表示采用的是 12 位掩码。这个掩码是什么意思?
3. 12 位掩码表示 IP 地址的高 12 位和 1 进行与 (AND) 操作 (也就是不变), 剩下低 20 位的空间和 0 进行与操作, 清空出来分配 IP。
4. 也就是说,从 172.16.0.0 开始,分配 2 20 个 IP 地址,算一下你就知道刚好到了 172.31.255.255
5. 我们说了 0 和 255 分别表示网络号和广播地址,是不能分配给具体设备的,所以实际可用范围是两者中间的值。

以上是关于 IPV4 体系下的 IP 地址的介绍,也是我们现在基本都在用的体系。但是你可能也看到了,IPV4 体系下 IP 地址的范围非常有限 (理论值也就是 30 多亿),加上一些大型企业和机构占用大量地址, 全球的 IPV4 地址其实已经分配完毕 (不一定全部被使用了,但已经被分配完毕了)。所以就有了新的 IPV6体系,IPV6 体系下的 IP 格式大致如下:

2a03 :2880:2110: df07:face:b00c :0:1

可以看到 IPV6 地址高达 128 位,总数就是 2128个,这个数量已经绝对不需要担心耗尽的可能了。具体的关于 IPV6 的问题, 在我们的FQ过程中只有一小部分涉及到, 这里就不再讲更多了。

什么是端口

在讲上网过程的时候,我们提到了最后浏览器要访问的是 google.com 的服务器的 443 端口, 那么什么是端口呢? 专业上讲这是传输层的 TSAP 寻址方式,不过你肯定不满意这个解释。

我们知道一台电脑要联网的软件 (进程) 其实是很多的,这就需要给不同的软件分配不同的通道以区别他们的数据,否则所有的进程都在一条通道上收发数据,那么不同协议不同规范的数据毫无规则的混在在一起,就完全没有意义了,或者代价就是每个进程都要把所有数据都先截获下来,再慢慢提取出属于自己的那部分数据,这显然是不可能的。

那么端口就起了这样的作用,端口为不同的进程/协议分配了不同的端口,例如针对浏览器的 http 服务器协议是 80 端口, https 是 443 端口, ftp 数据传输是 21 端口, ssh 远程登录是 22 端口, telnet 是 23 端口, DNS 解析是 53 端口, 不同的协议使用不同的端口, 数据就很清晰了, 对于一个端口上的数据就肯定有一个统一的协议来解析了。这就好像紫禁城的 N 个城门, 每个门都有自己特殊的用途, 给不同的人和不同的车走一样, 这些门就是紫禁城的端口。

服务器常见的端口

服务器常见的端口

注意, 以上列出的标准端口都是针对服务器而言的, 因为很多通信协议默认都是使用这些标准端口, 你如果擅自改成别的端口, 客户端并不知晓, 就不知道该向哪里请求了。例如有些网站给自己的内部管理服务器改成了 8080 端口或者别的端口, 这样可以避免别人发现后台的地址 (其实别人要扫描端口也可以发现), 只有知道端口的人才能访问。按照规定 0∼1023 端口都是预留给特定协议的端口范围, 其他的应用和私有的协议不应该使用这个范围内的关口, 否则可能和现有的服务协议造成端口冲突。

端口的连接是双方的, 服务器有一个端口, 客户端要连接也必须有一个对应的端口。服务器的端口一般要固定, 以便让别人连接; 而在客户端这里, 就完全可以用各种不同的端口了, DNS 协议为了增强安全性, 客户端的端口甚至应该鼓励增强随机性, 最好每次都不同。好比皇帝出去祭天要走特定的门不能变, 可是要微服私访就得灵活一点了,不然行踪就容易暴露了。

什么是 DHCP

我们前面说了一个问题, 一般路由能分配的最后一段 IP 一般是 1∼254, 这是在 DHCP 允许的条件下, 那么 DHCP 是什么东西?

简单来说,DHCP 是一个自动分配 IP 的系统。例如你的电脑在不联网的时候是不会有任何 IP 的, 在接入一个路由器之后, 你可以自己手动设置 IP,但这很繁琐, 而且万一两个人设置了一样的 IP,就会导致网络冲突。所以普遍的做法是让路由自动分配 IP 给机器。

DHCP 的实现过程大概是这样的:

1. 你的电脑接入路由后,就向路由器下的整个网络 (所有主机和设备) 发送一个 DHCP Discover 请求, 查询看有没有 DHCP 服务器
2. 你的路由收到这个请求之后, 就反馈给你的电脑一个 DHCP Offer, 告诉它 “老子就是 DHCP 服务器”
3. 也许网络中还有别的也提供 DHCP 服务的主机 (这个情况一般比较少), 但一般来说你的电脑会选择响应最快的那个 Offer, 然后发送一个 DHCP Request 请求给他。
4. 路由收到这个 DHCP Request 之后, 就会开始和主机进行一些列握手协议, 然后发送相应的 IP 配置给他。

其实呢,DHCP 不光是分配 IP 的,他同时还会分配 DNS 服务器,网关地址这些东西给你。所以你看一个网卡的 IPV4 或者 IPV6 协议属性的时候,IP 和 DNS 都是可以自动获取的,这就是通过 DHCP 实现的。

什么是域名

你可能也看到了, IP 地址其实是很难记忆的一个东西, 30 多亿的地址对人类的记忆来说根本就是开玩笑。如果你要访问一台服务器, 难道还先打个电话去问他们 IP 是什么吗? 当然不可能,所以就有了域名? 没这么快,首先有的是 HOST 系统。

对 于 windows 用 户 来 说, c:/windows/system32/etc/drivers/hosts 文 件 里 一 般 只 有 一 行 内 容, 就 是“127.0.0.1 localhost”。这个是告诉计算机,当访问 localhost 这个名称的主机的时候,实际就是要访问127.0.0.1,也就是计算机的本机 IP(访问自己)。类似的,你可以把 “192.168.1.105 mailserver” 写入 host 文件,这样就告诉了计算机,邮件服务器 mailserver 的 IP 是 192.168.1.105,这样人类的记忆就稍微轻松了一些。

可是随着互联网的发展,很快人们就发现 hosts 文件根本就不够用,而且很多主机你更根本不知道他的存在,或者哪台服务器换了 IP 也没通知别人,旧的 host 文件就一直让你去访问错误的 IP 了。终于,域名系统出现了。

基本概念上你可以把域名和 Host 文件等效起来理解,但是域名是一个多级系统,它有着不同的域。例如 mail.google.com 表示 google.com 这个域下面的一台叫 mail 的主机,这样一个域就可以有了很多主机记录,这些主机记录我们可以叫做 google.com 这个父域的子域。而 google.com 其实也是 com 这个父域下面的一个子域。你不知道的可能是 com 的完整写法应该是 “com.”,表示 com 是 “.” 这个父域下的一个子域。这个 “.” 就是我们称之为根域的东西, .net, .org, .cn 这些顶级域名域其实都是根域的子域。

就像你用文件搜索器查找一个文件一样,它除了告诉你文件在哪里,一般还会告诉你文件的大小,最近的修改日期,文件的所有者等等。同样的,一个域名中往往包含了很多条记录,我们常用的几个记录有:

1. A 记录,告诉你这个域名对应的 IPV4 IP 地址
2. AAAA 记录,对应的是域名的 IPV6 IP 地址 (当然,目前很多域名并没有 IPV6 地址)
3. NS 记录,告诉你这个域名的名称服务器
4. CNAME 记 录,也 叫 别 名 记 录。这 个 记 录 是 把 一 个 域 名 指 向 另 一 个 域 名,例 如 给 wcan.in

设 置 一 个 abc.wcan.in 的 CNAME 记 录, 把 这 个 记 录 设 置 为 www.wcan.in, 那么 DNS 解析 abc.wcan.in 实际上就是解析 www.wcan.in 。

上面提到了一个 Name Server 名称服务器 (以后简称 NS) 的概念,这个 NS,就是负责设置一个域名几乎全部记录的服务器,并且在别人查询的时候把这些记录告诉别人,就像一个传达室大爷。例如他可以设置 A 记录为 8.8.8.8,这样就把域名指向了 8.8.8.8 这个 IP 上的服务器 (服务器鸟不鸟它就是另一个问题了)。

为什么说是几乎全部记录, 而不是全部呢? 因为NS记录他设置不了, 相反的, NS记录设置了他。这个NS记录一般只有在域名的注册商那里才可以设置, 就好像传达室大爷可以负责告诉你哪个教室美女多教务处在哪里, 但谁当传达室大爷那是村长校长说了算的。而且 NS 记录会同时存放在更高一级域的 NS 服务器中, 例如 wcan.in 的 NS 记录会存放在 in 域的 NS 服务器上,否则一但 wcan.in 的 NS 服务器自己都挂了, 你去哪里查 NS 记录呢? 查不到 NS 记录就找不到 NS 服务器, 那又怎么查域名的其他记录呢?
除了多级域概念之外,域名系统最重要的一点是不需要人们自己去记录这些域名对应什么 IP,而是通过 DNS 系统去查询。就好像你打开 windows 的文件搜索,通过文件名就可以查到一个文件的所在位置一样。那么下一节的标题你也猜到了。

什么是 DNS

这是我们FQ过程中涉及到的一个非常重要的问题,这里只做基本介绍,具体的很多内容后面会展开。本书中发起最初 DNS 解析请求的设备或软件,我们统称为 DNS 解析器,例如电脑就是一个解析器。
我们说了,想要知道一个域名对应的 IP,就要向 DNS 服务器查询。DNS 就是 Domain Name Server 的简称 (域名称服务器),你们熟知的 Google DNS(8.8.8.8) 和114DNS(114.114.114.114) 就是这类服务器。我们还是用一个流程例子来描述 DNS 的工作方式 (这里以递归 DNS 方式准)

1. 你的浏览器调用 windows 的相关函数接口,让 windows 发出了解析 twitter.com 的请求
2. 这个请求先发送到了你的路由器,但路由器没有关于 twitter.com 的记录缓存,就继续向路由器上设定的 DNS(假设是 8.8.8.8) 请求解析这个域名
3. 8.8.8.8 收到解析请求,发现他也没有这个域名的记录 (虽然现实中不太可能),他就会向根域 (也就是“.” 域) 的 NS 服务器查询
4. 根域的 NS 服务器说, “我不知道,不过 com 域的 NS 服务器知道,这是 com 域的 NS 服务器地址 (例如是 2.2.2.2),你去问他”
5. 然后 8.8.8.8 就向 com 域的 NS 服务器 2.2.2.2 发出解析请求,2.2.2.2 说 “妈蛋,我也不知道,不过我知道 twitter.com 的 NS 是啥 (3.3.3.3),你去问他吧”
6. 8.8.8.8 灰溜溜的跑去问 3.3.3.3,这是 twitter.com 的 NS,当然知道 twitter.com 的 IP 是什么,终于大喊一声 “你咋才来啊!” 然后告诉了它 twitter.com 的 IP。
7. 然后 8.8.8.8 告诉路由,路由告诉你的电脑,windows 告诉浏览器,不出意外的话,你还是没打开twitter.com(谁让你生在中国!)

DNS 递归解析过程

DNS 递归解析过程

上面这个递归解析方式,是目前最常见的 DNS 服务器工作方式,大部分工作都由 DNS 服务器完成。还有一种很蛋疼的解析方式叫做迭代解析,那么这个过程有什么不同呢?

1. 你的浏览器调用 windows 的相关函数接口,让 windows 发出了解析 twitter.com 的请求
2. 这个请求先发送到了你的路由器,但路由器没有关于 twitter.com 的记录缓存,就继续向路由器上设定的 DNS(假设是 8.8.8.8) 请求解析这个域名
3. 8.8.8.8 收到解析请求,发现他也没有这个域名的记录,然后蛋疼的过程开始了
4. 8.8.8.8 说 “那个啥,地址我不知道,这个是根域名称服务器的地址,你自己那个啥吧。。。。”
5. 然后你就得自己把上面 8.8.8.8 干的那些活,那一次次被人戏弄的过程自己重复一遍,直到查到 IP 为止

怎么样,这活挺好干吧,返回个根域的名称服务器地址就行了,这样的 DNS 服务器到底有啥用? 我觉得没啥用,因为根服务器就那几台,我还需要你来告诉我? 所以基本已经没几个 DNS 服务器是迭代查询了,基本都是递归解析。

什么是 TCP 和 UDP

哎呀,怎么忽然跳到这么专业的两个词汇上了? 好吧,这可能是今天最后两个概念了,你先忍忍吧,我尽量用不专业的语句描述 (太专业的我也不会啊)。TCP 和 UDP 都是网络传输层的概念,是两种机制不同的传输协议,他们的主要区别是 TCP 是面向连接的,而 UDP 是无连接的,怎么理解呢?

比如你要从上海送一件东西到北京,你可以先打个电话过去通知北京那边的接收人,告诉他我现在要寄东西过去了,北京那边也会给你一个响应,告诉你他知道你要开始寄送了。打电话这个事情本身首先就在收发双方同步了一个寄东西的时间,如果打完电话后 3 天东西都没到,那么双方通过电话一确认就可以知道这中间出问题了,应该重新发送,如果收到了,北京那边可以给你一个回复告诉你收到了。因为双方有电话这个连接的存在,就可以对寄送包裹的信息和结果作确认,所以几乎可以肯定的保证要寄送的东西一定会到达,现实世界有些东西丢了就没了,而数字世界数据丢了重发的成本是极低的。这种有电话这个沟通方式作为连接的传输协议,就类似 TCP。

而 UDP 就简单多了,事先不需要电话联系,直接写个地址就把东西送过去了,这中间如果东西丢了,双方也没有什么方法来确认,只能看快递公司的良心了。那你也许会问为什么要用 UDP 这种看起来靠天吃饭的协议?一个包裹一次电话你也许觉得没什么,如果一千个包裹呢?一万个呢?如果送一个包括要两天,而这个电话本身打通的时间都要 3 个小时呢,如果电话每分钟 5 美元话费呢?

所以,如果要寄送的东西并不是那么贵重必须保证准确到达,而快递公司毕竟也没有不靠谱到 10 个包丢 8 个的地步,这个电话连接过程就显得有些影响效率了。就好像一家卖袜子的淘宝店一天如果要发1000 件货,一双袜子 1 块 9 毛 9 包邮。他才不会每件发货前都跟你打电话通知一下,到货了再跟你电话确认一下东西到了没;他只负责把货发出去,剩下送货和确认收货就不管了,真要管的话打个电话可能就要赔钱了。

这里我们归纳一下 TCP 和 UDP 的区别:

特点

TCP UDP

可靠性

面向连接,高

无连接,低

按序传输 按先后顺序到达

随机

实现难度 需要进行数据重组恢复,复杂

不在乎顺序,简单

传输单位

数据流 (水管)

数据包 (包裹)

应用范围 HTTP,FTP,MAIL

DNS,TFTP,VOIP

好了,基础知识到这里就结束了

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据