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 防火墙模块的结构如下图所示:
我们可以看到橘红色框框住的部分就是 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 的 manpage 和 extention man page。关于 netfilter 各个扩展模块的功能说明, 可以参考 OpenWrt 网站上的这个页面。
Dnsmasq 解析器
Dnsmasq 是 OpenWRT 系统默认内置的 DNS 解析器,要注意这个解析器不等同于 nslookup 和 dig,后面的只是调试工具,除了返回一些查询信息外不能给任何系统和应用提供解析结果,而 Dnsmasq 可以。
我们需要对 Dnsmasq 的性质有个基本认识,Dnsmasq 并不能算是一个 DNS 服务器软件,他的准确定义是一个 DNS 转发器。就是说,它把收到的 DNS 解析请求,转发到一些 DNS 服务器上去,然后从 DNS服务器接收返回的结果,最后再返回给你? 你也许会觉得这玩意这么蛋疼,我自己查询不好吗,干嘛要你来转发? 其实它能做的不仅仅是转发,转发仅仅是他实现 DNS 查询的方式,我们知道它即不能递归查询,又不是蛋疼的迭代,能做的当然就是转发了。
首先它提供了一个缓存功能,这可以大大减轻你查询的网络请求次数,这也是为什么很多时候我们可以把他当一个 DNS 服务器来用的原因。除此之外 Dnsmasq 提供了非常多灵活的选项让我们可以完全掌控 DNS 解析的行为, 具体的内容请参考它的Man Page,
近期评论