Total Pageviews

Tuesday, 13 March 2018

一个轻量级的网络混淆代理-Lightsocks(这是最早的版本-go版。使用方法见文末的“我的补充说明”)

一个轻量级的网络混淆代理,基于 SOCKS5 协议,可用来代替 Shadowsocks。
  • 只专注于混淆,用最简单高效的混淆算法达到目的;
  • 不会放大传输流量,传输流量更少,更快,占用资源更少(内存占用1M左右,CPU 占用 0.1% 左右);
  • 纯 Golang 编写,跨平台,对Golang感兴趣?请看Golang 中文学习资料汇总
想了解 Lightsocks 的实现原理?请阅读文章:你也能写个 Shadowsocks

安装

releases 页下载最新的可执行文件,注意选择正确的操作系统和位数(Mac 系统内核为 darwin)。 解压后会看到2个可执行文件,分别是:
  • lightsocks-local:用于运行在本地电脑的客户端,用于桥接本地浏览器和远程代理服务,传输前会混淆数据;
  • lightsocks-server:用于运行在代理服务器的客户端,会还原混淆数据;
除此之外你还可以通过 Docker 安装

启动

启动 lightsocks-server

在墙外服务器下载好 lightsocks-server 后,执行命令:
./lightsocks-server
就可启动服务端,启动成功后会输出如下日志:
本地监听地址 listen:
:54261
密码 password:
******
假如服务器的 IP 是 45.56.76.5,则以上日志的含义是指:
  • 服务监听在 45.56.76.5:54261,监听端口会随机生成;
  • 使用的密码是 ******

启动 lightsocks-local

在本地电脑下载好 lightsocks-local 后,执行命令:
./lightsocks-local
就可启动本地代理客户端,会看到如下日志:
2017/10/11 10:03:16 保存配置到文件 /Users/username/.lightsocks.json 成功
2017/10/11 10:03:16 lightsocks-client:master 启动成功 监听在 [::]:7448
这表明生成了一份配置文件到 /Users/username/.lightsocks.json。 为了让客户端用指定的密码去连接服务器,需要给客户端传入参数,为此需要修改该配置文件为如下:
{
  "remote": "45.56.76.5:54261",
  "password": "******"
}
重新启动 lightsocks-local 后,再使用监听在 127.0.0.1:7448 的本地 SOCK5 服务就可以正常使用了。
都启动成功后,可参考 搭配 Chrome 使用 配置你的 Chrome。

配置

lightsocks-local 支持的选项:

  • password:用于加密数据的密码,字符串格式,在没有填时会自动生成;
  • listen:本地 SOCKS5 代理客户端的监听地址,格式为 ip:port,默认为 0.0.0.0:7448
  • remote:墙外服务器的监听地址,格式为 ip:port,默认为 0.0.0.0:*

lightsocks-server 支持的选项:

  • password:用于加密数据的密码,字符串格式,在没有填时会自动生成;
  • listen:本地 SOCKS5 代理客户端的监听地址,格式为 ip:port,默认为 0.0.0.0:*

注意:

  • lightsocks-local 和 lightsocks-server 的 password 必须一致才能正常正常使用,password 不要泄露。
  • password 会自动生成,不要自己生成。一般采用拷贝 lightsocks-server 生成的密码到 lightsocks-local 使用的本地配置文件中。
只能通过 JSON 文件的方式传参给 lightsocks-local 和 lightsocks-server,启动前会去 ~/.lightsocks.json 文件中读取配置,启动后会把配置保存在 ~/.lightsocks.json 文件中, 其格式为 JSON,内容大致如下:
{
  "remote": "45.56.76.5:7448",
  "password": "******"
}
如果你想自定义保持配置文件的名称,可以通过 lightsocks-local your-name.json 启动,这时配置文件会保存到 ~/your-name.json 中。

其它语言实现

from  https://github.com/gwuhaolin/lightsocks
改进版:
https://github.com/uk0/kcp-socks
https://github.com/Yrr0r/lightsocksMod
-----

我的补充说明

首先登陆linux vps.
wget https://github.com/gwuhaolin/lightsocks/releases/download/1.0.6/lightsocks_1.0.6_linux_amd64.tar.gz
mkdir  lightsocks
mv lightsocks_1.0.6_linux_amd64.tar.gz lightsocks
cd lightsocks
tar zxvf  lightsocks_1.0.6_linux_amd64.tar.gz

root@ar:~/lightsocks# ls
LICENSE          lightsocks-server               readme.md
lightsocks-local  lightsocks_1.0.6_linux_amd64.tar.gz
root@ar:~/lightsocks#  chmod 755 lightsocks-server
root@ar:~/lightsocks# ./lightsocks-server lightsocks-go.json
(此命令会在~/下,生成lightsocks-go.json文件.此命令是运行在前台的,暂时按ctl+c,中止该进程)
root@ar:~/lightsocks# cat ~/lightsocks-go.json
{
    "listen": ":36160",
    "remote": "",
    "password": "自动生成的一长串字符"
}
root@ar:~#
(上面的36160是程序lightsocks-server随机指定监听的端口。password的值是程序lightsocks-server生成的密码。)

 因为./lightsocks-server lightsocks-go.json是运行在前台的,容易退出。我们可使用systemd把./lightsocks-server lightsocks-go.json运行为service:
nano /etc/systemd/system/lightsocks.service
内容如下:
[Unit]
Description=lightsocks
After=network.target

[Service]
ExecStart=/root/lightsocks/lightsocks-server lightsocks-go.json
Restart=always

[Install]
WantedBy=multi-user.target 

启动lightsockssystemctl restart lightsocks
这其实就是以daemon(service)方式启动lightsocks程序
 
设置开机启动lightsocks
systemctl enable lightsocks
 
至此,lightsocks服务器端的配置已经全部完成. 
 
在我的本地机器mac上的情形:
wget https://github.com/gwuhaolin/lightsocks/releases/download/1.0.6/lightsocks_1.0.6_darwin_amd64.tar.gz
mkdir lightsocks
mv lightsocks_1.0.6_darwin_amd64.tar.gz lightsocks
cd lightsocks
tar zxvf lightsocks_1.0.6_darwin_amd64.tar.gz
 
yudeMacBook-Air:lightsocks brite$ ls
lightsocks-local   lightsocks_1.0.6_darwin_amd64.tar.gz
lightsocks-server   readme.md
yudeMacBook-Air:lightsocks brite$ chmod 755 lightsocks-local
yudeMacBook-Air:lightsocks brite$ ./lightsocks-local lightsocks-go.json
会显示:
config.go:43: 保存配置到文件 /Users/brite/lightsocks-go.json 成功
main.go:31: 不合法的密码
yudeMacBook-Air:lightsocks brite$ cat /Users/brite/lightsocks-go.json
{
 "listen": ":7448",
 "remote": "",
 "password": ""
}yudeMacBook-Air:lightsocks brite$ nano /Users/brite/lightsocks-go.json
(把listen的值改为0.0.0.0:1083 
把remote的值改为your_vps_ip:36160
把password的值改为服务器上的文件~/lightsocks-go.json里的password的值)

yudeMacBook-Air:lightsocks brite$ ./lightsocks-local lightsocks-go.json
会显示:
...
本地监听地址 listen:
[::]:1083
远程服务地址 remote:
your_vps_ip:36160
密码 password:显示为服务器上的文件~/lightsocks-go.json里的password的一样的值
main.go:53: lightsocks-local:1.0.6 启动成功 监听在 [::]:1083

然后设置本地机器上的浏览器的socks5代理服务器为127.0.0.1:1083 ,浏览器即可翻墙。
 
注意:无论是在服务器上还是在客户机器上,运行可执行文件时,其配置文件要写为
lightsocks-go.json即可,不要写为~/lightsocks-go.json !!否则会遇错。

-------------------------

结合GFW所处的实际情况,我觉得自己还是可以稍微评论一下的。实际上Github上也还有一些类Shadowsocks的产品,比如说Lightsocks,star数也挺高。它们有些产品采用了自己开发的加密算法,而不是AesRc4之类的主流加密。按照作者的意思是,采用自己开发的加密能够更加有效的防止GFW解密。
这么说当然也是有一定道理的,但是实际上这些自研的算法往往比较脆弱,更容易遭到像词频分析之类的方法解密。但是其实我们还要考虑一个问题,GFW只是一个部署在主干网络上的计算机集群,它不是神,它的模型、运算量都是有限的, 每秒都有大量的流量经过它,要通过分析流量解密数据很明显是不可能的事情,就算我们总说Aes128过时了,Aes128有漏洞,但是针对Aes128的攻击依然条件苛刻。
在这里还可以举个例子,SSL我们都认为它是安全的,但是针对SSL或者说HTTPS的中间人攻击是存在的,只是这种攻击实现的原理绝对不是分析加密后的数据,而是通过分析握手环节的数据拿到秘钥来解密后续的数据同样的,GFW也是这么做的,而对于这种情况,只要秘钥不出现在流量中,GFW就很难有操作的空间了
还可以再举另一个例子,杀毒软件判断一个程序是否是病毒、木马,靠的是特征码行为分析特征码就是病毒为了执行某一系列操作而必定存在的代码,而行为分析则是把病毒放在沙箱环境内,观察病毒做了哪些操作。GFW也是如此,在流量中查找特征码比解密流量要容易的多,像Shadowsocks这样的程序产生的流量特征是很明显的,除此之外,GFW还拥有主动探测的能力,在发现特征后,它会尝试构造特殊的报文发送给目标,并根据目标的行为判断是否为Shadowsocks服务端。这种嗅探的成本也是非常低的。
使用Websocket这样的协议能够把我们的流量伪装成正常的网站流量。当然这并不完善,因为这样的程序一旦多起来,GFW也一定会开发出针对Websocket的特征分析。这个时候就需要一种更加灵活的方式,比如在数据头部填充,在报文的某几个位置插入字节。这些都可以破坏报文的特征,就像我们给病毒修改入口点、加壳、加花,来起到免杀的效果一样。
针对GFW的主动嗅探,则可以考虑动态白名单之类的机制,想要发送请求,就要到另一台服务器上登录,登录过程可以经过国内一台服务器做跳板,这样对于GFW来说,整个过程就是两组不相干的流量。如果要将这样的流量放在一起建立模型的话,也许要到2050年吧。
----------------------------------------

相关帖子:http://briteming.blogspot.com/2015/11/javalightsocks-java.html

No comments:

Post a Comment