2012年4月13日星期五

[GFW BLOG(功夫网与翻墙)] 中国数字时代获德国之声博客大赛“ 最佳博客奖”提名 欢迎网友为我们投票!

原文:http://chinadigitaltimes.net/chinese

中国数字时代有幸获得了德国之声举办的博客大赛“最佳博客将”提名,编辑组全体人员在感到高兴的同时也欢迎读者为我们投票!

您所获提名的奖项(跨语种)最佳博客奖,既设有评审团选出的评委奖,也设有网友投票决定的公众奖。
因此,欢迎您请您的读者为您投票!

投票也在博客大赛网页上进行。网友可通过twitter或facebook帐户登陆,即可为您的博客投票。我们目前正在加紧解决技术问题,争取让中文网友也可通过新浪微博帐号登陆投票。

我们会及时告知您最新的进展。

投票页面:https://thebobs.com/chinese/

活动介绍:德国之声:行使投票权 为中文博客发声 (参加投票的中文网友有望抽奖获得Kindle Touch哟!)



--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/13/2012 09:50:00 AM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)

[GFW BLOG(功夫网与翻墙)] OpenVPN 掉线问题解决

原文:http://bullshitlie.blogspot.com/2012/03/openvpn.html

 上周公司同事反映VPN的速度很慢,我测试了一下ping值,大概都在1000~2000ms左右,有的甚至高达9000ms。我公司一边用的是北京联通的4M ADSL,另一边是cernet。

      我随即重新启动openvpn,刚启动的时候还正常,过了一段时间(长度不定,有可能几分钟,有可能几小时),ping值突然又下降到几秒。我怀疑是不是有不正常的通信,例如病毒什么的,暂用了带宽,于是用tcpdump -i tun0去查看,没有发现可疑流量。

      接着修改了openvpn的通信方式,由默认的udp,改为tcp,似乎稍微好些,但是仍然过了一段不确定的时间,就突然变得极慢。后来又改了mtu等参数,都没有用,问题依旧。

      开始怀疑是不是路由器的BUG,于是刷路由器的ROM。问题依旧。

      然后又干脆换了一个路由器。 问题依旧。

      我擦。。。。。 这TMD是什么情况。

      突然灵光一现,我用ssh tunnel 承载一下openvpn数据包试试。一ping,响应时间都在20ms左右,完全正常,而且非常稳定。

      所以,不知道处于什么原因,ISP(或者GFW)干扰了我的vpn通信。 我只能说,操你大爷的。


配置如下:


[root@galaxy ~]# uname -a
Linux galaxy 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

利用autossh 
[root@galaxy ~]# cat /etc/rc.local 
export AUTOSSH_POLL=60
/usr/local/bin/autossh -M 20010 -f -N -c blowfish -m hmac-md5-96 -L 1194:localhost:1194 root@你的openvpnserver_ip -p 22

/etc/openvpn/client.conf
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 127.0.0.1 1194


--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/13/2012 09:49:00 AM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)

[GFW BLOG(功夫网与翻墙)] Mac OS X Lion下VPN设置多网关,国内流量不走国外线路教程

原文:http://www.eastdesign.net/eastern-blog/mac-os-x-lion%e4%b8%8bvpn%e8%ae%be%e7%bd%ae%e5%a4%9a%e7%bd%91%e5%85%b3%e5%9b%bd%e5%86%85%e6%b5%81%e9%87%8f%e4%b8%8d%e8%b5%b0%e5%9b%bd%e5%a4%96%e7%ba%bf%e8%b7%af%e6%95%99%e7%a8%8b/

介绍

这几个脚本主要利用来自 http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest 的数据生成路由命令脚本, 让vpn客户端在进行连接的时候自动执行. 通过这些路由脚本, 可以让用户在使用vpn作为默认网络网关的时候, 不使用vpn进行对中国国内ip的访问, 从而减轻vpn的负担, 和增加访问国内网站的速度.

基本约定

在使用这些脚本之前, 请确保你在自己的电脑上已经成功配置好一个vpn连接(pptp 或者 openvpn), 并且让之以默认网络网关的方式运行, 这通常也是默认配置, 即vpn接入之后所有网络流量都通过vpn进行.

Openvpn

使用此法之前, 请确认openvpn版本是否为 v2.1 或者以上, 如果不是请参看下方不同系统关于openvpn部分的描述

客户端设置

本方法适用于使用openvpn v2.1或更高版本的用户. 因为openvpn v2.1比之前版本增加了一个名为max-routes的新参数, 通过设置该参数, 我们可以在配置文件里(服务端, 客户端)直接添加超过100条以上的路由信息. 具体设置步骤如下:

  1. 下载 chnroutes.py 文件
  2. 在命令行里执行 python chnroutes.py, 这将生成一个名为 routes.txt 的文本文件. 对于不想安装python的用户, 可以直接从项目下来列表里下载该文件. 它将会每月更新一次.
  3. 使用你喜欢的文本编辑器打开上述文件, 并把内容复制粘贴到openvpn配置文件的末尾
  4. 同时在openvpn配置文件的头部添加一句 max-routes num, 其中num是一个不小于文件routes.txt的行数的数字, 实际上因为还有一些服务器端push过来的路由信息, 所以保险起见可以用 routes.txt的行数加上50, 比如目前得到的routes.txt的行数是940, 你可以把数字设置为1000: max-routes 1000
  5. 修改完之后, 重新进行openvpn连接, 你可以用之前描述过的方法进行测试是否成功

 

