2015年2月19日星期四

CentOS下shadowsocks-libev一键安装脚本

本脚本适用环境:
系统支持:CentOS 6.x 32或64位
内存要求:≥128M
日期:2014年07月12日
关于本脚本:
一键安装 libev 版的 shadowsocks 最新版本。该版本的特点是内存占用小(600k左右),低 CPU 消耗,甚至可以安装在基于 OpenWRT 的路由器上。
默认配置:
服务器端口:8989
客户端端口:1080
密码:自己设定(如不设定,默认为teddysun.com)
使用方法:
使用root用户登录,运行以下命令:
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh
chmod +x shadowsocks-libev.sh
./shadowsocks-libev.sh 2>&1 | tee shadowsocks-libev.log
安装完成后,脚本提示如下:
Congratulations, shadowsocks-libev install completed!
Your Server IP:your_server_ip
Your Server Port:8989
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:http://teddysun.com/357.html
Enjoy it!
卸载方法:
使用 root 用户登录,运行以下命令:
./shadowsocks-libev.sh uninstall
其他事项:
客户端配置的参考链接:http://teddysun.com/339.html
安装完成后即已后台启动 shadowsocks ,运行:
ps -ef | grep ss-server | grep -v ps | grep -v grep
可以查看进程是否存在。
本脚本安装完成后,会将 shadowsocks-libev 加入开机自启动。
使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
查看状态:/etc/init.d/shadowsocks status
特别说明:
1、已安装旧版本的 shadowsocks 需要升级的话,需下载本脚本的最新版,运行卸载命令./shadowsocks-libev.sh uninstall 后,再次执行本脚本即可安装最新版。
2、关于 CentOS 的默认 iptables 防火墙规则 icmp-host-prohibited ,如果安装之后发现已经启动 shadowsocks,本地客户端却不能连接上,请检查 iptables 是不是有如下的一条规则:
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
运行命令:
/etc/init.d/iptables status 
可以查看。如果有这条规则,则添加的 8989 端口需手动更改一下,放到这条规则的上一行。编辑 /etc/sysconfig/iptables 文件,将:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT
放在:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
的前面。最终效果如下:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
编辑完后,重启 iptables 防火墙。命令:/etc/init.d/iptables restart

http://teddysun.com/357.html

CentOS下pip和shadowsocks的安装使用

