请注意:由于 V2Ray 项目变动,本文的操作方法已经失效,但仍具一定参考价值

本文将向你介绍如何使用树莓派配置和安装 V2Rayprivoxy ,让树莓派顺畅访问国际互联网,并为局域网内的其他的设备提供 socks5代理http代理服务。

先来给大家解释一下基本原理:

image-20200410145120973

啊不好意思放错了,应该是这张:

File:VPN overview-en.svg

我们这篇文章要实现的目标是:

graph LR
A(你的设备/树莓派) --> B(树莓派 Privoxy)
B --> |普通域名| E(目标网站)
B --> |魔法域名| C(树莓派 V2Ray 客户端) --> D(V2Ray服务端) --> E(目标网站)
B --> |广告域名| F(拦截)

需要准备的材料

  • 树莓派(以 3B+ 为例)
  • 电源(5V,不小于 2A)
  • 8G 以上的高速 TF 卡
  • 电脑(以 Windows 为例)
  • 网线
  • 互联网连接(推荐使用 真 · 互联网)

安装和配置 V2Ray

什么是 V2Ray?

V2Ray 是 Project V 下的一个工具。Project V 是一个包含一系列构建特定网络环境工具的项目,而 V2Ray 属于最核心的一个。官方中介绍 Project V 提供了单一的内核和多种界面操作方式。内核(V2Ray)用于实际的网络交互、路由等针对网络数据的处理,而外围的用户界面程序提供了方便直接的操作流程。不过从时间上来说,先有 V2Ray 才有 Project V。如果还是不理解,那么简单地说,V2Ray 是一个与 Shadowsocks 类似的代理软件,可以用来科学上网(施展魔法)学习国外先进科学技术。

安装 V2Ray

安装 V2Ray。可以使用 V2Ray 提供的 go.sh 脚本安装,由于 GFW 会恶化对 GitHub 的访问,直接运行脚本几乎无法安装,建议先从 v2ray-core/releases 将安装包v2ray-linux-arm.zip下载到树莓派,使用--local参数从本地安装

wget -O v2ray_install.sh  https://install.direct/go.sh
chmod +x v2ray_install.sh
sudo ./v2ray_install.sh --local v2ray-linux-arm.zip

配置 V2Ray

通过 v2rayN 可以导出节点配置为客户端配置,以下为 WS+TLS 的配置文件示例(请勿直接使用以下配置):

{
  "policy": {
    "system": {
      "statsInboundUplink": true,
      "statsInboundDownlink": true
    }
  },
  "log": {
    "access": "",
    "error": "",
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "proxy",
      "port": 1080,
      "listen": "0.0.0.0",
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "settings": {
        "auth": "noauth",
        "udp": true,
        "ip": null,
        "address": null,
        "clients": null
      },
      "streamSettings": null
    },
    {
      "tag": "api",
      "port": 8224,
      "listen": "127.0.0.1",
      "protocol": "dokodemo-door",
      "sniffing": null,
      "settings": {
        "auth": null,
        "udp": false,
        "ip": null,
        "address": "127.0.0.1",
        "clients": null
      },
      "streamSettings": null
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "192.19.108.30",
            "port": 443,
            "users": [
              {
                "id": "96603728-5243-4b0a-94c1-0b4c22a69eeb",
                "alterId": 2,
                "email": "t@t.tt",
                "security": "auto"
              }
            ]
          }
        ],
        "servers": null,
        "response": null
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "allowInsecure": true,
          "serverName": "v2ray.com"
        },
        "tcpSettings": null,
        "kcpSettings": null,
        "wsSettings": {
          "connectionReuse": true,
          "path": "/v2ray",
          "headers": {
            "Host": "v2ray.com"
          }
        },
        "httpSettings": null,
        "quicSettings": null
      },
      "mux": {
        "enabled": true,
        "concurrency": 8
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "vnext": null,
        "servers": null,
        "response": null
      },
      "streamSettings": null,
      "mux": null
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {
        "vnext": null,
        "servers": null,
        "response": {
          "type": "http"
        }
      },
      "streamSettings": null,
      "mux": null
    }
  ],
  "stats": {},
  "api": {
    "tag": "api",
    "services": [
      "StatsService"
    ]
  },
  "dns": null,
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "port": null,
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api",
        "ip": null,
        "domain": null
      }
    ]
  }
}

