Total Pageviews

Tuesday, 14 June 2016

利用又一个基于rust的“stunnel"翻墙

首先在linux vps上搭建rust环境:
curl -sSf https://static.rust-lang.org/rustup.sh | sh -s -- --channel=nightly
(必须是nightly版。不要安装stable版,即不要运行:
curl -sf -L https://static.rust-lang.org/rustup.sh | sh
否则下面安装"stunnel"会遇到错误)
运行命令后,显示:
...
install: creating uninstall script at /usr/local/lib/rustlib/uninstall.sh

install: installing component 'rustc'

install: installing component 'rust-docs'

install: installing component 'cargo'

    Rust is ready to roll.

则表明安装成功。参见http://briteming.blogspot.com/2015/11/rust.html

然后,
git clone https://github.com/airtrack/stunnel stunnel-by-airtrack
cd stunnel-by-airtrack

root@AR:~/stunnel-by-airtrack# ls
Cargo.toml README.md  src

root@AR:~/stunnel-by-airtrack# cargo build --release
root@AR:~/stunnel-by-airtrack# ls
Cargo.lock  Cargo.toml README.md  src target
( 生成了target目录)
root@AR:~/stunnel-by-airtrack# cd target
root@AR:~/stunnel-by-airtrack/target# ls
release
root@AR:~/stunnel-by-airtrack/target# cd release
root@AR:~/stunnel-by-airtrack/target/release# ls
build  client  deps  examples  libstunnel.rlib native server
root@AR:~/stunnel-by-airtrack/target/release# nohup ./server 0.0.0.0:7288 mykey > /dev/null &
这样,服务器端就搭建好了。

在客户机器上。
作者未提供windows下的客户端程序。只能在linux桌面系统下或mac下,自己编译rust环境。
brew install curl (ubuntu桌面系统下,为apt-get install curl)
curl -sSf https://static.rust-lang.org/rustup.sh | sh -s -- --channel=nightly
(必须是nightly版。不要安装stable版,即不要运行:
curl -sf -L https://static.rust-lang.org/rustup.sh | sh 
运行命令后,显示:
...
install: creating uninstall script at /usr/local/lib/rustlib/uninstall.sh

install: installing component 'rustc'

install: installing component 'rust-docs'

install: installing component 'cargo'

    Rust is ready to roll.

则表明安装成功。
然后,
git clone https://github.com/airtrack/stunnel stunnel-by-airtrack
cd stunnel-by-airtrack

yudeMacBook-Air:stunnel-by-airtrack brite$ ls
README.md src
Cargo.toml

yudeMacBook-Air:stunnel-by-airtrack brite$ cargo build --release
yudeMacBook-Air:stunnel-by-airtrack brite$ ls
Cargo.lock README.md target
Cargo.toml src
(生成了target目录)
yudeMacBook-Air:stunnel-by-airtrack brite$ cd target/release
yudeMacBook-Air:release brite$ ls
build deps libstunnel.rlib server
client examples native
yudeMacBook-Air:release brite$ nohup ./client server_ip:7288 mykey 1 > /dev/null &
(这里7288是我指定的服务器的端口号。mykey为我自己设置的一个字符串,跟服务器上所设置的mykey的值要一致。)
这样客户端就搭建好了。
然后设置浏览器的socks5代理为127.0.0.1:1080,即可翻墙。

若要修改本地的client程序所监听的端口,可修改~/stunnel-by-airtrack/src/bin/client.rs文件的第143行里的1080为其他端口,比如2080.
(我测试了,修改无效。即使改为2080,然后设置浏览器的socks5代理为127.0.0.1:2080,其实是翻不了墙的,而设置浏览器的socks5代理为127.0.0.1:1080,却翻墙成功。)所以没必要修改本地的端口了。

项目地址:https://github.com/airtrack/stunnel/

注意:这个stunnel跟著名的stunnel.org毫无关系,只是同名而已。
---------------
程序作者解释的原理:

编译和使用
现代语言一般都自带编译工具,不用折腾make cmake等东西,Rust官方提供了Cargo,所以编译很简单,安装好Cargo,然后到源码目录下Cargo build就完成了。
编译完成得到两个可执行文件,分别是:client和server。server启动在服务器上,client启动在本机并绑定到地址127.0.0.1:1080,浏览器由代理插件通过SOCKS v5协议连接这个地址即可。
Tunnel逻辑结构
下面是逻辑图:
            .                      |                     .
            .                      f                     .
            .                      i                     .
port1 ------|                      r                     |------ port1
            |                      e                     |
            |                      |                     |
port2 ---client---------------- tunnel ----------------server--- port2
            |                      |                     |
            |                      w                     |
port3 ------|                      a                     |------ port3
            .                      l                     .
            .                      l                     .
            .                      |                     .
Client和Server之间通过一条TCP链接相连,客户端每收到一个TCP请求就开一个port处理,同时在Server上有一个port与之对应,这样就在Client和Server之间建立了一个会话层,这个TCP链接的数据全部都在对应的port里传输。
Tunnel本身跟SOCKS v5不相关,为了让浏览器代理能连上,Client提供了SOCKS v5中最简单的NO AUTHENTICATION TCP方法,即无用户名和密码的TCP代理。

Client和Server之间传输的数据都加了密,加密算法是Blowfish,工作模式是Counter Modeclientserver启动时的参数Key即加密算法的Key。