Pip是安装Python包的工具,提供了安装、列举已安装包、升级以及卸载包的功能。Pip 是对easy_install的取代,提供了和easy_install相同的查找包的功能,因此可以使用easy_install安装的包也同样可以使用pip进行安装。
目前有很多Python程序都是可以直接通过Pip来一键安装了,比如众所周知的Django、Markdown、Shadowsocks等。
简要介绍一下Pip的用法(以安装Shadowsocks举例):
1、安装package
pip install shadowsocks
2、列出已安装的packages
pip freeze
3、安装特定版本的package
pip install shadowsocks=1.3.3′
pip install shadowsocks>1.0,<1.3.3′
4、升级已安装的package到最新版本
pip install -U shadowsocks
5、卸载已安装的package
pip uninstall shadowsocks
6、查询已安装的package
pip search “shadowsocks”
安装Pip之前必须要先安装setuptools,安装setuptools之前,必须要安装了Python,这之间的安装过程存在依赖关系,缺一不可。因此,整个过程还是比较麻烦的。
1、 检查Python版本
python –version
CentOS6.5默认安装的Python版本是2.6.6,返回值为:Python 2.6.6
2、 安装setuptools
yum install -y python-setuptools
安装完毕后,easy_install命令就可以使用了。
3、 安装pip
easy_install pip
通过easy_install安装pip是最为简单的方法。pip默认安装到/usr/bin目录下。
4、 安装shadowsocks
pip install shadowsocks
Shadowsocks的配置和使用
至于Shadowsocks可以拿来做什么,这里就毋须赘述了。直接开始吧。
1、 创建Shadowsocks的配置文件:
CentOS下通过vim创建该配置,运行命令:
vi /etc/shadowsocks.json
内容如下:
{
    "server":"your_server_ip",
    "server_port":8989,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"yourpassword",
    "timeout":600,
    "method":"aes-256-cfb",
    "fast_open": false,
    "workers": 1
}
各字段的含义:
server:服务器 IP (IPv4/IPv6),注意这也将是服务端监听的 IP 地址
server_port:监听的服务器端口
local_address:本地监听的 IP 地址
local_port:本地端端口
password:用来加密的密码
timeout:超时时间(秒)
method:加密方法,可选择 “bf-cfb”, “aes-256-cfb”, “des-cfb”, “rc4″, 等等。默认是一种不安全的加密,推荐用 “aes-256-cfb”
fast_open:true 或 false。如果你的服务器 Linux 内核在3.7+,可以开启 fast_open 以降低延迟。开启方法:
echo 3 > /proc/sys/net/ipv4/tcp_fastopen
开启之后,将 fast_open 的配置设置为 true 即可。
works:works数量,默认为 1
2、 安装M2Crypto
默认加密方法 table 速度很快,但很不安全。推荐使用 “aes-256-cfb” 或者 “bf-cfb”。请不要使用 “rc4″,它不安全。如果选择 “table” 之外的加密,需要安装 M2Crypto。
先安装依赖包:
yum install -y openssl-devel gcc swig python-devel autoconf libtool
安装setuptools:
wget --no-check-certificate https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
python ez_setup.py install
再通过pip安装M2Crypto:
pip install M2Crypto
3、 安装 gevent
安装 gevent可以提高 Shadowsocks 的性能。CentOS下安装gevent依赖libevent和greenlet。
安装libevent:
yum install -y libevent
安装greenlet:
pip install greenlet
安装gevent:
pip install gevent
4、 命令行参数(服务器端启动命令)
ssserver -c /etc/shadowsocks.json
如果想在后台一直运行Shadowsocks,启动命令如下:
nohup ssserver -c /etc/shadowsocks.json > /dev/null 2>&1 &
备注:关于nohup,是可以让程序在后台运行的命令。
同时可以用命令行参数覆盖 /etc/shadowsocks.json 里的设置:
sslocal -s 服务器地址 -p 服务器端口 -l 本地端端口 -k 密码 -m 加密方法
ssserver -p 服务器端口 -k 密码 -m 加密方法
备注:sslocal是客户端程序;ssserver是服务端程序。
5、 防火墙设置(如有)
编辑防火墙配置文件/etc/sysconfig/iptables,将服务器端口(server_port)放行。
新增一条防火墙规则:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8989 -j ACCEPT
重启防火墙iptables:
service iptables restart
至此,服务器端的 Shadowsocks 安装和配置完毕。
6、客户端配置
Windows客户端有图形界面也有命令行,我们这里以配置图形化界面的shadowsocks-csharp为例说明。
下载客户端shadowsocks-csharp(最新版1.1.2):
https://shadowsocks-csharp.googlecode.com/files/shadowsocks-csharp-1.1.2.zip
解压至任意目录下,双击shadowsocks-csharp.exe运行程序,各参数选项填入:
Server IP:   服务器 IP (IPv4/IPv6),填入在服务器端设置的IP地址(server)
Server Port: 服务器端口,填入在服务器端设置的端口号(server_port)
Password:    用来加密的密码,填入在服务器端设置的加密密码(password)
Proxy Port:  本地端代理的端口,填入在服务器端设置的本地端端口(local_port)
Encryptor:   加密方法,填入在服务器端设置的加密方法(method)
注意:本地客户端填写的参数一定要与服务器端设置的一致才可以。
另有一款客户端 shadowsocks-gui (推荐)可供选择,下载地址:
https://sourceforge.net/projects/shadowsocksgui/files/dist/
下面就可以利用浏览器插件无障碍浏览国外网站了。插件的设置过程这里略过。
AutoProxy(用于Firefox)、Proxy SwitchySharp(用于Chrome)


http://teddysun.com/339.html

CentOS下shadowsocks一键安装脚本