将配置文件上传到树莓派,使用下面的命令替换默认配置:

sudo mv config.json /etc/v2ray/

检查配置文件并添加到系统启动项

/usr/bin/v2ray/v2ray -test -config /etc/v2ray/config.json # 查看配置文件是否出错

sudo systemctl start v2ray # 启动v2ray服务

sudo systemctl status v2ray # 查看v2ray运行状态

sudo systemctl enable v2ray # 将v2ray加入开机自启动

执行 curl -so /dev/null -w "%{http_code}" google.com -x socks5://127.0.0.1:1080 确认 V2Ray 已经可以使用魔法 (命令中 Socks5 指 inbound 协议为 socks,1080 指该 inbound 端口是 1080)。如果执行这个命令出现了 301 或 200 这类数字的话代表可以使用魔法,如果长时间没反应或者是 000 的话说明不可以使用魔法。[^1]

Privoxy 使用指南

Privoxy 是一个免费的开源非缓存 Web 代理,可以过滤和处理传入的数据。

使用 Privoxy,我们可以让树莓派变成你的局域网代理服务器。

Privoxy好处是,可以在网页数据到达浏览器之前对其进行过滤和操作。

这也意味着可以使用 Privoxy 充当浏览器的广告拦截器。

简介精简版

Privoxy 是个很朴素但很强大的工具,基本功能和 switchyomega 类似:根据规则来处理请求流向 —— 但不仅限于影响浏览器,我理解它介于 iptables 和 Switchyomega 之间。可以把接收到的请求,根据规则转发到下一次代理:比如 1080 常用来使用魔法,那么 Google 就走 1080,百度不需要使用魔法就直连。还可以根据规则屏蔽广告和垃圾站点。

简介故事版

电脑联网了,就像在大山里的村庄有了一条通往市里的路,我们发起的所有请求,都会通过这条路走出去。有一天你发现这条路走下去,到另一个方向的城市会南辕北辙走不通,但是这条路附近呢又有另一个村子,到那边就能通了,所以你在路上开了一条小路去那个村子借道:第一个城市就是我们平常的请求比如百度淘宝知乎,第二条路走下去可能是谷歌脸书推特油管,也有可能是公司的内网环境,另一个村子就是 VPN,它或许是墙外的节点,或许是公司里那个看门的。

这些路怎么走通往哪里,你知道了,但其他村民可能不知道,他们走到岔路口不知道它是通往哪里的,所以你就立了个路牌了做指向。Privoxy 是这个路牌,Switchyomega 也是这个路牌,proxifier 也是路牌之一 (mac 和 Windows 可用,有 GUI 和请求的详细日志,要花钱的)。这样理解的话,所有类型的 VPN 该怎么用就都好配置了。

不建议盲目开全局,虽然它可能经常是管用的,但实际上所有流量都走了 “另一个村子” 再绕回来,天寒地冻路远不说,而且像网易这样的 “店面”,绕一下它可能就不接待你了 (他只认你哪里来的)。

在 树莓派上安装 Privoxy

各个 Linux 发行版源里都有,直接包管理器装即可。

sudo apt-get -y install privoxy # 安装privoxy

mac 可以 brew install privoxy ,然后用 brew sevices 子命令管理。( 官方也有提供安装包 )

