SS+privoxy实现pac代理


本文介绍如何通过ssprivoxyLinux客户机上实现带有pac功能的代理。

服务端设置

使用系统自带的包管理工具安装shadowsocks之后,修改配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
cat /etc/shadowsocks/example.json
{   
    "server":"0.0.0.0",   
    "port_password":
    {
        "443": "password1",
        "6443": "password2"
    },
    "timeout": 300,
    "method":"aes-256-cfb",
    "fast_open": false,
	"workers": 1,
    "prefer_ipv6": false
}

配置systemd启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat /usr/lib/systemd/system/ssserver.service 
[Unit]
Description=ssserver
After=network.target

[Service]
User=root
Type=simple
ExecStart=/usr/bin/ssserver -c /etc/shadowsocks/example.json
PrivateDevices=yes

[Install]
WantedBy=multi-user.target

然后可以通过systemctl控制server状态。

客户端配置

通过同样的方式安装shadowsocks,但这里我们要使用sslocal,配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat /etc/shadowsocks/config.json 
{
    "server":"server_ip",  # 刚刚ssserver的主机ip
    "server_port":443,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"password1",  # 刚刚设置的密码
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false,
    "workers": 1,
    "prefer_ipv6": false
}

然后以同样的方式配置systemd启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat /usr/lib/systemd/system/sslocal.service 
[Unit]
Description=sslocal
After=network.target

[Service]
User=root
Type=simple
ExecStart=/usr/bin/sslocal -c /etc/shadowsocks/config.json
PrivateDevices=yes

[Install]
WantedBy=multi-user.target

privoxy配置

安装privoxy之后,找到其配置文件的位置,我的是这里/etc/privoxy

然后设置pac规则,满足对应条件时,流量将被转到sslocal开放的端口,否则将直连。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
cat <<EOF >/etc/privoxy/gfwlist.action 
{{alias}}
direct = +forward-override{forward .}
shadowsocks = +forward-override{forward-socks5 127.0.0.1:1080 .}

#default
{direct}
/

#shadowsocks
{shadowsocks}
.twitter.com
.facebook.com
.google.com
.googlesource.com
.golang.org

gfw设置填入到config

1
echo actionsfile gfwlist.action >> /etc/privoxy/config

如何使用

先看一看目前的端口监听情况

1
2
3
ss -anlpt |grep 127.0.0.1
LISTEN   0         128               127.0.0.1:8118             0.0.0.0:*       # privoxy监听端口
LISTEN   0         128               127.0.0.1:1080             0.0.0.0:*       # sslocal监听端口

我们主要使用的是8118,有些一定需要代理才能使用的应用可以直接使用1080端口,但要使用socks5协议。

全局代理使用环境变量设置

1
2
3
4
5
echo "export http_proxy=http://127.0.0.1:8118
> export https_proxy=http://127.0.0.1:8118
> export no_proxy=\"localhost, 127.0.0.1, ::1\"" >> ~/.bashrc

source ~/.bashrc

git设置

1
2
git config --global http.proxy http://127.0.0.1:8118
git config --global https.proxy http://127.0.0.1:8118

关于pac设置

使用这种方法的pac设置可能比较原始,但我感觉这样恰恰比较合适。作为工作机,我们可能只需要在下载一些代码的时候才会使用代理,那么只需要针对这些做个别的设置即可。

如果你希望使用gfwlist之类的东西,那么可以找一些已经实现的开源项目,或者自己开发。再或者找一些其他的软件,比如polipo之类的。

参考