本脚本适用环境:
系统支持:CentOS 6.x 32或64位
内存要求:≥64M
日期:2015年01月21日
关于本脚本:
一键安装 Python 版 shadowsocks 的最新版,同时安装了 Python 包管理工具 pip。
默认配置:
服务器端口:8989
客户端端口:1080
密码:自己设定(如不设定,默认为teddysun.com)
备注:脚本默认创建单用户配置文件,如需配置多用户,安装完毕后参照下面的教程 sample 手动修改配置文件后重启即可。
使用方法:
使用root用户登录,运行以下命令:
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log
安装完成后,脚本提示如下:
Congratulations, shadowsocks install completed!
Your Server IP:your_server_ip
Your Server Port:8989
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:http://teddysun.com/342.html
Enjoy it!
卸载方法:
使用root用户登录,运行以下命令:
./shadowsocks.sh uninstall
单用户配置文件sample(2015年01月21日修正):
配置文件路径:/etc/shadowsocks.json
{
    "server":"your_server_ip",
    "server_port":8989,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"yourpassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}
多用户多端口配置文件 sample(2015年01月21日修正):
配置文件路径:/etc/shadowsocks.json
{
    "server":"your_server_ip",
    "local_address": "127.0.0.1",
    "local_port":1080,
    "port_password":{
         "8989":"password0",
         "9001":"password1",
         "9002":"password2",
         "9003":"password3",
         "9004":"password4"
    },
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}
使用命令(2015年01月21日修正):
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status
更新日志:
(2015年01月21日)
1、修正配置文件,与官方给出的 sample 一致;
2、修改启动脚本,使用官方给出的后台启动和停止命令。
(2014年10月10日)
跟作者反馈了多用户多端口问题,作者已更新 Wiki 页面。本教程新增多用户多端口配置文件的 sample 。
(2014年09月24日)
如何配置多用户?详见:这里
备注:Shadowsocks 已经支持多用户,在配置文件中增加不同的端口,对应不同的密码即可。
(2014年09月18日)
1、安装完成一段时间后,执行下面的命令可以升级到最新版本。
pip install -U shadowsocks
注意升级完成后需要再重启一下。
(2014年07月12日)
1、修正获取公网 IP 时的一个问题。建议不要使用共享公网 IP 的 VPS 来搭建 Shadowsocks 服务。
(2014年05月29日)
1、增加 chkconfig 配置,实现 service 命令。
2、配置文件名从 /etc/config.json 改为 /etc/shadowsocks.json(与官方的命名一致)。
3、配置文件中新增 workers ,值默认为 1(与官方配置同步)。
(2014年05月27日)
1、修正开机自启动失效的问题。
2、优化是否后台启动成功的判断逻辑。
(2014年05月04日)
1、修正对增加防火墙端口逻辑的判断bug,对于已经放行 8989 端口的情况下,则无需再次增加。
2、修正获取服务器 IP 的判断bug,对于多 IP 的 VPS 或服务器,默认只取第一个公网 IP 写到配置文件(/etc/config.json)里。
3、加入开机自启动。
特别说明:
1、已安装旧版本的 shadowsocks 需要升级的话,直接运行 pip install -U shadowsocks 即可,升级完成后需重启。
2、关于 CentOS 的默认 iptables 防火墙规则 icmp-host-prohibited ,如果安装之后发现已经启动 shadowsocks,本地客户端却不能连接上,请检查 iptables 是不是有如下的一条规则:
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
运行命令:
/etc/init.d/iptables status 
如果有这条规则的话,则添加的 8989 端口需手动更改一下,放到这条规则的上一行。编辑 /etc/sysconfig/iptables 文件,将:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT
放在:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
的前面。最终效果如下:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
编辑完后,重启 iptables 防火墙。命令:/etc/init.d/iptables restart

http://teddysun.com/342.html

SSL/TLS的原理以及互联网究竟是如何工作的(7) ————IP和他的情人

 
SSL/TLS的原理以及互联网究竟是如何工作的(7)
                                                                             ————IP和他的情人

我:啊呀,情人节到了啊,只可惜我根本就没法过:( 又有段时间没来这里了,大局域网的消息依旧被传得很火热,还有人担心MAC地址会泄露身份,以及一批人不明白前置代理是怎么回事,问题真多啊!

IP:啊,是你啊。情人节快乐!(和一个身份不明的家伙牵着手)

我:情人节不快乐!你旁边那家伙是谁啊?

IP:哈哈,对不起啊,不小心刺激到你了。介绍一下,这是ARP(Address Resolution Protocol,地址解析协议),是我的好伙伴哦,我必须要在他的帮助下才能应对局域网呢。

我:地址解析协议?这家伙和DNS什么关系啊?

IP:他和DNS一点关系都没有,都工作在不同的层上好吧!对了,上次我说会找一些应对NAT的手段[1],我翻阅了一些资料,稍微有了一些眉目:

1,像webRTC的STUN协议[2]那样借助于第三方服务器的帮助,是一种办法,但会造成严重的安全隐患,而且某种意义上破坏了P2P(完全的P2P是不需要第三方服务器的);

2,NAT工作在第三层网络层,实质上是一种代理[3],所以那些工作在网络层之下的VPN们可以轻易刺穿NAT(也就是说常见的PPTP,L2TP,SSTP等工作在数据链路层上的VPN协议工作时不会受到NAT困扰)。当然,其他工作在网络层之下的程序也不会被NAT困扰,P2P软件可以考虑一下。

3,进行端口转发[4],让本来躲在NAT之后的设备变得可见,需要对网关进行设置,让外部设备知道网关地址和对应设备的端口从而建立连接。

我:等一下,IP,为什么说工作在数据链路层的VPN可以轻易刺穿NAT呢?

IP:你觉得这些层在工作的时候是如何互相配合的?

我:流水线的形式?

IP:......对于发起连接的一端来说,是从上到下的洋葱形式:应用层协议先封装好数据,然后交给传输层(咱先讨论一般情况,代理协议这些不算在内)的TCP或UDP,再次封装之后交给网络层,被封装为IP数据报,然后再在网卡驱动的帮助下被封装为帧,最后转变为物理信号发送出去。这一过程实际上就是不断增加头部(帧是有尾部的)的过程,就好象一层层包上洋葱皮一样。而工作在数据链路层的VPN协议则是将数据封装为了特殊的帧,根据帧头部的地址寻址而不是IP地址,那么自然就能轻易穿透NAT了(请注意是虚拟的帧不是物理的帧,物理帧头部的地址还是你的MAC地址)。说起MAC地址......

ARP:咳咳,该我出场了!很多人都以为只需要IP地址就能完成网络通信了,其实不是的,局域网的话是必须要配合MAC地址才能完成点对点的通信。想起来了吗?数据链路层就是负责点对点的通信的[5],而MAC(Media Access Control,介质访问控制)则是数据链路层的一个子层(另一个子层是逻辑链路控制子层),这一层处于软件和硬件的交界处,负责对上层屏蔽物理介质的差异(也就是说,不管你用的是无线还是ADSL还是光纤,上层协议都不用管,怎样都能正常工作)。

我:数据链路层的工作是网卡负责的吧?

ARP:对,网卡驱动发挥了重要作用。顺便说一句,网卡的全名叫做网络接口卡(Network Interface Card),每个网卡都自带一个独一无二的硬件地址,就是MAC地址。MAC地址总共有48位,也就是说可以唯一性标定2^48个设备,迄今为止MAC地址还是很充足的,预计在2100年左右耗尽。[6]

接下来该说说我的工作流程了:首先,我向局域网中所有设备吼一嗓子:“喂,你们当中的谁是这个IP地址的所有者?我需要你的MAC地址!”(广播)然后那个家伙听到了之后就回应:“喂,是我,我的MAC地址是12-34-56-78-9A-BC(IPv4地址是点分十进制,而MAC地址是短线分十六进制)”然后就可以建立连接了!

我:原来是这样。对了,我似乎从来都没有听说过谁因为MAC地址被查水表了,这是怎么回事?照你的说法,MAC地址也是唯一的啊,很多品牌机销售商都会把顾客身份和MAC地址捆绑在一起,这不是可以拿来查水表吗?

ARP:首先,MAC地址是可以手动修改的,百度一下都有一大堆教程[7],就算登记也没用啊:) 啊,你可能比较好奇你访问的网站能不能知道你的MAC地址吧,答案是:没可能知道!因为......

IP:这里该我出场了!你的数据要经过N个路由器才能到达目标网站,而路由器这家伙工作在网络层上:简单来说,路由器的工作流程就是存储——转发:路由器接收到了数据帧,很好!然后就剥离帧头和帧尾,露出IP头,再查看目的地IP地址,接着用动态路由协议算出最短路径(根据hop数和传播延迟以及其他一些参数),然后根据路由表,将数据包重新封装成帧,转发出去。

“剥离帧头和帧尾”,也就是说你的MAC地址这会儿就被过滤掉了,那么经过了N个路由器之后,到达目标网站的数据帧的MAC地址早就不是你的MAC地址了,目标网站上哪知道你的MAC地址去呢?如果是经过代理就更加不用担心了,代理服务器连IP头都修改掉了,还会不修改帧头?

不过在有一种情况下MAC地址存在危险性:Wi-Fi(大名IEEE802.11无线局域网标准),因为在无线局域网之下多台设备是共用一个IP地址的,此时靠广播传播数据(所以此时你的数据很容易被窃取),而接入点会记录下使用者的MAC地址,事后有被定位的可能。

我:这样啊,那我就放心了。

IP:我听你提起很多人不明白前置代理是怎么回事,那么我就再受累解答一下吧:这得先从代理说起。VPN是通过修改系统路由表的方式自动把操作系统内所有数据路由到虚拟网卡上再进行封装的[8],而常见的赛风啊,shadowsocks,Tor,自由门无界,goagent这些就没有那么大的本事了。使用这些翻墙软件时都需要对浏览器设置代理(有的软件已经把这一步自动化了,但是本质并没有改变),这一步究竟有着什么样的意义呢?

我们就以shadowsocks为例吧:shadowsocks启动之后,首先与远程服务器建立连接,同时在本地PC上建立一个local proxy,这个local proxy默认监听本机的1080端口。我们将浏览器代理设置为127.0.0.1 1080(127.0.0.1表示本机),实际上就是强制浏览器发起连接时把数据先交给监听1080端口的local proxy,然后local proxy用自己的协议处理数据,再将处理后的数据发送到远程服务器上,最后远程服务器冒充客户端与目标网站建立连接。

其他需要设置浏览器代理的翻墙软件也是一样的原理,具体过程就是:浏览器——》本机上的local proxy——》远程服务器——》目标网站。

前置代理无非是多了一步而已,以shadowsocks+Tor为例,过程是:浏览器——》本机上的onion proxy(Tor的本机代理,监听端口为9150)——》本机上的local proxy(shadowsocks的本机代理,监听端口为1080,在此之前已经设置好Tor的前置代理是shadowsocks)——》shadowsocks远程服务器——》Tor入口节点——》Tor中间节点——》Tor出口节点——》目标网站

我:也就是说此时我的数据先被Tor协议处理,再被shadowsocks协议处理,所以shadowsocks远程服务器除了我的真实IP和Tor入口节点的IP之外其他什么都不知道,没错吧?

IP:没错,就是这样。在这种情况下前置代理本身的安全性其实无所谓了,不过我还是不推荐国产VPN,因为那个自带的客户端可能会干出扫描硬盘之类的破事外加很多人都报告说国产VPN根本就把Tor节点给屏蔽了[9]。

我:对了,关于webRTC事件,最近有人反映Chrome的webRTC Block扩展失效了,不过我测试发现这扩展还是成功阻止了我的公网IP的泄露的。对于Chrome的粉丝来说,应该怎么办呢?

IP:没有好办法,要么全局禁用JavaScript[10],要么改用firefox吧。Tor Browser是默认禁用了webRTC的,是个不错的选择。对了,期待下次你能带男朋友过来:)

