OWSS (OpenWrt + ShadowSocks) FQ完全手册 (Linux工具)

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

上一节我们介绍了你的GFW的工作原理,那么我们该如何对这些进行破解或者说是过滤呢?嘿嘿,不要那么急,我们先来说一些Linux的几个网络相关的工具

Table

首先我们这里要先建立一个 table 概念,你可以认为 table 是一个网络访问请求 (数据流) 的容器。一般情况下,我们可以把符合一定特征的网络访问请求 (数据流) 都收集到一个 table 中,这样当我们需要对有这一类特征的网络访问请求进行处理时,就可以直接操作这个 table 了,而不需要一条一条的去处理。在 linux 操作系统中,table 就是一个 0 到 255 的数字,当然我们也可以在 “/etc/iproute2/rt_tables” 文件中给 table 数字对应上一个名称,然后就可以用这个名称来操作这个 table 了。例如我们的 OpenWRT 系统里的 rt_tables 文件默认是这样的:

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1    inr.ruhep

local,main,default,unspec 这些都是系统内建的 ip table,可以看到他们分别都对应了一个数字,你操作 table 254 和操作 table main 其实是完全一样的。我们也可以修改这个文件,建立一个自己的 table , 例如我们可以建立一个 ID 为 10,名字叫 gfw 的 table。如果我们想要在访问被封锁网站的时候通过 ShadowSocks 接口出去, 那我们就可以先把被封锁的网站加入一个 table 中然后再指定这个 table 中的所有网站转发到 ShadowSocks 接口去,可是转发是基于IP的,那么如何转发它呢?继续往下看…

ipset

ipset 和前面讲的 table 有点像,但更好理解,它就是一个存储了 IP 值的数组( 它最大可以存储 65535 个 IP 地址 ), 一般以内存变量的形式驻留在系统内存中,一重启就会消失。我们有了它之后我们可以把我们前面在 table 中加入的网站解析的 ip 统统加入我们创建的 ipset 中去,这样我们只需要转发整个 ipset 中的 ip 即可,下面介绍一些 ipset 的简单方法

#建立一个名叫 VPN 的 iphash 类型的 ipset,我们可以 ipset 的 create 命令:
ipset create vpn iphash -exist
#-exist表示如果这个叫这个名字的 ipset 已经存在了,就跳过不建立了。

#如果要把一个 IP(例如 8.8.8.8) 加入一个 IPSET(例如刚刚建立的 vpn set),那就是:
ipset add vpn 8.8.8.8

#如果要删除,把 add 改成 del 就行了
ipset del vpn 8.8.8.8

#如果我们要清空整个 ipset, 就用 flush 选项:
ipset flush vpn

#如果我们要测试一个 IP(还是 8.8.8.8) 在不在 IPSET(还是 vpn set) 里,就用 test 选项:
ipset test vpn 8.8.8.8

 

IPTables 防火墙

介绍完ipset,我们来了解下 iptable,netfilter 是 linux 内核的一个模块,这个模块当于 linux 系统的防火墙,它会对所有进出 linux 系统的网路数据进行管理, netfilter 防火墙模块的结构如下图所示:

netfilter防火墙结构

IPTables(netfilter)防火墙结构

我们可以看到橘红色框框住的部分就是 iptables 的几个 “链”,分别是 PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING, 大致讲一下这几个链的工作流程。当一个数据通过网络接口进入系统之后,首先进入 PREROUTING 链进行处理。PREROUTING 链中根据对数据的不同处理, 分别把处理方法写在 mangle 表和 nat 表中, mangle 表一般用于对数据添加标签方便后面的链处理, nat 表一般是进行网络地址转换和转发的动作。

在经过两道 PREROUTING 链处理之后,数据会根据需求分别交给 INPUT 和 FORWARD 链处理。INPUT 链再经过打标签,过滤等动作后,再把数据交给上层应用的协议栈去处理。例如我们可以在INPUT 链末端把数据交给我们写的一个应用,在应用中分析和提取数据,当应用处理过数据之后,就要把数据返还到 OUTPUT 链,OUTPUT 链再经过一次 NAT 表看是否要转址 (只是要经过,不一定真的会发生转址操作), 然后交给 POSTROUTING 链。

FORWARD 链一般只是经过 filter 表的过滤筛选就会把数据交给 POSTROUTING 链,从 OUTPUT 链过来的数据和从 FORWARD 链过来的数据经过 POSTROUTING 链处理后就交给了后面的输出设备了。netfilter 是 linux 内核模块的名称,可是用户要如何操作这个模块,给防火墙添加和修改规则呢? 这里用到的就是 iptables, netfilter 才是防火墙的实体, iptables 是这个实体的管理工具。因为二者的结合非常紧密, 所以我们一般都习惯性的称之为 iptables 防火墙。完整的 iptables 命令说明, 请参考 iptables 的 manpageextention man page。关于 netfilter 各个扩展模块的功能说明, 可以参考 OpenWrt 网站上的这个页面

Dnsmasq 解析器

Dnsmasq 是 OpenWRT 系统默认内置的 DNS 解析器,要注意这个解析器不等同于 nslookup 和 dig,后面的只是调试工具,除了返回一些查询信息外不能给任何系统和应用提供解析结果,而 Dnsmasq 可以。

我们需要对 Dnsmasq 的性质有个基本认识,Dnsmasq 并不能算是一个 DNS 服务器软件,他的准确定义是一个 DNS 转发器。就是说,它把收到的 DNS 解析请求,转发到一些 DNS 服务器上去,然后从 DNS服务器接收返回的结果,最后再返回给你? 你也许会觉得这玩意这么蛋疼,我自己查询不好吗,干嘛要你来转发? 其实它能做的不仅仅是转发,转发仅仅是他实现 DNS 查询的方式,我们知道它即不能递归查询,又不是蛋疼的迭代,能做的当然就是转发了。

首先它提供了一个缓存功能,这可以大大减轻你查询的网络请求次数,这也是为什么很多时候我们可以把他当一个 DNS 服务器来用的原因。除此之外 Dnsmasq 提供了非常多灵活的选项让我们可以完全掌控 DNS 解析的行为, 具体的内容请参考它的Man Page,

您可能还喜欢...

发表回复

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

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