Windows, 官方同样给了包和安装文档,但是等有空再写吧(其实基本就不想弄了…

配置

在开始本节之前,强烈建议确保树莓派有静态的局域网 IP 地址。

可以通过以下命令来查看树莓派的 IP

hostname-I

debian 装 privoxy,它的配置文件里注释写的跟论文一样长,最开始的时候就被吓退了。

~ λ k -h /etc/privoxy
 config                      # 主配置文件
 default.action
 default.filter
 gfwlist.action              # 自己生成的,用了 gfwlist 清单
 match-all.action 
 regression-tests.action 
 templates 
 trust 
 user.action
 user.filter

config 文件处理 :

sudo cp /etc/privoxy/config /etc/privoxy/config.bak    # 做个备份
sudo nano /etc/privoxy/config  # 编辑配置文件

# 修改监听范围和端口(任选一句)
listen-address 127.0.0.1:8118  # 监听本机的8118端口(仅树莓派魔法)
listen-address 0.0.0.0:8118    # 监听本机+局域网的8118端口(树莓派+局域网魔法)

# 添加代理规则(任选一句)
actionsfile gfwlist.action     # 让 privoxy 加载 gfwlist.action 实现智能分流
forward-socks5t / 127.0.0.1:1080 .  # 全局代理无分流,注意后面还有一个点

完成后,按 CTRL+ X ,然后按 Y ,最后按 ENTER 保存文件。

生成 gfwlist.action 文件

这个项目可以很方便的帮忙生成这个配置:https://github.com/zfl9/gfwlist2privoxy

curl -4sSkLO https://raw.github.com/zfl9/gfwlist2privoxy/master/gfwlist2privoxy
sudo mv gfwlist2privoxy /usr/local/bin && sudo chmod a+x /usr/local/bin/gfwlist2privoxy
# 放到 "PATH" 里保留,常用的

bash gfwlist2privoxy 127.0.0.1:1080
#  注意将 127.0.0.1:1080 替换为你的 socks5 地址

sudo mv -f gfwlist.action /etc/privoxy/
# gfwlist.action 移动到 privoxy 配置文件目录
sudo systemctl restart privoxy
# 重启一下确保配置生效

sudo service privoxy status
# 查看privoxy运行状态

tips: Privoxy 启动后,你设备配置好 HTTP 代理后,浏览器里输入 http://p.p ,你可以看到 Privoxy 成功启动的界面。

自定义配置

如果你有公司的 VPN,Git 仓库或者其他办公站点也需要走代理,可以很方便的加一个配置。

sudo touch /etc/proxy/autovpn.action
sudo echo 'actionsfile autovpn.action' >>/etc/privoxy/config

# 以下注释可以删除

sudo cat > /etc/proxy/autovpn.action <<EOF
{{alias}}
alauda = +forward-override{forward-socks5 127.0.0.1:5087 .}
# alias 是定义别名的意思,可以在此处定义转发规则
{alauda}
.alauda.io
.alaudatech.com
# 引用别名,在其后紧跟需要适配这个规则的域名
# 支持泛域名,比如 .baidu.com 可以匹配 www.baidu.com,tieba.baidu.com
EOF

sudo systemctl restart privoxy
# 重启一下确保配置生效

开始施展魔法

树莓派

浏览器

在 Chrome 中:

  1. 打开“ Settings”菜单,或在地址栏中输入chrome://settings
  2. 向下滚动到底部
  3. 点击“ 高级 ”打开高级设置
  4. 向下滚动,直到看到“ 系统 ”选项
  5. 点击 打开您计算机的代理设置

IP 地址填入树莓派的 IP,端口默认情况下应设置为8118(Privoxy 监听的端口)

或者:Chrome、Firefox 有 Switchyomega 这个插件可以处理转发规则,配置也简单,但需要各自配置,使用 Privoxy 可以集中在一个地方处理。修改浏览器的代理,使用 http://localhost:8118 即可。

终端
方法 1

在终端中直接运行命令

# 示例:本地 HTTP 代理
export  http_proxy=http://localhost:8118
export  https_proxy=http://localhost:8118

# 示例:本地 Socks5 代理
export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080

# 也可以用 ALL_PROXY
export ALL_PROXY=socks5://localhost:1080

# 如果代理服务器需要登陆,这时可以直接把用户名和密码写进去
http_proxy=http://userName:password@proxyAddress:port

设置完毕后 wget curl 这类网络命令都会经过设置的代理。

localhost 就是一个域名,域名默认指向 127.0.0.1,两者是一样的。

这个办法的好处是简单直接,并且影响面很小,只对当前终端有效,退出就不行了。

方法 2

把代理服务器地址写入 shell 配置文件.bashrc 或者.zshrc

直接在.bashrc 或者.zshrc 添加下面内容

# 示例:本地 HTTP 代理
export http_proxy="http://localhost:port"
export https_proxy="http://localhost:port"

# 示例:本地 Socks5 代理
export http_proxy="socks5://127.0.0.1:1080"
export https_proxy="socks5://127.0.0.1:1080"

# 也可以用 ALL_PROXY
export ALL_PROXY=socks5://127.0.0.1:1080

# 如果代理服务器需要登陆,这时可以直接把用户名和密码写进去
http_proxy=http://userName:password@proxyAddress:port

然后 Ctrl + X 保存文件,接着在终端中执行 source ~/.bashrc

或者退出当前终端再起一个终端。这个办法的好处是把代理服务器永久保存了,下次就可以直接用了。

或者通过设置 Alias 简写来简化操作,每次要用的时候输入 setproxy,不用了就 unsetproxy

alias setproxy="export ALL_PROXY=socks5://127.0.0.1:1080"
alias unsetproxy="unset ALL_PROXY"
alias ip="curl -i http://ip.cn"
方法 3

改相应工具的配置

比如 apt 的配置:

sudo nano /etc/apt/apt.conf

在文件末尾加入下面这行

Acquire::http::Proxy "http://proxyAddress:port"

保存 apt.conf 文件即可。

更多关于 apt 的代理设置可以参考 ASK UBUNTU 里的这个问题

Git 的设置:

git config --global http.proxy 'socks5://127.0.0.1:1080' 
git config --global https.proxy 'socks5://127.0.0.1:1080'

Git 仓库有的在国内有的在国外,国内的有 GitCafe、Coding.net、开源中国 Git,所以用国内的就没必要设置了,反而会慢。

局域网内其他设备使用

浏览器

每种浏览器的设置不同,下面是一份快速指南:

  • 在 Chrome 中:
  1. 打开“ Settings”菜单,或在地址栏中输入chrome://settings
  2. 向下滚动到底部
  3. 点击“ 高级 ”打开高级设置
  4. 向下滚动,直到看到“ 系统 ”选项
  5. 点击打开您计算机的代理设置
  • 在 Firefox 中:
    1. 打开Options菜单,或在地址栏中输入about:preferences
    2. 向下滚动到底部
    3. 点击Settings...标题下的 Network Settings按钮
  • 在 Internet Explorer 中:
    1. 转到设置
    2. 点击 Connections标签。
    3. 点击 LAN settings按钮。
    4. 勾选 Use a proxy server for your LAN

IP 地址填入树莓派的 IP,端口默认情况下应设置为8118(Privoxy 监听的端口)

也可以用 Switchyomega 这个插件处理转发规则,使用 http://树莓派IP:8118 即可。

设置系统网络代理服务器

一般在电脑、手机等设备的网络连接设置的高级选项里,都有设置代理服务器的地方,服务器填入树莓派 IP,端口填入 8118,认证选择无,保存即可生效,开始感受宛如置身海外的上网冲浪体验吧。

验证树莓派代理服务器

将代理设置配置为指向树莓派后,在浏览器中打开下面的地址

http://config.privoxy.org/

如果一切运行正常,可以看到 Privoxy 的欢迎界面:

image-20200414115516257

如果显示的是 Privoxy is not being used ,就要检查一下检查代理设置是否正确了。

Enjoy it

到这里,你已经完成了树莓派魔法的安装与配置,你可以开始使用你的树莓派访问真正的互联网,并为局域网内的其他设备提供魔法代理服务。

希望你喜欢这篇文章,如果对你有帮助的话,别忘了点赞、收藏、分享和点击订阅,并留意更新动态。

Stay creative, and I will see you next time!


知识共享许可协议

本作品采用知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议进行许可。

参考文献:

[Ask Ubuntu]: https://askubuntu.com/questions/349702/apt-conf-acquirehttpproxy-proxyserverport-seems-not-to-be-used-ubuntu-13 “apt.conf “Acquire::http:Proxy ”proxyserver:port” seems not to be used (Ubuntu 13.04 under Virtual Box on Win7)"