我:(生气的表情)我不需要男朋友!

IP:好吧,不过不管你带不带男朋友,都欢迎你来做客!

科普文链接集合:https://plus.google.com/109790703964908675921/posts/TpdEExwyrVj

参考资料:
1,SSL/TLS的原理以及互联网究竟是如何工作的(6)
                                                                    ——嘿,我是IP!
https://plus.google.com/109790703964908675921/posts/8GLWQxp5yJN
2,破坏匿名的凶手——WebRTC
https://plus.google.com/109790703964908675921/posts/1KjRdwo3jid
3,“在代理人的帮助下,我们来到了自由的互联网”(1)
https://plus.google.com/109790703964908675921/posts/5kWkXKdysQz
4,https://en.wikipedia.org/wiki/Port_forwarding
5,SSL/TLS的原理以及互联网究竟是如何工作的(1)
                                    ————“每个协议生而平等”
https://plus.google.com/109790703964908675921/posts/jew5dx6V2Lt
6,https://en.m.wikipedia.org/wiki/Media_access_control_address
7,http://blog.sina.com.cn/s/blog_62106c8e0100g1cq.html
8,翻墙软件的选择与安全系数(8)
                                                 ————VPN是什么?
https://plus.google.com/109790703964908675921/posts/h7zyq2jvbqY
9,VPN翻墙,不安全的加密,不要相信墙内公司https://plus.google.com/109790703964908675921/posts/AXgoJutf5sz
10,"We Feel Safe in a Dangerous Place"(1)
                                                               ————强大而危险的JavaScript
 https://plus.google.com/109790703964908675921/posts/USnmvAgSas1