以上方法在Mac OSX, Linux 和 Windows上测试通过. 但需要注意的是, 这里用到一个net_gateway的变量表示未连接openvpn前的网关地址, 但openvpn的文档里有说明这个不是所有系统都支持的, 如果发生这个情况, 可以修改一下生成脚本, 把net_gateway修改为你的局域网的网关地址. 对于windows 7 和 vista, OpenVPN的windows客户端可能需要设置Windows XP兼容模式才能使用, 安装文件要在属性选择中的兼容性选择Windows XP和以管理员的身份运行,安装好的运行文件也同样选择这两个选项。如果还是不能连接到VPN的网络,可以尝试在配置文件中加入:

route-method exe route-delay 2

注意事项

  • 因为这些ip数据不是固定不变的, 尽管变化不大, 但还是建议每隔两三个月更新一次
  • 使用此法之后, 可能会导致google music无法访问, 这个其实是因为连上vpn之后, 使用的dns也是国外的, 国外dns对google.cn 解析出来的是国外的ip, 所以一个简单的解决方法是修改本机的hosts文件, 把国内dns解析出来的google.cn的地址写上去: 203.208.39.99 www.google.cn google.cn

PPTP

Mac OSX

  1. 下载 chnroutes.py
  2. 从终端进入下载目录, 执行python chnroutes.py -p mac, 执行完毕之后同一目录下将生成两个新文件’ip-up’和’ip-down’
  3. 把这两个文件copy到 /etc/ppp 目录, 并使用 sudo chmod a+x ip-up ip-down命令把它们设置为可执行
  4. 设置完毕, 重新连接vpn. 测试步骤同上.

Linux

  1. 下载 chnroutes.py
  2. 从终端进入下载目录, 执行python chnroutes.py -p linux, 执行完毕之后同一目录下将生成两个新文件’ip-pre-up’和’ip-down’.
  3. 把ip-pre-up 拷贝到 /etc/ppp目录, ip-down 拷贝到 /etc/ppp/ip-down.d 目录. 测试步骤同上.

Windows

  1. 下载 chnroutes.py
  2. 从终端进入下载目录, 执行python chnroutes.py -p win, 执行之后会生成vpnup.bat和vpndown.bat两个文件.

由于windows上的pptp不支持拨号脚本, 所以也只能在进行拨号之前手动执行vpnup.bat文件以设置路由表. 而在断开vpn之后, 如果你觉得有必要, 可以运行vpndown.bat把这些路由信息给清理掉.

如果机器上没有安装python, 可以直接从下载页面上下载已经预生成的bat文件.

Android

由于没在android上进行过测试, 无法确定上文描述的openvpn v2.1的使用方法是否也在android手机上适用, 所以保留以下内容

openvpn

    1. 下载 chnroutes.py
    2. 从终端进入下载目录, 执行python chnroutes.py -p linux, 这将生成’vpnup.sh’和’vpndown.sh’两个文件.
    3. 把步骤2生成的两个文件拷贝到 android 的 /sdcard/openvpn/目录下, 然后修改openvpn配置文件, 在文件中加上以上三句:
    script-security 2     up "/system/bin/sh /sdcard/openvpn/vpnup.sh"     down "/system/bin/sh /sdcard/openvpn/vpndown.sh"

注意自行修改其中的路径以符合你的android rom的实际路径

另外, 这里假定了你的android已经安装过busybox, 否则请先安装busybox再进行以上操作, 还需要知道的是, 这个脚本在手机上执行会花费比较长的时间, 如非必要, 就不要用了. 也许采用非redirect-gateway方式, 然后在ovpn配置文件里添加几条需要路由的ip段是比较快捷方便的做法.

基于Linux的第三方系统的路由器

一些基于Linux系统的第三方路由器系统如: OpenWRT, DD-WRT, Tomato 都带有VPN(PPTP/Openvpn)客户端的, 也就是说, 我们只需要在路由器进行VPN拨号, 并利用本项目提供的路由表脚本就可以把VPN针对性翻墙扩展到整个局域网. 当然, 使用这个方式也是会带来副作用, 即局域网的任何机器都不适合使用Emule或者BT等P2P下载软件. 但对于那些不使用P2P, 希望在路由器上设置针对性翻墙的用户, 这方法十分有用, 因为只需要一个VPN帐号, 局域网内的所有机器, 包括使用wifi的手机都能自动翻墙. 相信配置方式请参考: Autoddvpn 项目.

信息反馈

本项目的脚本都是在使用路由器进行拨号的情况下测试通过的, 如果在其它拨号方式下, 脚本不能运作, 请在本页添加comment说明. 或者添加一个新的issue. 另外, 在配合openvpn使用的时候, 可能会出现一种情况是因为网络质量不好, openvpn非主动断开, 这时候vpndown脚本也会被自动调用, 但重新连上之后, 可能会找不到默认的路由而添加失败, 这时候你可以通过停止openvpn重连, 并手动设置好原来的默认路由再重新进行openvpn拨号.



--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/13/2012 09:48:00 AM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)

[GFW BLOG(功夫网与翻墙)] 2012最新翻墙方法-利用SSH翻墙软件翻墙教程

原文:http://www.januer.com/itnet/netskill/30.html

