Thursday, March 11, 2010

"西厢计划"Ubuntu安装配置指南

"西厢计划"是今天听到的最振奋人心的消息, 穿越GFW这么多年, 基本上各种类型的方法都用过, 每每穿墙都有一种莫名的快感, 想着GFW同学被无数人一次又一次地虐待. 作为新世纪的有志青年, 翻墙已经成了一种必须掌握的技能. 俗话说得好, "不会翻墙的网民不是好公民." 看到这里你应该已经知道"西厢计划"到底是个什么东西了, 但它不同于以往的所有翻墙技术, 算是翻墙界的最新研究成果吧. "西厢计划"的优势在于可以用最直接的方式访问网站, 比如平时用的代理、VPN都是先到另一个地方绕一圈, 而按照作者的说法, "西厢计划"直接注入GFW系统, 这样当你访问敏感词网站时, GFW就变得像个傻子一样, 根本不会进行重置操作, 从而以最快的速度访问网站.

目前还只能在Linux系统中进行使用, 且要求内核版本大于等于2.6.17, 下面是我在Ubuntu中安装配置的全过程.

安装

这里下载安装文件, 解压进入目录. 先安装一些依赖软件:
$ sudo apt-get install autoconf automake libtool aptitude xtables-addons-common iptables-dev
接下来开始编译加安装:
$ ./autogen.sh
$ CFLAGS="" ./configure --prefix=/usr --libexecdir=/lib
$ make
$ sudo make install

配置

在安装文件的"examples"目录中有一些已经设定好的ipset规则, 这些规则用来过滤那些特定的网络访问, 先导入所有规则:
$ sudo ipset -R < CHINA
$ sudo ipset -R < GOOGLE
$ sudo ipset -R < YOUTUBE
$ sudo ipset -R < NOCLIP
再使用iptables设定具体的过滤规则:
$ sudo iptables -A INPUT -p tcp --sport 80 --tcp-flags FIN,SYN,RST,ACK SYN,ACK -m state --state ESTABLISHED -m set --match-set NOCLIP src -j ZHANG -m comment --comment "client-side connection obfuscation"
$ sudo iptables -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j CUI -m set --match-set CHINA src -m comment --comment "server-side connection obfuscation"
$ sudo iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -m gfw -j LOG --log-level info --log-prefix "gfw: " -m comment --comment "log gfw tcp resets"
$ sudo iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -m gfw -j DROP -m comment --comment "drop gfw dns hijacks"
最后修改主DNS, 在"/etc/dhcp3/dhclient.conf"文件中找到"prepend domain-name-servers", 将后面的IP替换为没有被感染的DNS地址, 比如"8.8.8.8", 重启网卡:
$ sudo ifconfig eth0 down
$ sudo ifconfig eth0 up

大功告成! 打开浏览器试试吧, YouTube、Blogger、Picasa、Google Groups、Google Docs的Spreadsheet这些都已是畅通无阻, 不过目前Twitter、Facebook还无法访问, 但相信"西厢计划"以后将会越来越强大.

2010.3.13更新:

以上配置在重启之后都会消失, 这就麻烦了, 总不能每次开机都先输这么一长串命令吧. 在参考了Ubuntu官方Wiki之后, 有了一个很好的解决办法.

首先确定你已经设定好了上面的所有规则, 接着将当前规则导出并放到"/etc"目录中:
$ sudo ipset -S > ipset.rules
$ sudo iptables-save > iptables.rules
$ sudo mv ipset.rules iptables.rules /etc
其实我们需要做的就是让系统在每次开机的时候自动读取这些规则, 这可以有很多种方法, 比如写成脚本, 放到rc目录中, 但我觉得下面的方法更加灵活一点. 这里又要分成两种方法, 如果你使用了NetworkManager, 请看第一种, 否则看第二种. 之所以要这样分开讨论, 是因为第二种方法会导致NetworkManager不能正常工作.
  1. 这里下载NetworkManager的配置脚本, 加上可执行权限, 最后放到"/etc/NetworkManager/dispatcher.d"目录中.

  2. 在"/etc/network/interfaces"文件中添加如下几行:
    auto eth0
    iface eth0 inet dhcp
        pre-up ipset -R < /etc/ipset.rules
        pre-up iptables-restore < /etc/iptables.rules
        post-down ipset -S > /etc/ipset.rules
        post-down iptables-save > /etc/iptables.rules
    