TOR与GFW的PK(5) ————被抛弃的Dust

TOR与GFW的PK(5)
                                 ————被抛弃的Dust

话说最近的封锁真的是越来越厉害了,翻墙工具们纷纷倒下,不过Tor的MEEK插件和obfs4网桥(经本人测试,默认集成的网桥已经被屏蔽了,请去这里[1]获取可用网桥)依旧坚挺。对于Tor团队的辛勤工作,本幽灵在此表示感谢!

Tor有MEEK,obfs4,obfs3,FTE,scrambleSuit这些整合在Tor Bowser Bundle里的插件,我在之前的系列里已经一一介绍过了。不过其实Tor团队还开发了三种流量混淆插件:StegoTorus,SkypeMorph,Dust,但是后来不知为什么都被弃用了。其中StegoTorus和SkypeMorph插件已经从2012年开始就停止更新了,而Dust却一直在github上持续更新着[2]。我看了一下Dust的设计文档,觉得提供了一种不错的翻墙思路,特此进行详细介绍。

在正式开始之前,我想问大家一个问题:对翻墙工具应该提什么样的要求?

”翻墙工具应该设置简便,用户友好,最好能做到一键翻墙!“

幽灵评价:没错,如果翻墙工具的设置太过复杂,那么大部分人就都会放弃翻墙的,不利于发展翻墙党党员:)

”翻墙工具应该尽可能免费,即使要收费,也要把价格控制在一个合理的范围内,最好尽可能利用公共免费服务器。“

幽灵评价:没错,过高的价格也会挡住大多数人,况且大部分人是不愿意付钱的,而且说实在的谁都不该为这堵不该存在的墙付钱。

”翻墙工具最重要的是要足够坚挺,不然三天两头失效谁也受不了“。

幽灵评价:这是最重要的一点,通常来说翻墙工具的坚挺程度主要取决于两点:1,翻墙工具的工作原理;2,翻墙工具的流行程度。越流行的翻墙工具,越容易引起GFW的注意;不过只要在设计时就考虑到GFW的封锁并且设置了相应的对策,那么GFW多数情况下就只能干瞪眼了。

”翻墙速度必须要快,至少也要看youtube720P视频不费力吧!“

幽灵评价:这一点恐怕是大部分翻墙党的默认要求了,我每天都能在G+上看到一群速度党们在比速度。不过我想说的是,除非你是个高清视频发烧友或者重度下载党,否则根本没有任何追求速度的必要,只要能正常浏览网页即可。事实上速度是最不重要的一点,而且高带宽流量是很容易引起GFW的注意的。

免费(或者是学生党也能接受的低价格),坚挺,能正常浏览网页的速度,设置简便,这应该是一个优秀的翻墙软件所应有的特质。