网上流传着很多翻墙的方法,各式各样都有,让新手们眼花缭乱,应接不暇,但是又找不到一种适合自己且方便快捷的翻墙方法,本文旨在利用简单的SSH翻墙软件就达到翻墙的目的,此方法只需用到SSH帐号一枚就大功告成。

众所周知,因为某些和谐因素,G F W封锁了很多国外的IP,这就导致我们有很多网站进不去,爱好Huang片的童鞋可能更深有感触,这也间接导致了许多国外的优秀网站也被和谐了,就比如facebook、twitter、blogger、youtube等等。这就是所谓的“墙”。

但是伟大的中国网民的智慧是无限量的,应运而生了很多翻墙软件,翻墙方法,网上也有很多翻墙教程,但是,但是不好意思,搜索引擎把翻墙的字眼也给封了,呵呵,河蟹无处不在!

好了,不说废话了,我讨厌打字,这这就冒死把最终极最简单最实用的最新翻墙方法告诉大家,不算浏览器只用到一款翻墙软件。

翻墙教程开始:

一、需要要到的翻墙软件和资源

1. 一个国外服务器的SSH帐号,免费SSH账号上网一搜一大把,可是大部分已经不能用了这里给大家推荐一个地方保证可用,SSH Center。可以免费试用,注册即实时自动开通SSH账号,可以免费使用24小时,如果帐号通过邮件验证,可再获赠24小时免费使用时间。如果你不想花钱也不怕麻烦,每次用的时候新注册一个帐号就可以。

免费SSH账号注册地址:http://www.sshcenter.info/?ref=28783

这是个中文网站,大家上去看看就知道具体怎么申请,不过这个账号只有一天的可用期,但是你可用通过验证邮箱,推荐注册的方法增加使用期限,如果你不怕麻烦,记住这个网址需要翻墙的时候,注册一个就是了,如果你怕麻烦,购买也划算,很便宜的,一天一元,一周二元,一月五元。这个账号我测试过了还很不错。

2. 翻墙软件MyEnTunnel,连接SSH的软件有很多,比如MyEntunnel,Tunnelier。我这里介绍下MyEntunnel,因为这个比后者设置很简单方便此为绿色软件。

MyEnTunnel下载:

华为网盘:http://dl.dbank.com/c09tdtuia3

迅雷网盘:

3. 火狐FireFox浏览器,当然也可以是其他什么浏览器,谷歌、IE都可以。

二、翻墙教程具体步骤

1. 使用MyEnTunnel连接ssh服务器并转化为本地socks5代理 运行“myentunnel.exe”,切换到”设定”选项卡,

如图下图设置即可:

 

输入你的SHH账号用户名和密码,服务器地址就为ssh.sshcenter.info,SSH端口一般为22,当然,如果你的SSH帐号所在的服务器不是使用默认的22端口,就需要修改SSH端口,“7070”是你本机作为代理服务器的端口,如果7070已经被其他服务占用,就改一个空闲的端口号即可。

信息都填写完毕后,点击“保存”, MyEnTunnel就会将配置保存到当前目录的一个配置文件中。点击左下角的“连接”或者“断开”即可连接你的SSH服务器,第一次连接过程中会出现一个认证对话框,按照提示确认即可。以后的自动连接中将不再出现此认证对话框。连接成功后,MyEnTunne的图标会由红色变为绿色,这个时候你就可以使用localhost:7070的本地代理端口上网了。

点击“隐藏”,就可以将它隐藏到系统托盘,不会占用你的任务栏,该工具在系统托盘颜色状态:红色代表尚未连接或连接失败,黄色代表正在连接,绿色代表已经连接成功。

2. 设置firefox使用MyEnTunnel生成的socks5代理服务器上网 上一步我们已经使用MyEnTunnel连接上了ssh服务器,现在我们让firefox使用MyEnTunnel生成的

socks5代理服务器上网。 由于firefox有众多的代理插件,每个人都有自己的喜好,而每个插件的使用方法又不一样,新手容易造成困扰。我们先不使用任何代理插件,进行最简单的设置。

运行firefox,选择“工具”->“选项”,选择“高级”->“网络”,如下图:

 

点击“配置Firefox如何连接至因特网”后的“设置...”,弹出对话框,按下图设置:

 

“SOCKS 主机”填localhost,端口填MyEnTunnel设置的7070,下面选中“SOCKS v5”,其他项留 空。

现在Firefox已经被配置成使用MyEnTunnel生成的socks5代理了,已经可以访问youtube等网站了。

 

3. 更进一步:设置Firefox访问facebook,twitter等网站 经过上面的设置,firefox已经能够访问大部分网站了,但仍然不能访问facebook和twitter,这是为什么呢?原来,facebook的dns查询被动了手脚,无论你向哪个dns服务器查询facebook的ip地址,都会返 回一个错误的结果。幸运的是firefox支持让远程服务器解析dns地址,但是这个功能默认是关闭的。而IE 目前却缺少远程解析dns的功能。

在firefox的地址栏输入“about:config”进入firefox的高级设置页面,找到

“network.proxy.socks_remote_dns”项,把它的值改为“true”:

 

好了,现在我们终于能访问久违了的twitter:

 

