Shadowsocks科学上网及pac自动代理

题记

时光荏苒,短短的两个月如白驹过隙,暑期实习接近尾声。触动挺大,公司便捷、高速的ss让我养成了google的hao习惯。。。为了以后在校继续享受google,于是乎自己搭建一个shadowsocks c/s,并记录于此

本文是基于将shadowsocks client作为客户端的http代理服务器,shadowsocks client通过sock5代理加密到shadowsocks server穿透GFW,之后访问被墙的站点。所以需要的条件是:国内一台公网服务器节点(ss local),国外一台服务器节点(ss server)。

ssh tunnel

如果您只有一台海外的服务器,那么我建议使用SSH 动态端口转发ssh Tunnel可以你的主机和海外的主机之间简历SSH隧道,动态端口转发本身使用的和shadowsocks都是socks代理协议,只是有个缺点就是有的有的地方会禁止ssh端口(听说),但是值得尝试下因为它真的很方便。具体使用如下:

ssh -N -f -D localhost:9999 root@133.130.109.xx

  • N : 表示不去执行远端的命令,一般仅仅在端口转发时使用
  • f : 表示我们在执行ssh后不会真的登录到远端的主机上,输入密码,直接返回到原来的shell终端
  • D : 声明了这是一个动态的端口转发,会在本地生成一个socket,并绑定对应的装有[Ip adress & port]的数据结构,将从这个socket中收到的报文通过ssh连接转发到远端的ssh server。需要注意的是,这里使用了localhost:9999,如果你想使用http proxy的话,需要注意让socket绑定一个公网的地址,或者你的http proxyssh client在同一台主机上

这样,你的本地就会和133.130.109.xx这台主机建立一个ssh隧道,之后再在浏览器中设置相应的代理在本地的9999端口即可使用隧道啦。

Shadowsocks

好了接下来就好好看看我们的ss是如何使用和工作的。

上面提到本篇的方案需要的条件是:国内一台公网服务器节点(ss local),国外一台服务器节点(ss server)。也许很抽象,不就一个shadowsocks c/s么,我的浏览器也自带啊,

你是对的,但我还想使用http的缓存服务器,我还想在客户端上实现一种分流的效果,先看张图:

先不谈客户端上的分流,我们的浏览器去访问被墙的站点大致是这个样子的:

  • pc指定http代理服务器为ss(shadowsocks)client,由http代理服务器代替pc向源站请求。这里可以理解为正向代理
  • http代理服务器收到http请求后,根据配置发现下一级代理为sock5代理即需要加密封装发送给ss server,在数据包路由过程中,GFW无法对socks加密的数据进行处理,会放行报文。遂达到穿透GFW的效果
  • 国外的sock5代理服务器(ss server)收到数据包后解密并代理请求被墙的站点
  • 被墙的站点回复响应数据给sock5代理
  • ss server收到代理响应报文后,加密并发送给ss client
  • ss client收到响应数据包解密后,将其发送给发起http请求的正常客户端
简介

这里有一篇写的很好,推荐下:写给非专业人士看的 Shadowsocks 简介
Shadowsocks(中文名稱:影梭),基于python、c、c++开发的一款开源软件,使用Socks5代理方式,现在国内广泛用于穿透GFW。其基于c/s架构,数据流在c/s间传输时加密穿透GFW,实现科学上网。

特点

  • 使用自行设计的协议进行加密通信。加密算法有AES、Blowfish、IDEA、RC4等,除建立TCP连接外无需握手,每次请求只转发一个连接,因此使用起来网速较快,在移动设备上也比较省电。
  • 所有的流量都经过算法加密,允许自行选择算法,所以比较安全。
  • 通过异步I/O和事件驱动程序运行,响应速度快。
  • 客户端覆盖多个主流操作系统和平台,包括Windows,OS X,Android和iOS系统和路由器(OpenWrt)等[5]。

详见维基百科

使用

ss server配置
安装:
centos/redhat:

1
2
yum install python-setuptools && easy_install pip
pip install shadowsocks

debian/ubuntu:

1
2
apt-get install python-pip
pip install shadowsocks

新建配置文件/etc/shadowsocks.json

1
2
3
4
5
6
7
8
9
10
11
{
"server":"1.1.1.1", # 服务器监听地址,可以0.0.0.0
"port_password":{
"1001":"password",
#"1002": "pass2" #可以分配为不同端口指定不同密码
},
"local_address":"127.0.0.1",
"local_port":"1080",
"timeout":"600",
"method":"rc4-md5" ## 加密方式,此种适合在openwrt路由器上使用
}