而Dust就是为了其中最重要的特质——坚挺而生的。GFW对于翻墙工具的封锁手段有:人工检查大流量所对应的IP,一旦发现是提供翻墙服务的,就封IP(所以说单纯追求速度不是一个好习惯);自动检测协议指纹,发现匹配的就自动封锁(OPENVPN就是这么死的)[3];主动探测攻击[4];人工搜索免费的翻墙服务然后进行封锁等,其中特征检测(自动检测协议指纹)被越来越频繁的使用,成了一个难对付的敌人(IP封锁成本高且总是滞后,但特征检测却能做到自动即时封锁)。

Dust:”别害怕,有我呢!我就是专门对付这该死的特征检测的!“

”说起来协议指纹识别主要从这几个方面入手:经过协议处理之后的数据包长度,发送时间间隔,结构,以及最重要的:明文的handshake过程。遥想当年曾经风光一时的HTTPS代理,SSH,OPENVPN还有VPNGATE都是死在了handshake上,准确的来说是死在了公钥交换这一步上:一个个全都要求证书,结果就是证书被GFW嗅探出来,然后对应的服务器全部都被一锅端了[5]。就算是设置成不要证书的,本身的协议指纹还是很明显,结果就都悲剧了。“

”除此之外,绝大部分翻墙工具在工作时都会和远程服务器建立长时间的TCP连接(shadowsocks,Tor,SSH,大部分VPN协议等都是如此),而这样就看上去很像是翻墙的了:如果是正常浏览没有被墙的国外网站,那么先是建立TCP连接(前面的DNS查询过程就先略过了),然后再建立HTTP连接,等到网页很快加载好了之后TCP连接就会关闭[6]。也就是说,不会有长时间的TCP连接的。那么那些长时间的TCP连接就有很大可能是翻墙的了。”

而Dust提供了不错的对策[7]:首先,Dust协议会对数据包进行随机的填充处理,这样就会产生随机长度的数据包,从而使得GFW无法从数据包长度这一点下手检测;

然后,Dust使用UDP而不是TCP传输数据包!“UDP?这可是无连接的不可靠协议啊,那难道不进行handshake啦?那么怎么进行公钥交换啊,客户端和服务器端怎么协商会话金钥啊?要知道handshake过程必须是可靠的啊,这一过程中一个数据包都不能丢,要不然就无法完成handshake了好吧?”

“公钥交换还是要进行的,不过的确没有handshake过程了。Dust协议是这样解决公钥交换问题的:首先,Dust服务器要准备一对id-secret(意思就是id和secret是对应的,一个加密,另一个就能解密,当然这里使用的是非对称加密算法),安全的存储起来,后面要用;然后向未知的客户端们发送邀请数据包,邀请内容有:本服务器IP地址,端口,服务器公钥和id。邀请可以被自行设置的密码加密,当然明文也不要紧。然后服务器的操作者就想办法把邀请数据包散布出去(如果加密了,还要带上密码),或者广播,或者以其他什么方式把数据包递到客户端手中。

然后客户端根据收到的邀请,向服务器端发送一个介绍数据包:用从邀请中收到的id对客户端公钥进行加密,在数据包的未加密部分放置部分id。服务器端收到之后就根据未加密部分放置的部分id进行查询,找到对应的secret,然后解密得到客户端公钥,并将公钥放到已知客户端列表中(同时附上客户端IP地址和端口)。这样一来,公钥交换就完成了!”

“接下来客户端和服务器端都用这两个公钥算出会话金钥,数据传递过程就开始了。因为是UDP连接,所以就没有客户端和服务器端的连接(虚电路)了,服务器端只能通过一种别扭的方式接收数据:每当接收到一个数据包时,服务器就将数据包的源IP地址和端口与已知客户端列表进行比对,如果对上了,那就用对应的会话金钥解密;如果没对上,就认为这是介绍数据包然后尝试用对应的secret解密。”

这一过程中的id是随机生成的,而且是一次性的,防止被GFW识别。使用的加密算法也都是很可靠的,暴力破解不靠谱。

不过其实最难办的还是将邀请数据包分发出去这一步,似乎没有什么好办法(你说广播吧,广播也是有范围限制的,不可能让世界各地的客户端都收到;最好能跟P2P软件学习,用DHT的方式让客户端和服务器端取得联系,但具体如何实现我还没有头绪;或者客户端内置一些服务器信息,然后可以及时更新,但这样又会让服务器容易被封杀)。也许这就是Tor团队最终弃用Dust的原因吧!

不过Dust的设计思路还是有着可圈可点之处的,而且一直有人维护更新代码,希望哪天能为翻墙事业尽上一份力。

科普文链接集合:https://plus.google.com/109790703964908675921/posts/TpdEExwyrVj

参考资料:
1,https://bridges.torproject.org/bridges?transport=obfs4
2,https://github.com/blanu/Dust
3,GFW的工作原理(1)
                               ————GFW是如何识别并封锁翻墙工具的https://plus.google.com/109790703964908675921/posts/Qs4mjSQEuh7
4,TOR网桥,主动探测攻击和烧钱的GFWhttps://plus.google.com/109790703964908675921/posts/aLcyVfcH7mP
5,https://gist.github.com/clowwindy/5947691
6,GFW的工作原理(5)
                                ——HTTP,老大哥在看着你!
