Shadowsocks与git的代理设置

proxy,SocksCap64,pac

Updated on April 21, 2021 Posted by elmagnifico on December 3, 2015

代理、翻墙

前言

回到家了,突然发现csdn的blog、github、百度云盘(移动端能打开)都被封掉了

新疆真是个蛋疼的地方啊,没办法只好用代理了

goagent、GEA

最初翻墙用的是自由门,不过据说自由门不是很安全,而且还传递各种反动内容

后来发现了goagent其实也就是GEA,只用登陆注册好之后,在本地更新一下,填好自己的appid,浏览器设置好,就能翻墙

看标清视频,查个资料,收个验证码什么的都是没啥问题的。

某次大封之后发现goagent的ip被封了好多,导致不得不到处去找好用的代理ip,然后使用了gogotest,从十万ip中找到好用的ip

还真是一个蛋疼的事,直到看到了这位博主

https://www.anotherhome.net/1727

EasyGoAgent

博主也是好心人,不但提供了若干账号,而且配有更新程序,自动更新可用的googleip

最重要的是简单,每次只要点击开启以后,回车一下,浏览器切换成代理模式,就能直接使用了

超级好评,至少在2015年12月之前我都能勉强用,当然其实从8月份开始就已经卡的要死了

再次查看easygoagent发现博主已经打上了失效的标记,并且推荐使用Shadowsocks(付费的+打广告)

贵人相助

还好有一位朋友无私共享了他的VPS给我用,这样我就能无忧翻墙了

朋友把Shadowsocks传给我,账号密码给我就能直接翻墙了 (百度Shadowsocks基本没啥有用的信息,再加上github被封了,根本没办法下到它)

Shadowsocks

这里是Shadowsocks的github,Shadowsocks不仅仅有windows平台,linux,android,ios等等很多冷门一些的操作系统都有其版本

可以说非常强大,各种版本的程序也可以直接从下面的github的release中下载到

https://github.com/shadowsocks

原理

Shadowsocks的原理其实和goagent这些个都很像,都具有自己的协议,Shadowsocks则是用的socks5的协议

SOCKS协议位于传输层(TCP/UDP等)与应用层之间,说白了这个协议其实就是强行在传输层和应用层之间增加了一个中间层

而socks5的协议则是ssh协议的拆分变种,它通过在这个中间层建立了一个加密的客户端和代理服务器解密端

让GFW无法通过特征分析等等方法,对每一个代理服务器的socks进行封锁,那么就能成功翻墙了。

限制

理论上说用这样的协议基本上是个程序都能通过shadowsocks来翻墙,实际上还是有一些限制,并不是全部程序都能设置socks5的代理 (或者说你找不到在哪里设置使用代理)

所以就导致一部分程序看着无法翻墙干着急,那就需要另外一个程序来帮忙了

proxifier

我先是找到了proxifier,他可以在设置了代理服务器为127.0.0.1端口1080之后,通过添加规则来设置程序是代理还是直连。

但是在实际测试中发现他无法让qq通过代理来登陆,我查了登陆记录发现都是本地ip登陆的,而阿里旺旺则是可以通过代理登陆,ip显示是在加拿大

但这个工具有一个好处,可以看到实时流量什么的,只是在proxifier中设置了qq代理登陆并不起作用(用qq自己的代理设置是有用的)

所以我就另外又找了找,发现Shadowsocks的作者有推荐配合使用的程序,SocksCap 或 ProxyCap

SocksCap

ProxyCap没用就不说了,SocksCap是现在用的。

基本和proxifier一样,设置了代理服务器之后,添加程序进来,然后通过双击SocksCap内的程序图标来打开,这么打开的程序,就自动使用代理了,而proxifier则不行,只要设定程序之后,那么不管从哪里打开,都是走代理,必须要修改规则才行,就不如SocksCap方便

同时测试后发现,就算是qq只要是从SocksCap中打开,就是代理打开的,强制使用了代理,那么这个就非常好用了。

这里是官网,也是国人的作品

http://www.sockscap64.com/

按道理来说各种国外联网类型的游戏也是可以使用这个来代理的,比如dayz、方舟、rust、gmod等等,这些需要测试,我还没空

全局代理和PAC

在Shadowsocks的设置中有全局代理和PAC两种模式,但很多人都弄错了这两个的意思。

首先这里的全局代理的真实含义其实所有通过127.0.0.1端口1080的,那么都是通过代理访问,无论你是不是需要都不考虑,无脑代理就可以了

并不是说你在这里设置了全局,随便开什么程序不用设置就全都代理了。

而PAC是什么呢,其实就是一个过滤器,他帮你在代理的口上做检测,会按照设定的规则来决定是走代理还是走直连

其中比较有名的就是GFWlist,说白了就是咱的长城防火墙的封禁列表,如果涉及到封禁的网址就会自动转代理连接

否则就是直连,这样不会浪费流量,而且访问本地的内容也比较快。

同时也提供了在线和本地两种策略,在线就是指实时的封禁列表,本地就是不及时更新的列表需要手动去更新,但是好处是可以自定义,比较符合我目前的需求

所以如果开启代理以后浏览器没有通过代理打开网页,那么检查一下浏览器的代理设置是不是正确