4. 还是不能工作,怎么办? 一个全新安装的firefox经过以上设置是绝对能工作的。但经常有朋友反映仍然上不了网。经检查,这些人 无一例外都是安装了其他firefox扩展(比如autoproxy、foxproxy等),而那些扩展又设置得不正确造成的。

所以,如果firefox仍然不工作,请先禁用掉所有的firefox扩展,再按步骤1-3设置一遍,那就绝对没问题 了。



--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/13/2012 09:46:00 AM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)

[GFW BLOG(功夫网与翻墙)] 让Chrome飞跃疯人院

原文:http://www.from0to1.net/make-chrome-over-the-wall/

话说本来觉得 Chrome 翻墙什么的没必要,因为确实没有啥必须要用 Chrome 来做的,Firefox 有更多喜欢的插件,已经足够好用了,而且 AutoProxy 的配置特别容易。但最近觉得有几个 Chrome 的专属 Plugin 特别好用,比如 PostRank、Fawave …  让人不能不花点时间来看看飞跃疯人院的问题。

其实 Chrome 的配置仍然是相当简单的,只是有一些诡异的问题。

1. 建立SSH连接

首先要先获得一个SSH帐号,这个大家需要自己想办法了。搞清楚如何建立SSH链接, 在 Windows 里面可以使用 MyEnTunnel。Linux 里面可以使用 AutoSSH,我更喜欢直接在命令行里面做:

ssh -qTfnN -D 7070 account@domain

2. 安装 Chrome 插件

Proxy Switchy! 就是干这个活的。可不知道为什么,不论怎么配,我机器上都工作不起来。于是又找到了SwitchySharp ,据说是 Proxy Switchy!的修改版,更好的支持DNS解析的问题。不论如何,它完美的工作了起来,这就足够了。

Sharp 和 Switch 的配置是相同的,很简单,不需要解释,看两张图就够了。

Rule List  URL是:http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt

最后点击“地球”图标,选择“Auto Switch Mode”即可。



--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/13/2012 09:44:00 AM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)

2012年4月12日星期四

[GFW BLOG(功夫网与翻墙)] 利用DNSMASQ获得正确DNS解析

原文:http://bullshitlie.blogspot.com/2012/03/dnsmasq-dns.html

至于DNS在瓷器国被污染的这回事,不用多解释了,正确的DNS解析对于使用squid透明代理进行翻墙极为重要,因为在squid在收到http请求前,域名已经在客户端先解析了

以下说明如何获得正确的dns解析。

首先,你必须要有一台境外服务器,笔者用的是一台境外VPS。

在这台VPS上,安装isc bind。 (当然dnsmasq也应该可以。)

配置 /etc/named.conf options部分
options {
        listen-on port 3722 { any; };  // 要点,必须绑定非标准端口(non 53 UDP)
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        recursion yes;

        forward only;
        forwarders { 208.67.222.222; 208.67.220.220; }; // 这里选取VPS访问最快的DNS服务器,笔者选得是OpenDNS,毫秒级。
        max-cache-size 32M;
        cleaning-interval 480;
        lame-ttl 1800;
        max-ncache-ttl 166000;
        max-cache-ttl 86400;
        edns-udp-size 512;
        max-udp-size 512;
};


在网关上,安装dnsmasq,配置/etc/dnsmasq.conf
no-resolv
server=VPS的IP#3722  // 配置这里访问非标准端口!
bogus-priv
domain-needed
filterwin2k
no-hosts
cache-size=8192
stop-dns-rebind
neg-ttl=3600
~

好了,现在你的dnsmasq应该能解析出正确的dns了。

看来GFW对DNS只做了UDP 53端口的干扰。


最后,以彼之道,施彼之身。利用iptables劫持局域网用户的DNS访问,以保证解析到正确的IP。

iptables -t nat -A PREROUTING -p udp -m udp --dport 53 -j REDIRECT --to-ports 53

用dig 实验:

第一次,用google dns解析,得出被污染的解析记录


第二次,用DNSMASQ解析,得出正确的解析记录



--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/12/2012 08:40:00 AM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)

[GFW BLOG(功夫网与翻墙)] Polipo + autossh 配置指南


polipo 是一个轻量级的cache proxy,选择他是因为他能够实现 http到socks代理的转换。

而且容易配置。

首先,我们还是用autossh这个利器实现 ssh tunnel,在/etc/rc.local中,加入:

[root@archlinux ~]# cat /etc/rc.local
#!/bin/bash
#
# /etc/rc.local: Local multi-user startup script.
#

echo "deadline" > /sys/block/sda/queue/scheduler

## for http(gfw blocked)

# first create a ssh tunnel(socks) then let polipo to talk to this socks proxy.

/usr/bin/autossh -M 20030 -f -N -C -c blowfish -D 127.0.0.1:9999 root@你的服务器IP -p 443 -i /root/server_usa


然后配置 polipo

[root@archlinux ~]# cat /etc/polipo/config
proxyAddress = "127.0.0.1"    # IPv4 only
proxyName = "polipo.server"
socksParentProxy = "127.0.0.1:9999"    // autossh搭建的socks代理
socksProxyType = socks5
chunkHighMark = 50331648
objectHighMark = 16384
diskCacheRoot = "/var/cache/polipo"    // 没目录需要手动创建
dnsQueryIPv6 = no
dnsNameServer = "127.0.0.1"    // dns指向本地pdnsd服务




配置过程很简单,reboot 后应该就能 看到 本地 127.0.0.1:8123绑定了polipo
ss -ln