https://plus.google.com/109790703964908675921/posts/K8zYdnEoG9Z
7,https://github.com/blanu/Dust/tree/master/historical/v1

如果MEEK被屏蔽了......让其复活的方法

  如果MEEK被屏蔽了......

话说去年英勇的Tor团队开发出了一款突破GFW封锁的神器:MEEK插件[1],成功让Tor在天朝复活了。

简单来说MEEK插件的原理就是客户端先与云平台(GAE,amazon,Azure)连接,看上去是访问云平台(front domain),实际上是以云平台作为中介访问MEEK server再连接Tor中继形成Tor电路的。这些云平台很多公司都要使用,所以审查者不敢随意封杀。

但如果审查者还就是什么都不管,把云平台给屏蔽了呢?比如说天朝GFW就直接把GAE给完全屏蔽了,直接使得MEEK-google失效。我也看到有些人反映其他两个MEEK插件在有些地方也连不上了,这时候又应该怎么做呢?

屏蔽云平台最常用的方法就是DNS污染了,这时可以试着把本地连接的DNS服务器设置为国外的DNS服务器,具体请看这里[2]。

不过在我大天朝GFW面前,这种方法通常都是不管用的,那就只能想办法把默认的front domain修改为可用的云平台域名了。具体过程如下:

1,用记事本打开extension-overrides.js文件,文件路径为Browser/TorBrowser/Data/Browser/profile.default/preferences/extension-overrides.js

2,找到以下内容:meek 0.0.2.0:1 url=https://meek-reflect.appspot.com/front=www.google.com
meek 0.0.2.0:2 url=https://d2zfqthxsdq309.cloudfront.net/front=a0.awsstatic.com
meek 0.0.2.0:3 url=https://az668014.vo.msecnd.net/ front=ajax.aspnetcdn.com
现在解说一下里面各项的含义:meek表示传输名,不能省略也不能改动;后面的0.0.2.0:1可以修改为任何值(除了0.0.0.x之外,因为这是Tor内部默认使用的地址);“url=https://az668014.vo.msecnd.net/ ”是MEEK server的域名,GFW封锁它也没有意义;front=ajax.aspnetcdn.com是云平台的域名(front domain),一旦被GFW封锁,MEEK插件就会失效。

3,那么我们看到让MEEK插件复活的关键就在于要把默认的front domain修改成未被屏蔽的域名。例如在天朝google被屏蔽了,但有一些google服务并没有被屏蔽,例如被各大网站广泛使用的Google Analytics和DoubleClick ads,可以试着把front domain换成对应的front=ssl.google-analytics.com或front=www.doubleclick.net,或者还可以寻找其他的google服务的域名。还有就是hosts修改可用的google IP,或者像goagent一样上传,具体看这里[1]

MEEK-amazon也是类似的修改方法,http://www.alexa.com/siteinfo/cloudfront.net这里有一堆可用的域名,大家可以试试,或者也可以自行寻找属于amazon cloudfront的域名。

MEEK-azure也一样,可以搜索一些属于Azure CDN的子域名,例如front=officeimg.vo.msecnd.net

还有一种方法:直接放弃front domain,把MEEK-server改成自己的,例如自己去申请一个免费的国外PHP空间,然后把url=之后的域名换成自己空间的域名,不过需要支持HTTPS

翻译概括自https://lists.torproject.org/pipermail/tor-talk/2015-January/036410.html

最后附上科普文链接集合:https://plus.google.com/109790703964908675921/posts/TpdEExwyrVj

参考资料:
1,TOR与GFW的PK(1)https://plus.google.com/109790703964908675921/posts/CCS4c7jn3t9
2,GFW的工作原理(2)
                                 ————不靠谱的DNS,总是被钻空子
https://plus.google.com/109790703964908675921/posts/Wqz2qrX

转载  https://plus.google.com/109790703964908675921/posts/26zCmDmjYXP

TOR与GFW的PK(1)——MEEK,让Tor复活的英雄!

TOR与GFW的PK(1)
                          ——MEEK,让Tor复活的英雄!

最近对于我们翻墙党来说最好的消息就是TOR复活了。从2010年开始,GFW逐渐把绝大部分TOR中继节点和目录服务器的IP都列入了黑名单,导致TOR无法在墙内独立联网,只能靠网桥,但不少网桥IP也被GFW加入了黑名单,导致这几年TOR的翻墙效果一直都不好。

不过最近出的meek插件和obfs4网桥又成功让TOR复活了,除了这两种,TOR团队还开发了几种流量混淆插件:FlashProxy,FTE(Format-Transforming Encryption,格式转换加密),FTE-IPv6,ScrambleSuit,还有几种停止开发了。

obfs4我已经介绍过了[1],这次我具体说说MEEK,在以后的系列里具体介绍一下其他插件。