P.S. 我终于又可以直接在Blogger里写博客了, 泪牛满面啊~~~

68 comments:

  1. 翻墙来顶贴啊!

    真是好东西!可惜我不是Linux……

    小高子兄研究一下怎么移植吧!

    ReplyDelete
  2. 添加facebook的IP段再找到facebook的剩余可用IP 写进host就可以访问facebook了。
    twitter同理。
    如果IP全都被封就没有办法了。

    ReplyDelete
  3. 会被载入史册的啊

    ReplyDelete
  4. @HCocoa 这个依赖Linux内核特性的...

    ReplyDelete
  5. @2楼 感谢, 不过我比较懒, 就不去挨着找了.

    ReplyDelete
  6. 用SSH-D的来看望我们不用翻墙的哥,希望WINDOWS版本早日到来,。

    ReplyDelete
  7. 不行啊.按照你说的一步步做下来.但是还是无法正常使用.不知我哪一步操作有问题.测试平台ubuntu9.10 netbook remix

    ReplyDelete
  8. 成功!但是还不够稳定,速度也有点慢,继续关注并支持,希望越来越好!

    ReplyDelete
  9. 我按照步骤都做完了,ipset -L, iptable -L都显示已经添加了。
    但是在dhclien.conf中,“prepend ...”这行是被注释掉的。拿掉注释,改ip地址。但是没有效果。求助。请

    ReplyDelete
  10. haha 找乐个在雨林木风(基于ubuntu9.10)按照以上步骤尝试成功。多了一个推广雨林木风的卖点阿。

    ReplyDelete
  11. 坚决支持,这么好的东西,一定要用,
    目前ubuntu9.10,准备升级10.04

    ReplyDelete
  12. CFLAGS=... 时出现错误

    ./configure: line 10586: syntax error near unexpected token `libxtables,'
    ./configure: line 10586: ` PKG_CHECK_MODULES(libxtables, xtables >= 1.4.3)'

    怎么回事?

    ReplyDelete
  13. 这个可以放到osx 10.6.2上面用么

    ReplyDelete
  14. 我是8.10的,没有xtables这个包啊!

    可惜……

    ReplyDelete
  15. wk......终于可以看些 财经方面的blogspot了......

    ReplyDelete
  16. 顶啊,国人也能直连youtube,偶也是泪牛满面

    ReplyDelete
  17. 虚拟机vb中没法安装,那位高手指点下。谢谢

    ReplyDelete
  18. 出现 ./configure: line 10586: syntax error near unexpected token `libxtables,' 的同学, 大概是因为那些aclocal的宏没有正确展开, 需要手动把 /usr/share/aclocal/ 里的文件copy到编译目录的m4目录里

    ReplyDelete
  19. @Anony: aclocal里总共8个文件,我全部copy至了m4,但依然出现./configure: line 10586: syntax error near unexpected token `libxtables,'

    ReplyDelete
  20. 配置的时候显示:bash: CHINA: 没有该文件或目录
    那些文件是在examples下面。

    ReplyDelete
  21. @楼上 再检查一下命令是否正确, 你必须在examples目录中执行ipset命令.

    ReplyDelete
  22. 按照楼主所说的全部配置都有弄啊,为什么还是不能上,我用的是ubuntu 9.10

    ReplyDelete
  23. @八宝 我也是啊... 这么诡异?

    ReplyDelete
  24. @ero 我在debian下也遇到这个问题,可能是少装了几个包。xtables-addons得装testing里的包,直接在官网下载来装的。后来把几个相关包也打上configure就没错了。http://packages.debian.org/source/squeeze/xtables-addons
    也许能有点帮助。

    ReplyDelete
  25. @iceman.yu: 这个真的有点头疼,我用的是Kubuntu,到这里去下载了xtables-addons pkg:
    https://launchpad.net/ubuntu/+source/xtables-addons/1.21-1

    装好之后,西厢的configure阶段就可以通过了,但make的时候说:

    if [ -n "/lib/modules/2.6.31-20-generic/build" ]; then make -C /lib/modules/2.6.31-20-generic/build M=/home/Downloads/wb-001/extensions modules; fi;
    make[3]: Entering directory `/usr/src/linux-headers-2.6.31-20-generic'
    CC [M] /home/Downloads/wb-001/extensions/compat_xtables.o
    CC [M] /home/Downloads/wb-001/extensions/xt_CUI.o
    CC [M] /home/Downloads/wb-001/extensions/xt_ZHANG.o
    CC [M] /home/Downloads/wb-001/extensions/xt_gfw.o
    CC [M] /home/Downloads/wb-001/extensions/ipset/ipt_set.o

    make[5]: *** No rule to make target `/home/Downloads/wb-001/extensions/ipset/ipt_SET.c', needed by `/home/Downloads/wb-001/extensions/ipset/ipt_SET.o'. Stop.
    ...
    ...

    ReplyDelete
  26. Ubuntu 9.04 (Jaunty) 安装西厢计划时,找不到xtables 以及 xtables-addon-common 安装包的解决方案

    http://prithak.blogspot.com/2009/10/nefilter-extensions-using-xtables.html

    重点在于安装一个 >= 1.4.3 的iptables
    wget -c http://ftp.netfilter.org/pub/iptables/iptables-1.4.5.tar.bz2

    然后下载xtables-addons
    wget -c http://nchc.dl.sourceforge.net/project/xtables-addons/Xtables-addons/1.19/xtables-addons-1.19.tar.bz2

    安装好相应依赖:iptables-dev linux-source linux-headers

    随后编译安装即可

    ReplyDelete
  27. 输入sudo iptables -A INPUT -p tcp --sport 80 --tcp-flags FIN,SYN,RST,ACK SYN,ACK -m state --state ESTABLISHED -m set --match-set NOCLIP src -j ZHANG -m comment --comment "client-side connection obfuscation"出现
    iptables v1.4.7: Couldn't load target `ZHANG':/usr/local/libexec/xtables/libipt_ZHANG.so: cannot open shared object file: No such file or directory
    看了一下libipt_ZHANG.so在usr/libexec/xtables/目录,如何更改-j的target目录

    ReplyDelete
  28. @ero 翻了翻,试着按你的版本加上http://ubuntu.srt.cn/这个源。用apt-get build-dep xtables-addon-common让系统帮你把编译需要的包都装上再试试吧。

    ReplyDelete
  29. 同alex,我是在学校用的教育网,使用锐捷上网。dhclien.conf中,“prepend ...”这行是被注释掉的。遮盖怎么办呐,求教!

    ReplyDelete
  30. @周龑 奇怪, 我根本就没有"libipt_ZHANG.so"这个文件. configure时的"--libexecdir"参数也许有用.

    ReplyDelete
  31. @楼上的楼上 你们学校是必须用动态IP是吧? 改DNS不会影响的.

    ReplyDelete
  32. 怎么说呢,我几乎把每一个人的问题都遇到了 >_<

    安装的问题按照 @CNBorn 的方案可以解决 (我的版本是Karmic 9.10)

    但接下来的导入和配置我遇到了和 @周龑 一样的错误输出。

    但和 @周龑 有点不同的是,
    这几个文件同时也不存在于 /usr/libexec/xtables/ 当中。

    ReplyDelete
  33. @ero 我也是9.10, 怎么会有这么多问题...?

    ReplyDelete
  34. @小高子: 嗯, 运气很是不好。 能给出点建设性的帮助么?

    ReplyDelete
  35. @ero 应该是没有安装成功, 我安装好之后那些so都放在"/lib/xtables"下, 有三个文件: libxt_gfw.so, libxt_ZHANG.so, libxt_CUI.so

    你安装时configure的参数是什么?

    ReplyDelete
  36. @小高子:其实我输入的所有命令和该博文中提到的是一样的。

    另外,我在root下find了‘*ZHANG*so’,只有一个结果: /usr/libexec/xtables/libxt_ZHANG.so

    ReplyDelete
  37. @小高子:其实我输入的所有命令和该博文中提到的是一样的。

    另外,我在root下find了‘*ZHANG*so’,只有一个结果: /usr/libexec/xtables/libxt_ZHANG.so

    :(

    ReplyDelete
  38. @ero 我想到几种方法, 不过没有试验过:

    1. configure时不用"--libexecdir", 用"--with-xtlibdir=/usr/local/libexec/xtables", 这样也许so会放到指定目录里.

    2. 你应该是手动编译安装的xtables-addons吧? 你可以试试把安装目录改一下. 像我是从源安装的xtables-addons-common包 (9.10的源没有xtables-addons, 不过貌似也不需要), 所有so都默认放在了/lib/xtables里.

    3. 手动修改西厢计划安装文件的Makefile, 在其中找到"libexecdir=XXX", 把后面的XXX改成你想要的目录.

    4. 实在还是不行, 就cp或者ln到指定目录, 让程序运行的时候能找到就行了...

    暂时想到这些, 如果还是不行, 你可以试试联系作者.

    ReplyDelete
  39. 我在虚拟机里调试的,但不正常。主要是最后一步DNS不知道怎么设?

    按我想我的虚拟机和宿主机是用NAT连的,虚拟机的DNS不是应该用宿主机的吗?我宿主机的DNS是8.8.8.8,那应该就不用设了。试一下,不成功。

    而我去设虚拟机的DNS时,那个文件里的prepend domain-name-servers是被注释掉的,系统压根不用啊,我改了干吗,肯定无用的。

    大致如下:
    send host-name "";
    #send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
    #send dhcp-lease-time 3600;
    #supersede domain-name "fugue.com home.vix.com";
    #prepend domain-name-servers 127.0.0.1;

    ReplyDelete
  40. @T 把注释符号去掉就行了, 一般来说这行都是被注释了的, 去掉注释不会影响虚拟机的正常运行.

    ReplyDelete
  41. @小高子:我把xtables-addons 用aptitude重装为1.17版,于是所有问题都解决了。

    不过重启网卡(我的是eth1)后,无法进行DNS解析了,所有网页均返回Unknown Host

    【我用的是Vbox虚拟机,prepend domain-name-server同样是被注释掉的,应该不用改吧?】

    我的 dhclient.conf 文件:
    option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

    send host-name "";
    #send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
    #send dhcp-lease-time 3600;
    #supersede domain-name "fugue.com home.vix.com";
    #prepend domain-name-servers 127.0.0.1;
    request subnet-mask, broadcast-address, time-offset, routers,
    domain-name, domain-name-servers, domain-search, host-name,
    netbios-name-servers, netbios-scope, interface-mtu,
    rfc3442-classless-static-routes, ntp-servers;
    #require subnet-mask, domain-name-servers;
    #timeout 60;
    #retry 60;
    #reboot 10;
    #select-timeout 5;
    #initial-interval 2;
    #script "/etc/dhcp3/dhclient-script";
    #media "-link0 -link1 -link2", "link0 link1";
    #reject 192.33.137.209;

    #alias {
    # interface "eth0";
    # fixed-address 192.5.5.213;
    # option subnet-mask 255.255.255.255;
    #}

    #lease {
    # interface "eth0";
    # fixed-address 192.33.137.200;
    # medium "link0 link1";
    # option host-name "andare.swiftmedia.com";
    # option subnet-mask 255.255.255.0;
    # option broadcast-address 192.33.137.255;
    # option routers 192.33.137.250;
    # option domain-name-servers 127.0.0.1;
    # renew 2 2000/1/12 00:00:01;
    # rebind 2 2000/1/12 00:00:01;
    # expire 2 2000/1/12 00:00:01;
    #}

    ReplyDelete
  42. @小高子:还是不行。

    ReplyDelete
  43. @ero 你试试"ping 8.8.8.8", 如果可以的话, 应该还是DNS问题.

    ReplyDelete
  44. @小高子:

    ping 8.8.8.8

    connect: Network is unreachable

    ReplyDelete
  45. @ero ...这已经不是DNS问题了, 看来是你的网络有问题. 你再试下ping你的主机.

    ReplyDelete
  46. @在Vbox环境下应该不需要重启网卡吧? 因为不用更改DNS,用ifconfig可以查看当前DNS server确为8.8.8.8

    如果直接尝试浏览youtube,则毫无反应,syslog也没有任何输出。难道iptables没有被启用?

    ReplyDelete
  47. @ero 先在虚拟机里ping主机, 能ping通之后, 再ping外网IP, 比如8.8.8.8, 最后ping域名, 比如g.cn, 以上测试都通过之后应该就解决了. 关于iptables你可以用"sudo iptables -L"查看设置是否成功.

    ReplyDelete
  48. @小高子:
    安装没有问题,网络也没有问题(不重启网卡),iptables也启用了。估计和NAT有关。
    google code上的项目主页上也有人发现该软件在NAT下无法正常工作,原因是某些NAT的实现不遵循RFC。:(
    估计要改iptables的配置,这个我就不会了。

    ReplyDelete
  49. @ero 哦, 那就麻烦了, "sudo iptables -t nat -L"倒是可以看NAT设置, 不过你的情况我也不是很了解, :(

    ReplyDelete
  50. @小高子:最奇怪的是连被gfw重置的log也看不到。我在怀疑该软件的运行状态。

    ReplyDelete
  51. 不知是不是找到问题了,
    用iptables -t nat -L的结果是:
    Chain PREROUTING (policy ACCEPT)
    target prot opt source destination

    Chain POSTROUTING (policy ACCEPT)
    target prot opt source destination

    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination

    说明没有启用西厢模块。


    直接调用iptables -L的结果则为:

    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    ZHANG tcp -- anywhere anywhere tcp spt:www flags:FIN,SYN,RST,ACK/SYN,ACK state ESTABLISHED match-set NOCLIP src /* client-side connection obfuscation */
    CUI tcp -- anywhere anywhere tcp dpt:www flags:FIN,SYN,RST,ACK/SYN state NEW match-set CHINA src /* server-side connection obfuscation */
    LOG tcp -- anywhere anywhere tcp spt:www state ESTABLISHED gfw /* log gfw tcp resets */ LOG level info prefix `gfw: '
    DROP udp -- anywhere anywhere udp spt:domain state ESTABLISHED gfw /* drop gfw dns hijacks */

    Chain FORWARD (policy ACCEPT)
    target prot opt source destination

    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination

    ReplyDelete
  52. @ero 首先是保证你能通过虚拟机访问Internet, 如果这条都不能满足的话, 连GFW的面都见不到.

    至于"iptables -t nat -L"显示的信息, 这个跟西厢没有联系的, 西厢不涉及NAT的配置. NAT只是跟你的虚拟机上网有关.

    ReplyDelete
  53. 9.10无法安装,我把出问题的地方发到这里,麻烦 @小高子 去看看http://picasaweb.google.com/miarts/XIXIANGJIHUA# 谢谢了!

    ReplyDelete
  54. @小高子:还是多谢关心,除了最开始的一点麻烦以外,我的回答是基于我的虚拟机能够访问internet的事实说的。具体来说,虚拟机目前的状态跟没装西厢一个样。

    ReplyDelete
  55. @miarts 我已经把解决方法写到你的相册里了: http://picasaweb.google.com/miarts/XIXIANGJIHUA#5450770786640658962

    ReplyDelete
  56. @ero 你试试分别在打开西厢和关闭的情况下ping外网

    ReplyDelete
  57. @ero 那是什么结果? 都不能ping通外网?

    ReplyDelete
  58. @都能.
    可以上网,但不能访问Youtube等GFW网站。最要命的是,syslog并没有记录GFW重置的消息,之前这句还是被正确执行了的:
    sudo iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -m gfw -j LOG --log-level info --log-prefix "gfw: " -m comment --comment "log gfw tcp resets"

    ReplyDelete
  59. 同是SSH-D翻墙来顶帖.....期待win版尽快出现..

    btw: mac 下可以玩么?可以的话回家可试试。

    ReplyDelete
  60. 还要一条aptitude build-dep xtables-addons-common生成依赖文件,安装包里的INSTALL比较详细.

    本人的显卡比较杯具不支持Linux,所以只能装在VM里试,如果用路由拨号的话,会把那条伪装请求过滤掉,使浏览器假死.如果直接ADSL拨号的话,就没有问题了.YTB可上,连FACE都神奇地能上了,只有推依然杯具...

    另外,VM里用的是默认输入法,打得好累啊...

    ReplyDelete