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
或者这样安装rust环境也可:
wget https://static.rust-lang.org/dist/rust-nightly-x86_64-unknown-linux-gnu.tar.gz
tar zxvf rust-nightly-x86_64-unknown-linux-gnu.tar.gz
cd rust-nightly-x86_64-unknown-linux-gnu


root@ar:~/rust-nightly-x86_64-unknown-linux-gnu# ls
COPYRIGHT rls-preview
LICENSE-APACHE rust-analysis-x86_64-unknown-linux-gnu
LICENSE-MIT rust-docs
README.md rust-installer-version
cargo rust-std-x86_64-unknown-linux-gnu
components rustc
git-commit-hash  rustfmt-preview
install.sh version

root@ar:~/rust-nightly-x86_64-unknown-linux-gnu# chmod 755 install.sh
root@ar:~/rust-nightly-x86_64-unknown-linux-gnu# ./install.sh
这样,rust环境就装好了。
root@ar:~# which cargo
/usr/local/bin/cargo
root@ar:~# which rustc
/usr/local/bin/rustc
root@ar:~#
(参考https://www.rust-lang.org/zh-CN/other-installers.html)

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

root@RegalMusty-VM:~/rust-stunnel# ls
Cargo.toml  README.md  src
root@RegalMusty-VM:~/rust-stunnel# cargo build --release
root@RegalMusty-VM:~/rust-stunnel# ls
Cargo.lock  Cargo.toml  README.md  src  target
(生成了target目录)
root@RegalMusty-VM:~/rust-stunnel# cd target
root@RegalMusty-VM:~/rust-stunnel/target# ls
release
root@RegalMusty-VM:~/rust-stunnel/target# cd release
root@RegalMusty-VM:~/rust-stunnel/target/release# ls
build     incremental      native            stunnel_server
deps      libstunnel.d     stunnel_client    stunnel_server.d
examples  libstunnel.rlib  stunnel_client.d
root@RegalMusty-VM:~/rust-stunnel/target/release# ./stunnel_server -l 0.0.0.0:7288 -k my-key 
这不是以daemon方式运行。我们可以利用systemd,来把以上命令运行为service:
nano /etc/systemd/system/rust-stunnel.service
其内容为:
[Unit]
After=network.target

[Service]
ExecStart=/root/rust-stunnel/target/release/stunnel_server -l 0.0.0.0:7288 -k my-password
Restart=always

[Install]
WantedBy=multi-user.target


然后运行:
sytemctl start rust-stunnel
sytemctl enable rust-stunnel
这样,服务器端就搭建好了。

在客户机器上。
作者未提供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 rust-stunnel
cd rust-stunnel

yudeMacBook-Air:rust-stunnel brite$ ls
README.md src
Cargo.toml
yudeMacBook-Air:rust-stunnel brite$ cargo build --release
yudeMacBook-Air:rust-stunnel brite$ ls
Cargo.lock README.md target
Cargo.toml src
(生成了target目录)
yudeMacBook-Air:rust-stunnel brite$ cd target/release
yudeMacBook-Air:release brite$ ls
build            libstunnel.d        stunnel_client.d
deps            libstunnel.rlib        stunnel_server
examples        native            stunnel_server.d
incremental        stunnel_client
yudeMacBook-Air:release brite$ ./stunnel_client -s my-vps-ip:7288 -k my-key -c 2 -l 127.0.0.1:3080 
(这里7288是我的vps的端口号。my-key为我自己设置的一个字符串,跟服务器上所设置的my-key的值要一致。"-c"的值要最小设为1,我设为了2)
这样客户端就搭建好了。
然后设置浏览器的socks5代理为127.0.0.1:3080,即可翻墙。

项目地址: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。