首先我们需要一个支持iptables转发的透明代理
有很多的软件都支持透明代理,但是个人觉得redsocks或者衍生版redsocks2是相对来说比较容易上手,而且也比较实用的。redsocks/redsocks2支持iptables的转发,可以将数据转到http/https,或者socks4/socks5代理。具体的设置方法,请自行Google搜索redsocks。github上都有相应的代码。
我们还需要一个能够让我们正确访问互联网的软件
其实我想表达的是代理软件。goagent,wallproxy等http/https代理以及ssltunnel等socks5代理都行。
至于redsocks和代理之间如何设置,主要就是redsocks的port和type设置正确了就没多大问题。具体还是自行谷歌。关于如何利用代理正确访问互联网的问题在此不多做说明。
利用dnsmasq和非标准端口的DNS服务器获取到正确的IP地址
上一章已经提到GFW会定向污染某些域名,在DNS返回正确的结果之前,会抢先返回一个错误的结果。但是我们发现GFW对TCP协议的53端口和非53端口的TCP或UDP的DNS还没有进行污染,所以这里我们可以做一个比较简单的解决方案,就是在dnsmasq的配置文件内写入一个server=1.2.3.4#1234(1.2.3.4为上游支持非标准端口解析的DNS服务器的IP,1234为端口)。这样就可以获取到正确的解析地址了。
利用ipset配合dnsmasq来给需要的地址做规则
ipset是iptables的扩展,它允许你创建 匹配整个地址sets(地址集合)的规则。我们已经知道GFW已经认证了一部分的网站,这些被认证的网站列表会被储存在一个叫做gfwlist(autoproxy的规则,感谢互联网上无私奉献的人)规则里。请自行Google:gfwlist-dnsmasq。
在获得dnsmasq-gfwlist的配置文件后,我们还需要用ipset来做一个规则,用于储存这些网站的正确IP地址。
ipset create gfwlist iphash
注:gfwlist请根据你dnsmasq里的ipset的设置做修改。这样你的ipset规则表就做好了。
利用ipset的规则和iptables的转发功能来实现被认证网站的数据转发
现在我们已经做好了dnsmasq规则和ipset规则表。那么我们现在需要的就是让这些在规则里的网站正常访问,所以我们就要利用iptables来实现(iptables在上一章做了说明)。
我们只需要一条简单的命令就能实现这样的转发。
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
注:1080为redsocks的local_port里的数值,如果不同,请自行修改。
作用是将发往ipset规则中的gfwlist表里的地址的数据转发到1080端口。而redsocks监听在1080端口,就把转发过来的数据利用代理传出去了。
到此,我们已经能够正常访问那些被GFW认证的网站了