先插一件事:我一直在强调当使用TOR+前置代理时,前置代理看到的是强加密的TOR流量,但有些人就想到了一个问题:从前置代理服务器到出口节点,自然是强加密的TOR流量(此时可以把前置代理服务器理解为本机,入口节点只知道代理服务器的IP地址),但从本机到代理服务器的这段路呢?是不是只有翻墙工具提供的加密处理,而对于代理服务器而言能看到明文呢?

答案是:不是,从本机到代理服务器的这段路也是强加密的TOR流量。

这里要引入一个概念:”原生支持HTTPS“。我曾经多次提过不原生支持HTTPS的翻墙工具(如goagent)无法成为TOR的前置代理,为什么呢?

所谓”原生支持HTTPS“简单来说就是当单独使用某一翻墙工具时,你可以直接连接到被墙的HTTPS网站而不用对操作系统做任何改动。对,像goagent那样要导入自己的数字证书就是在对操作系统进行改动(关于这一点,我会在接下来分析各翻墙手段原理及安全性时进行详细说明)。
或者说连接到HTTPS网站时,从本机到目标网站服务器都是TLS强加密[2](我用流程图说明一下这段过程)

对于原生支持HTTPS的翻墙软件来说,在连接HTTPS网站时远程服务器只知道用户连接了哪个网站以及真实IP(一重代理),而完全不知道传输内容(关于这一点,我以后会具体说明其中的原理,现在只要知道这个结论就行了)。

那么TOR+前置代理时情况也是一样的,TOR从设计上就保证了从本机到出口节点都是HTTPS强加密,中间不会有任何解密过程,自然远程服务器也不会知道你的传输内容(前提是翻墙工具要支持原生HTTPS,所以不支持原生HTTPS的GAE类翻墙工具无法成为TOR的前置代理)。


明白了这些,就可以开始说MEEK了。MEEK的原理是将TOR流量伪装成普通的云计算流量从而骗过GFW,成功翻墙。
具体来说就是这样一个过程:本机上的TOR客户端与云计算平台服务器进行通信(GAE,amazon,azure),再与MEEK SERVER进行通信,再先与目录服务器通信获得中继节点信息再连接到入口节点,搭建TOR环路(我在下面给出原理图)。这一段路也是原生支持HTTPS的(TOR自带的流量混淆插件都原生支持HTTPS),而且直到出口节点,你的数据都是被TLS强加密着的,如果目标网站支持HTTPS,还会一直强加密到目标网站服务器为止,除非进行中间人攻击,否则没人知道你干了什么。

MEEK高明的地方就在于GFW无法区分被混淆过的TOR流量和普通云计算流量,但又不敢封杀云计算IP,因为不少墙内公司都依赖这些云计算服务,贸然封封锁会造成严重的经济损失。

(不过事实上已经封杀了GAE,但有解决方案:
1,从这里https://gitweb.torproject.org/pluggable-transports/meek.git/tree/HEAD:/appengine下载app,然后修改google ID(就像修改goagent的proxy.ini一样),然后像goagent一样的方法上传[3]。
2,在https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go下载go_appengine与python,然后修改app.yaml中的google id号(替换里面的“meek-reflect”),然后再上传(运行go_appengine/goapp deploy)。可以像goagent一样上传多个,反正每个ID就1G的流量。
3,最后修改torrc文件,写上: UseBridges 1
 Bridge meek 0.0.2.0:1 url=https://yourapphere.appspot.com/ front=www.google.com
ClientTransportPlugin meek exec ./meek-client --log meek-client.log申请GAE账号是需要手机号的,不过可以绕过[4]

*或者可以直接修改host填上可用的google IP,meek-google就复活了。*)

其他两种meek插件(amazon和azura)分别依赖于amazon和微软的云平台,也是可以自行搭建后给自己用的,不过操作复杂不适合小白,有兴趣的技术党可以看这里[5],里面描述了搭建过程,可以自己试试。

下一篇我会讲讲ScrambleSuit,obfs4和ScrambleSuit的原理有相通之处,诸位就把下一篇当成对于这篇[6]的补充好了。

补充说明:后来Tor开发者又专门叙述了如何应对MEEK被屏蔽,请看https://plus.google.com/109790703964908675921/posts/26zCmDmjYXP

最后照例附上科普文链接集合:https://plus.google.com/u/0/109790703964908675921/about

参考资料:
1,TOR网桥,主动探测攻击和烧钱的GFW
https://plus.google.com/109790703964908675921/posts/aLcyVfcH7mP
2,SSL/TLS的原理以及互联网究竟是如何工作的(3)
                                    ————TLS的专场!
https://plus.google.com/109790703964908675921/posts/NwWoGQ9mcDY
3,http://allinfa.com/goagent-v322-gae.html
4,http://blog.sina.com.cn/s/blog_4c451e0e01018rdx.html
5,MEEK设计文档https://trac.torproject.org/projects/tor/wiki/doc/meek#Distinguishability
6,TOR网桥,主动探测攻击和烧钱的GFW
https://plus.google.com/109790703964908675921/posts/aLcyVfcH7mP