LISTEN      0      128                             *:8123                           *:*


--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/12/2012 08:39:00 AM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)

[GFW BLOG(功夫网与翻墙)] 翻墙网关Ultimate版

原文:http://bullshitlie.blogspot.com/2012/04/ultimate.html

原理

利用iproute2可根据fwmark选路的功能,结合iptables mangle表set-mark功能,实现基于GeoIP的IP包自动选路。

搭建翻墙网关Ultimate版所需软件列表:

  1. pdnsd 
  2. opendns dnscrypt 
  3. autossh
  4. openvpn
  5. iproute2
  6. xtables-addons 
  7. squid 
  8. gperftools (可选)

    第一章 先决条件

    1. 一台境外VPS。
    2. 假定境外VPS的 名称(IP)为  MyVPS。
    3. MyVPS已经能够用SSH连通。
    4. MyVPS的SSH端口假定为3723(非标准端口)
    5. MyVPS已经可以通过身份认证(server_usa)登录(免密码)
    6. 网关名称为gateway。
    7. 该网关为局域网(小型公司或机构)的网关。
    8. 网关系统为ArchLinux(当然其他的也可以)。
    9. 系统分区已经按照建议分区方式进行了。 
      我的/etc/fstab为:
      /dev/sda1 /boot ext3 defaults 0 1
      /dev/sda2 / xfs defaults 0 1
      /dev/sda3 swap swap defaults 0 0
      /dev/sda5 /usr xfs defaults 0 1
      /dev/sda6 /var reiserfs defaults,notail,noatime,nodiratime 0 1
      /dev/sda7 /tmp reiserfs defaults,notail,noatime,nodiratime 0 1
      /dev/sda8 /home xfs defaults 0 1
      /dev/sdb1 /var2 reiserfs defaults,notail,noatime,nodiratime,data=writeback 0 1
    10. 网关的出口为eth0。
    11. MyVPS和网关均开启了ip_forward。

    第二章 目标

    1. 首先当然是无缝翻墙了,对于http(80)服务做到缓存,对于https(443)服务做到转发。
    2. 对于国内的网站,响应速度不能比直接上网慢。
    3. 如果MyVPS 断掉,不影响用户用上普通境外网站 (failsafe) 。

    第三章 安装与配置

    0. MyVPS的iptables

    只有一条,在nat表中

    -A POSTROUTING -o eth0 -j MASQUERADE

    让来自gateway的数据包做NAT。

    1. 基础软件安装

    可以用pacman 直接安装的软件为:
    pdnsd,autossh, openvpn, iproute2, squid

    需要通过ArchLinux AUR安装的为:
    opendns-dnscrypt, xtables-addons, gperftools
    安装时请自己解决依赖关系(depends)。 

    能通过pacman直接安装的就不再叙述。
    通过AUR 安装了以上软件后,需要做如下设置:
    对于xtables-addons,需要执行

    depmod -a  <-- 更新 modules.dep, 内核模块都需这个操作

    然后在 /etc/rc.conf中加入

    MODULES=(xt_ipp2p xt_geoip)  <-- 加载geoip模块(目前还未配置geoip)

    最后在 /etc/rc.conf中加入

    DAEMONS=(hwclock syslog-ng network netfs crond sshd open-vm-tools openvpn dnscrypt-proxy pdnsd squid iptables lighttpd)

    2. iproute2 -- 新的路由表

    在/etc/iproute2/rt_tables中加入一行

    1       hof

    这里我们新增加一张路由表,以区别默认的用户路由表。命名为hof,这里随便命名了,用gfw也行,数字 1 是这个表的数字编码,区分默认路由表253就可以了,我们主要就是利用这张表来进行翻墙。

    ip route show <-- 可以返回默认路由表。
    ip route show table hof  <-- 返回hof表,目前应该是空的。

    3. autossh配置 -- Across the great firewall

    如何做到不用密码登陆服务器,请参考 这篇 。

    加到 /etc/rc.local 中:

    /usr/bin/autossh -M 21000 -f -N -C -c blowfish -L 1194:localhost:1194 root@MyVPS-p3723 -i /root/server_usa <-- 身份文件(private key)

    请先手动启动这个通道, 1194端口为OpenVPN的默认端口,我们让openvpn走SSH Tunnel加密隧道进行通信。至于为什么要走ssh tunnel, 参考这篇文章

    4. openvpn配置 -- 目标-- tun0的ip规则

    参照前文 openvpn 最简配置,了解openvpn的基本配置原理,实现通过ssh隧道的vpn通信。
    配置如下,与前文openvpn的配置略有不同:

    MyVPS

    # cat /etc/openvpn/server.conf 
    dev tun
    local 127.0.0.1
    ifconfig 172.7.7.1 172.7.7.2   <-- 指定点对点设备的IP
    proto tcp-server
    secret static.key
    cipher none
    auth none
    persist-key
    persist-tun
    user nobody
    group nobody
    keepalive 10 30
    comp-lzo
    tun-mtu 1300

    Gateway:

    [root@archlinux ~]# cat /etc/openvpn/client.conf 
    remote 127.0.0.1 1194
    dev tun
    ifconfig 172.7.7.2 172.7.7.1 <-- 指定点对点设备的IP
    proto tcp-client
    secret static.key
    cipher none
    auth none
    persist-key
    persist-tun
    #user nobody   <-- 关键!
    #group nobody  <-- 需要用root权限启动,脚本运行需要root权限
    keepalive 10 30
    comp-lzo
    tun-mtu 1300 
    script-security 2

    up "up.sh"
    up-delay   <-- 关键,在成功建立通道后再执行脚本(改变路由表)

    down "down.sh" 
    down-pre  <-- 在TUN断掉前就及时执行down.sh,改变路由表

    up-restart <-- 关键,在每次断线后(而不是程序中止),执行down,up脚本。及时改变路由。


    openvpn配置好后,我们就可以编写路由规则脚本(up.sh, down.sh) 了:


    当openvpn通道建立的时候,让带有某个标记的数据包,选用hof这张路由表,在hof表中,默认路由为openvpn的通道--tun0。

    我们假设,对访问境外网的数据包,打的标记为,数字 65  (后面会用iptables+geoip打标记)

    我们在openvpn通道建立的时候加入这个规则

    修改gateway上 /etc/openvpn/up.sh

    #!/bin/sh

    ip rule add fwmark 65 table hof   <-- 让带有65标记的数据表走hof表
    ip route add to default dev tun0 table hof initrwnd 20 initcwnd 20 <-- 默认路由为tun0

    exit 0

    这里实现了根据ip标记的选路,注意initrwnd initcwnd参数,对于高延迟的路由,特别有用,尤其是境外网站,这样降低了初始tcp ACK的次数,这里将tcp的初始发送窗口和接受窗口都改为20倍MSS(小于MTU)。后面有关于这个问题的说明(TCP slow start),这里不详说。

    为了实现当通道断掉的时候,或者说MyVPS不可用的情况下,也不妨碍正常的上国外网站(failsafe)。因此在openvpn断掉(down)的时候,要删除我们上面加入的规则,如下:

    修改gateway上 /etc/openvpn/down.sh

    #!/bin/sh

    ip rule delete fwmark 65 table hof
    ip route delete to default dev tun0 table hof

    exit 0

    启动 openvpn 
    执行 ip addr 应该会有如下输出:

    4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1300 qdisc pfifo_fast state UNKNOWN qlen 100
        link/none 
        inet 172.7.7.2 peer 172.7.7.1/32 scope global tun0

    确保vpn已经连接成功,tun0 设备出现,并通过ip rule show 和 ip route show table hof检查规则是否生效。

    [root@archlinux ~]# ip rule show
    0:      from all lookup local 
    32765:  from all fwmark 0x41 lookup hof 
    32766:  from all lookup main 
    32767:  from all lookup default

    [root@archlinux openvpn]# ip route show table hof
    default dev tun0  scope link  initcwnd 20 initrwnd 20

    5. pdnsd配置 -- 加速dns解析

    先配置一下dnscrypt ,让dnscrypt跑在非53端口,避免占用pdnsd的53端口 

    [root@archlinux ~]# cat /etc/conf.d/dnscrypt-proxy   
    DNSCRYPT_LOCALIP=127.0.0.1
    DNSCRYPT_LOCALPORT=50    <-- 改为50
    DNSCRYPT_USER=nobody

    重新启动你的dnscrypt。 剩下的是对pdnsd.conf的配置,如下:

    global {
            perm_cache=65536;
            cache_dir="/var/cache/pdnsd";
            pid_file = /var/run/pdnsd.pid;
            run_as="nobody";
            server_ip = any;  # Use eth0 here if you want to allow other
                                    # machines on your network to query pdnsd.
            status_ctl = on;
            query_method=tcp_only;
            use_nss=off;
            min_ttl=1d; 
            max_ttl=1w;        # One week.
            timeout=10;        # Global timeout option (10 seconds).
            par_queries=1;
            neg_rrs_pol=on;
    }

    server {
            label= "local dnscrypt";
            ip = 127.0.0.1;
            port = 50;  # dnscrypt的50端口
            timeout=10;
            uptest=query;   
            edns_query=no;   
    }

    server {   
            label= "google dns";   # 备用 dns 
            ip = 8.8.8.8,8.8.4.4;
            timeout=10;
            uptest=ping;   
            edns_query=no;   
    }

    可以通过pdnsd-ctl status 查看pdnsd运行状态 

    6. squid 配置 -- 控制中心

    squid 的配置此处已经简化了,squid再也不用去管翻墙的事,翻墙的事让路由做了。
    squid 安装好后的默认配置就可以运行了,以下列出我的一些优化参数(可选):

    ##########################################################################

    #
    # Recommended minimum configuration:
    #
    acl manager proto cache_object
    acl localhost src 127.0.0.1/32 ::1
    acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

    # Example rule allowing access from your local networks.
    # Adapt to list your (internal) IP networks from where browsing
    # should be allowed
    acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
    acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
    acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
    acl localnet src fc00::/7       # RFC 4193 local private network range
    acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

    acl SSL_ports port 443
    acl Safe_ports port 80          # http
    acl Safe_ports port 21          # ftp
    acl Safe_ports port 443         # https
    acl Safe_ports port 70          # gopher
    acl Safe_ports port 210         # wais
    acl Safe_ports port 1025-65535  # unregistered ports
    acl Safe_ports port 280         # http-mgmt
    acl Safe_ports port 488         # gss-http
    acl Safe_ports port 591         # filemaker
    acl Safe_ports port 777         # multiling http
    acl CONNECT method CONNECT

    #
    # Recommended minimum Access Permission configuration:
    #
    # Only allow cachemgr access from localhost
    http_access allow manager localhost
    http_access deny manager

    # Deny requests to certain unsafe ports
    http_access deny !Safe_ports

    # Deny CONNECT to other than secure SSL ports
    http_access deny CONNECT !SSL_ports

    # We strongly recommend the following be uncommented to protect innocent
    # web applications running on the proxy server who think the only
    # one who can access services on "localhost" is a local user
    #http_access deny to_localhost 

    ##########################################################################
    # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
    #

    # 禁止一些网站
    acl denied_domains url_regex "/etc/squid/denied_domains.acl"
    http_access deny denied_domains

    # block xunlei(迅雷)
    acl IP dstdom_regex [0-9]$
    acl ROOT urlpath_regex ^/$
    acl POST method POST
    acl Octet_Stream req_mime_type application/octet-stream
    http_access deny IP ROOT POST Octet_Stream

    # Example rule allowing access from your local networks.
    # Adapt localnet in the ACL section to list your (internal) IP networks
    # from where browsing should be allowed
    http_access allow localnet
    http_access allow localhost

    # And finally deny all other access to this proxy
    http_access deny all

    # Block Multithread downloading.(多线程下载)
    acl partial rep_header Content-Range .*
    http_reply_access deny partial

    ##########################################################################
    # Squid normally listens to port 3128
    http_port 3128 transparent

    # Leave coredumps in the first cache dir
    coredump_dir /var/cache/squid


    ##############################################################
    forwarded_for off

    via off

    cache_dir aufs /var2/cache/squid 16384 32 512

    cache_mem 4096 MB
    dns_v4_first on
    memory_pools off

    memory_replacement_policy lru
    cache_replacement_policy heap LFUDA

    maximum_object_size 16384 KB
    maximum_object_size_in_memory 2048 KB

    dns_nameservers 127.0.0.1
    access_log none

    client_db on
    half_closed_clients off
    buffered_logs on
    relaxed_header_parser on

    refresh_pattern -i \.html$ 1440 90% 129600 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.htm$ 1440 90% 129600 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.css$ 1440 50% 129600 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.shtml$ 1440 90% 129600 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.jpg$ 1440 90% 129600 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.png$ 1440 90% 129600 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.gif$ 1440 90% 129600 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.bmp$ 1440 90% 129600 override-lastmod override-expire ignore-reload ignore-no-cache 
    refresh_pattern -i \.js$ 1440 90% 129600  override-lastmod override-expire ignore-reload ignore-no-cache

    refresh_pattern -i \.mp3$ 1440 50% 2880  override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.wmv$ 1440 50% 2880  override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.rm$ 1440 50% 2880   override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.swf$ 1440 50% 2880  override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.mpeg$ 1440 50% 2880 override-lastmod override-expire ignore-reload ignore-no-cache
    refresh_pattern -i \.wma$ 1440 50% 2880  override-lastmod override-expire ignore-reload ignore-no-cache

    # Add any of your own refresh_pattern entries above these.
    refresh_pattern ^ftp:           1440    20%     10080
    refresh_pattern ^gopher:        1440    0%      1440
    refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
    refresh_pattern .               0       20%     4320 reload-into-ims

    7. geoip 配置 -- 智能选路的基础

    man xtables-addons

    geoip部分已经说得很清楚了,直接复制过来:
           The extra files you will need is the binary database files. They are generated from a country-subnet database with the geoip_build_db.pl tool that is shipped with the source package, and which should be available in compiled
           packages in /usr/lib(exec)/xtables-addons/. The first command retrieves CSV files from MaxMind, while the other two build packed bisectable range files:

    mkdir -p /usr/share/xt_geoip; cd /tmp; $path/to/xt_geoip_dl;
    $path/to/xt_geoip_build -D /usr/share/xt_geoip GeoIP*.csv;

           The shared library is hardcoded to look in these paths, so use them.

    archlinux下 $path/to/xt_geoip_dl; 为  /usr/lib/iptables/xtables-addons/xt_geoip_dl 

    modprobe xt_geoip  <!-- 让iptables match geoip 生效

    8. iptables配置 -- 将上面的都连起来

    还记得上面的OpenVPN建立的规则么,是的,我们现在就要开始给数据包打标记了: 

    mangle表:

    -A PREROUTING -p tcp -m tcp --dport 443 -m geoip ! --destination-country CN  -j MARK --set-xmark 0x41/0xffffffff <-- 数字65
    -A OUTPUT -p tcp -m tcp --dport 80 -m geoip ! --destination-country CN  -j MARK --set-xmark 0x41/0xffffffff <-- 数字65


    a) 对非CN的https443端口)访问的ip地址,打标记65 ,注意是PREROUTING表,外来的443端口数据直接由tun0出去。确保对外的https能正常访问。

    b) 对非CN的http80端口)访问的ip地址,打标记65,注意是OUTPUT 表,这里是squid本地发起的了,带缓存。

    nat表:

    -A PREROUTING -i eth0 -p udp -m udp --dport 53 -j REDIRECT --to-ports 53
    -A PREROUTING -d 10.0.0.0/8 -j ACCEPT
    -A PREROUTING -d 172.0.0.0/8 -j ACCEPT
    -A PREROUTING -d 192.168.0.0/16 -j ACCEPT
    -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
    -A POSTROUTING -o tun0 -j MASQUERADE

    a) 劫持所有的DNS查询请求到本地的pdnsd服务
    b) 对于LAN的IP地址,10,172,192.168这些内网段,直接通过,不转到squid
    (sorry~~~, mangle表没写好,导致了内网段也打上了65标记。)
    c)把所有对http(80)端口的访问转发到3128端口(squid)
    d) 对 tun0出口的做NAT(sigh~~~ 不想把路由写复杂了,就nat吧,简单)


    第四章 优化  -- Let's fly

    a) /etc/sysct.conf

    #

    # Kernel sysctl configuration
    #


    # Disable packet forwarding
    net.ipv4.ip_forward=1


    # Disable the magic-sysrq key (console security issues)
    kernel.sysrq = 0


    # Enable TCP SYN Cookie Protection
    net.ipv4.tcp_syncookies = 1


    kernel.sem = 100
    fs.file-max = 6815744
    net.ipv4.ip_local_port_range = 10000 65500

    # memory
    net.core.rmem_default = 262144
    net.core.wmem_default = 262144
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 4096 16777216
    net.ipv4.tcp_wmem = 4096 4096 16777216
    net.ipv4.tcp_mem = 786432 2097152 3145728

    # backlogs
    net.core.somaxconn = 2048
    net.core.netdev_max_backlog = 20000
    net.ipv4.tcp_max_syn_backlog = 16384

    # TIME-WAIT recycle
    net.ipv4.tcp_fin_timeout = 15
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1

    # tcp keepalive
    net.ipv4.tcp_keepalive_time=120
    net.ipv4.tcp_keepalive_intvl=30
    net.ipv4.tcp_keepalive_probes=3

    ### tcp retry
    net.ipv4.tcp_syn_retries = 0
    net.ipv4.tcp_synack_retries = 0

    ### vmware
    vm.swappiness = 1
    vm.vfs_cache_pressure=50
    vm.overcommit_memory = 1
    vm.dirty_background_ratio = 3
    vm.dirty_ratio = 40
    vm.dirty_expire_centisecs = 1000

    net.ipv6.conf.all.disable_ipv6 = 1

    b) /etc/fstab 

    对squid swap分区优化: 

    /dev/sdb1 /var2 reiserfs defaults,notail,noatime,nodiratime,data=writeback 0 1

    c) 对dns进行预加载 (可选)

    cat /etc/cron.daily/dig

    #!/bin/sh

    pdnsd-ctl dump |grep "^[a-zA-Z0-9_\-\.]\+$" > /tmp/dnscommon.txt 
    dig @127.0.0.1 -f /tmp/dnscommon.txt > /dev/null  


    这个cron script比较粗暴,只增不减,不过问题也不大,后期稳定在几万条记录。

    d) gperftools 的tcmalloc优化

    Google Performance Tools:  
    gperftools提供的malloc函数很高效,特别适用于squid这种反复分配内存的应用,有利于降低cpu利用率,并提高响应速度。

    采用的是最简单的LD_PRELOAD方式加载, 打开 /etc/rc.d/squid 在执行squid前加入一句:

    . /etc/rc.conf
    . /etc/rc.d/functions

    export LD_PRELOAD="/usr/lib/libtcmalloc.so" 

    ....

    e) QoS优化,让翻墙数据包先行 tc

    在 /etc/rc.local 中,加入:

    #  QoS
    tc qdisc add dev eth0 root handle 1: prio
    tc filter add dev eth0 protocol ip parent 1: prio 0 u32 match ip dst MyVPS的IP/32 flowid 1:1
    tc filter add dev eth0 protocol ip parent 1: prio 2 u32 match ip src 0/0 flowid 1:2

    稍微解释一下:
    1. 对eth0设备,我们采用的带宽控制策略是PRIO,PRIO qdisc有固定的三个优先级1,2,3。
    2. 我们让流向MyVPS的数据,flow到 1:1 这个最高优先级的band。
    3. 让其他数据流向1:2这个最低优先级的band。

    f) eth0的 tcp参数优化

    # change tcp windows
    ip route change default dev via 10.0.0.1 eth0 initrwnd 20 initcwnd 20

    这里将tcp的发送窗口和接受窗口都改为20倍MSS(小于MTU), 这个优化对于squid服务特别有用,解决tcp slow start 问题, 这里对访问国内网站加速。

    g) 文件打开数的优化


    修改 /etc/security/limits.conf
    *               -       nofile          65535  <-- 进程最大文件数65535

    [root@archlinux ~]# cat /etc/conf.d/squid 
    #
    # Parameters to be passed to squid
    #
    SQUID_ARGS="-sYC"
    SQUID_MAXFD=65535


    h) 磁盘调度方式调整 


    修改 /etc/rc.local,加入:


    echo "deadline" > /sys/block/sda/queue/scheduler  
    echo "deadline" > /sys/block/sdb/queue/scheduler

    提高IO响应速度。

     参考资料

    (~~~~~~~~~~~~完结~~~~~~~~~~~~)


    --
    Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 4/12/2012 08:38:00 AM

    --
    1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
    2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
    3、停止订阅,请发邮件到
    gfw-blog+unsubscribe@googlegroups.com
    翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)