运行:

1
2
useradd ssuser
ssserver -c /etc/shadowsocks.json --user ssuser -d restart

验证:

netstat -tunlp | grep python查看有没有配置文件中的端口在监听即可

ss client配置
国内节点:sslocal -s 1.1.1.1 -p 1001 -k password -m rc4-md5 -b 0.0.0.0 -l 8888 -d start
之后,ss client和ss server的代理通道即可加密使用。

验证
使用一个支持sock5的客户端浏览器,如firefox,在首选项->高级->网络->连接中点击配置,选择手动代理并设置类型为sock5代理,并指定ss client的ip和端口。

观察其是否可以访问被墙的站点,若可以则成功,若不行,则说明失败

排错
查看shadowsocks日志/var/log/shadowsocks.log看是否有配置异常。

注意iptables放行相应端口

http代理

使用

由于并不是所有的客户端都支持sock5代理,所以可以在ss client上使用polipo来将http代理转化socks5代理.

最重要的是它可以帮我们做点cache

安装yum install polipo

新增配置文件/etc/polipo/config

1
2
3
4
5
6
logSyslog = true # 开启syslog
logFile = /tmp/polipo.log # 指定日志
proxyAddress = "0.0.0.0" # http proxy监听地址
proxyPort = 10001 # http proxy监听端口
socksParentProxy = "localhost:8888" # 指定一级代理为本地的8888
socksProxyType = socks5 # 代理类型为socks5

运行:service polipo start

之后我们在可以上网的pc的浏览器上,手动指定代理类型为http代理server的ip和port就可以翻墙上网了。但是这不是最终的目的。此时,客户端如通过这个firefox浏览器访问的站点都是通过了ss client,而这样无疑会给ss client带来很大的流量,且ss client的位置很可能会影响我们的访问效果。

PAC

PAC(proxy auto-config),自动代理配置。其核心是一个PAC文件,是一个至少定义了一个JavaScript函数的文本文件。这个函数为FindProxyForURL(url, host)有2个参数:url是一个对象的URL,host是一个由这个URL所派生的主机名。顾名思义:可以通过URL来判断访问的host代理。简单来说,就是指定一部分域名和相应的代理方式,于是我们可以定义一些被GFW block的域名来指定http代理或者socks5代理,而未被block的域名直接访问就可以了。这叫智能分流,比VPN的全局翻墙更智能快速。

例子

1
2
3
4
5
6
7
8
9
10
function FindProxyForURL(url, host) {
// 本地域名不进行代理,直接访问:
if (shExpMatch(url,"*.example.com/*")) {return "DIRECT";}
if (shExpMatch(url, "*.example.com:*/*")) {return "DIRECT";}
// URL在这个网络范围内时进行HTTP代理
if (isInNet(host, "10.0.0.0", "255.255.248.0")) {
return "PROXY fastproxy.example.com:8080";
}
// 其他流量进行代理,如果失败则直连
return "PROXY proxy.example.com:8080; DIRECT";

使用

这里有可用的pac文件,出自关于PAC自动代理和ios翻墙 ,只需要修改var proxy = 'PROXY myproxy.com:10001;的主机为自己的国内节点的主机或ip即可。

我们需要在客户端上设置自动代理,即指定pac的文件的位置,可以是一个外链的地址,也可以使用本地的地址。

将文件上传至七牛、阿里等云存储上,可以被公开访问,这样无论多少个客户端只要拿到pac文件的外链地址都可以直接接入国内的http代理上网。这样有个缺陷就是无论谁拿到你的pac外链地址都可以用其上网,许多人可能觉得不安全。所以也可以指定pac文件在本地,这样只有你自己可以使用了,但是缺点就是不方便。

未完

当然,你也可以在国内的节点使用SSH Tunnel+polipo,这样我们的配制量可以大大的减少。只需要在国内的节点配制动态端口转发

ssh -N -f -D localhost:9999 root@HOST_REMOTE
之后,修改polipo的配置文件:

1
2
3
4
5
6
logSyslog = true # 开启syslog
logFile = /tmp/polipo.log # 指定日志
proxyAddress = "0.0.0.0" # http proxy监听地址
proxyPort = 10001 # http proxy监听端口
socksParentProxy = "localhost:9999" # 指定一级代理为本地的9999
socksProxyType = socks5 # 代理类型为socks5

即可

坚持原创技术分享,您的支持将鼓励我继续创作!