PAC

PAC规则分为两种,一种是可以直接应用官方的规则比如GFWlist,其内容都在pac.txt中

而在这个基础上你可以自定义自己的规则,那么为了不让自己的规则被GFWlist更新的时候刷掉,就可以写规则在user-rule.txt中

那就能做到又同步官方又自定义,当然如果出现冲突的时候还是得去改pac.txt的内容(比如我的百度云的问题,以及csdn的blog,默认列表中csdn是不会代理的,而我csdn的blog被屏蔽了,csdn其他的是好的,那就只好去改GFWlist了)

语法

自定义代理规则的设置语法与GFWlist相同,语法规则如下:

  • 通配符支持。
  • 比如 *.example.com* 实际书写时可省略 *

    如 .example.com/ 和 *.example.com* 效果一样

  • 正则表达式支持。以 \ 开始和结束

    如 [\w]+:\/\/example.com\

  • 例外规则 @@

    如 @@*.example.com* 满足 @@ 后规则的地址不使用代理

  • 匹配地址开始和结尾 |

    如 |http://example.com 、 example.com| 分别表示以 http://example.com 开始和以 example.com 结束的地址

  • || 标记

    如 ||example.com 则 http://example.com 、 https://example.com 、 ftp://example.com 等地址均满足条件

  • 注释 !

    如 !我是注释

更多user-rule.txt语法规则,可以参考AdBlockPlus过滤规则

https://adblockplus.org/en/filter-cheatsheet

我的修改

首先打开pac.txt 在其中的rules中添加上csdn的blog,所有以它开头的都需要代理

var rules = [
  ".lsxszzg.com",
  "|http://85.17.73.31/",
  "||alien-ufos.com",
  "|http://blog.csdn.net/",
  ...

在文档的最后,我添加上了我的github博客的地址,如果发现了我的地址,直接直连(因为我发现了一个奇葩情况,不挂代理上不去github但是上的去我的blog,而挂了代理blog无法打开,无奈我只好加上了一个关于我的地址的判断)

同时由于新疆上不去github,但是内地可以上去,所以在这个基础上又加上了github的全站过滤。

function FindProxyForURL(url, host) {

if (shExpMatch(url,"http://elmagnificogi.github.io./")) {
    return direct;
}

if (shExpMatch(url,"*github.com*")) {
    return proxy;
}

if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) {
    return proxy;
}
return direct; }

经过这样的折腾,总算是上网什么的没问题了

git使用sock5代理push和clone

当要给新机子clone博客源码的时候发现,一直报错

$ git clone https://github.com/elmagnificogi/elmagnificogi.github.io
Cloning into 'elmagnificogi.github.io'...
fatal: unable to access 'https://github.com/elmagnificogi/elmagnificogi.github.io/': Failed to connect to github.com port 443: Timed out

提示连接github.com 超时,我ping了一下,发现根本连不上,也就是说gitbash也需要代理

上面提到的SocksCap能强制代理,刚好来试验一下,发现直接连正常打开gitbash都不行了

于是搜索了一下 有什么用git能代理的办法

让普通命令行工具使用代理

可以在~/.profile或~/.bashrc里加上:

(这两个文件在windows的git安装路径中叫profile或bash.bashrc)

enable_proxy() {
    export http_proxy="127.0.0.1:1081"
    export https_proxy="127.0.0.1:1081"
}
或者
enable_proxy() {
    export http_proxy="127.0.0.1:1080"
    export https_proxy="127.0.0.1:1080"
}

disable_proxy() {
    unset http_proxy
    unset https_proxy
}

这里的127.0.0.1:1080则刚好就是Shadowsocks的代理端口

快速测试

也可以通过这样的方法来快速测试:

$ http_proxy="127.0.0.1:1080"  curl -I http://github.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0HTTP/1.1 301 Moved Permanently
Content-length: 0
Location: https://github.com/
Connection: close
Proxy-Connection: keep-alive

类似这样的则就是ok的,代理没问题,那么就能clone我的blog了

enable_proxy;
git clone https://github.com/elmagnificogi/elmagnificogi.github.io

更新我的push脚本

同时我的自动push脚本也需要更新使用上面的命令才行

enable_proxy;
git add .;
git commit -m "update-post";
git push origin master

经过这些折腾基本就ok了

当然其实也可以直接把设置代理的部分直接加到push脚本中,而不用enable/disable.如下就行.

export http_proxy="127.0.0.1:1080";
export https_proxy="127.0.0.1:1080";
git add .;
git commit -m "update-post";
git push origin master

The end

据说Shadowsocks的作者多次被警方约谈,并且Shadowsocks项目也在8月份的时候貌似被全部删除了,但是这种开源项目被fork的次数肯定不少,所以恢复起来都是秒秒钟的事情,而且现在来看都已经恢复了,只是一般渠道搜索不到Shadowsocks而已

再次感谢璐借我VPS用,让我能完成这篇blog

Quote

http://www.tuicool.com/articles/V77jyu

http://tieba.baidu.com/p/4060577753

http://yveschan.github.io/blog/shadowsocks-analysis/

http://vc2tea.com/whats-shadowsocks/