搭建私人代理服务简易教程

12 minute

TOC

购买国外可用服务器

从 ISP 服务商购买 VPS,下单前先测试服务器附带的公网 IP 是否被封(本地不要挂代理):

1ping $ip
2# 或者使用 traceroute,更加详细:(mac: traceroute $ip)
3# tracert $ip

另外也推荐使用 https://ping.pe 测试,可进行多地区测试,更为全面。访问 https://ping.pe/$ip 以测试 IP,访问 https://tcp.ping.pe/$ip:$port 以测试具体端口。

完成购买后,即可开始搭建代理服务,下面记录了两种代理方式。

Op1. SSH 隧道代理

通过 ssh 动态转发的能力,可以在本地建立一个 socks 协议的代理,它可通过 ssh 隧道转发请求到代理服务器。这应该是较古老而简便的代理方式,只需在本地进行操作,便捷但稳定性一般。通过以下一条简单的命令即可建立代理:

1ssh -D 1080 -qCN $user@$ip
2
3# -D:本机SOCKS 服务端口
4# -q : quiet 模式,没有输出
5# -C : 数据压缩,可以节约一些带宽
6# -N : 不运行远程命令,只做端口转发

为了让代理服务在后台长久运行,可通过 autossh 完成,通过 brew, apt 等源都可安装 autossh。

1# brew install autossh
2autossh -f -M 1088 -D 1080 -qCN $user@$ip
3# -f 后台运行
4# -M 监控服务端口

完成后即可进行测试,如下是一些简单的用法:

1# 使用代理登录其他服务器
2ssh -o ProxyCommand='/usr/bin/nc -X 5 -x 127.0.0.1:1080 %h %p' $user1@$ip1 -v
3
4# 使用代理访问 web
5export ALL_PROXY=socks5h://127.0.0.1:1080
6curl https://google.com -v

注意这里 ALL_PROXY 变量使用了 socks5h,本机实测通过 socks5 无法顺利请求 google。

  • socks5 通过本地 dns 解析目标主机域名
  • socks5h 通过代理服务器 dns 解析目标主机域名

另外可以通过一些软件实现全局代理或者规则分流,比如 QuantumultX, V2rayN 等支持 socks 协议的客户端。以下是 QuantumultX 配置:

1[server_local]
2socks5=127.0.0.1:1080, fast-open=false, udp-relay=false, tag=socks5-ssh

Op2. 各种加密协议代理

现在用的多的协议应该是 Vmess、Shadowsocks、Trojan 和 Vless,个人建议使用 Vmess 即可,不推荐 Shadowsocks。VMess 协议是由 V2Ray 开发者原创并使用于 V2Ray 的加密传输协议。V2Ray 是一个代理软件,支持多种协议,它存在于客户端和服务端中,每个端均存在一个入口点和出口点,用于流量转发。安装代理服务,首先需要安装服务端,客户端进行简单对接即可。如下是一个基本的数据包流向:

1{本地请求目标网站} <--(socks)--> {V2Ray 客户端 inbound <-> V2Ray 客户端 outbound} <--(VMess)-->  {V2Ray 服务器 inbound <-> V2Ray 服务器 outbound} <--(Freedom)--> {目标网站}

下文以 Vmess 为例进行安装,将直接使用 V2Ray 脚本 安装服务端 V2Ray 并进行自动化配置,该脚本还支持其它多种协议且易于装卸更新,如需深入了解原理或者手动安装,可阅读 V2Ray 新白话文指南

首先登上服务器,然后运行如下命令进行安装:

1bash <(wget -qO- -o- https://git.io/v2ray.sh)

完成后即可通过 v2ray 命令交互式的添加各种协议的代理。默认安装了 Vmess 协议代理,控制台将打印出配置信息。具体配置和可执行文件位于 /etc/v2ray 目录下。如不放心,可参考 Vmess 配置指南 进行操作。

配置信息中最重要的就是用户 id,是一串用于认证流量的 uuid,据此和其它一些配置信息可以开始配置客户端 V2Ray。不过更方便的方式是使用配置信息中脚本为我们生成的 base64 加密 url,该 url 通过解析可以取得用户 id,协议信息,地址信息等服务器代理信息。将该 url 导入本地支持解析加密 url 的 V2Ray 客户端即可一键完成配置。

对于 V2Ray 客户端选择,只要支持对应加密协议即可,比如 Windows 上的 V2rayN,MacOS 上的 QuantumultX,它们本质上都是内置了 V2Ray 的图形化界面软件,支持一键导入且可以方便完成其它配置(一些推荐的客户端)。如果选择手动配置,则需要手动编辑配置文件,比较麻烦但可以进行更多定制化操作。在 Windows 和 macOS 中,配置文件通常是 V2Ray 同目录下的 config.json 文件,而在 Linux 中,配置文件通常位于 /etc/v2ray/config.json 文件,这里省略了手动配置方法,具体可参考 Vmess 配置指南

完成到这里就差不多了,之后启动客户端代理服务即可。但是有域名的话推荐外加 TLS,比如配置 Vmess + WebSocket + TLS 代理:

  1. 购买一个域名,并添加(子)域名解析到服务器 ip
  2. 服务器运行 v2ray add ws $domain, 将会自动通过 Caddy 配置证书且安装代理服务

该脚本使用了 Caddy 作为服务管理工具(类似于 Nginx)。如果服务器本身使用了 Nginx,可以通过 v2ray no-auto-tls 手动配置 Nginx 而不是通过 Caddy,运行后控制台将打印代理路径和端口,用于配置 Nginx 反向代理。如下是一个参考配置:

 1server {
 2    listen 443 ssl http2;
 3    listen [::]:443 ssl http2;
 4    server_name $domain;
 5
 6    ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
 7    ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;
 8    ssl_protocols TLSv1.2 TLSv1.3;
 9    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
10    
11    location /$path {
12        if ($http_upgrade != "websocket") {
13            return 404;
14        }
15        proxy_pass http://127.0.0.1:$port;
16        proxy_redirect off;
17        proxy_http_version 1.1;
18        proxy_set_header Upgrade $http_upgrade;
19        proxy_set_header Connection "upgrade";
20        proxy_set_header Host $host;
21        proxy_set_header X-Real-IP $remote_addr;
22        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
23        proxy_read_timeout 5d;
24    }
25}

$domain, $path, $port 分别替换为域名、代理路径、代理端口即可。

服务器被封的可能解决方法

Op1. 更换 IP 或端口

  1. ip 被封:需要前往 vps 服务商更换服务器 ip 并重新生成配置
  2. 端口被封:通过修改配置更换端口即可

如何判断 ip 还是端口被封了:

  1. ping $ip or tracert $ip or https://ping.pe/$ip -> 不通 -> ip 被封
  2. telnet $ip $port or https://tcp.ping.pe/$ip:$port -> 不通 -> 端口被封

Op2. 通过 CDN 中转流量

该方法适用于本身已经外加 WebSocket 的代理服务,如果不支持需要先进行安装,另外本方法还需要有一个域名指向服务器 ip。

WebSocket 是一种新的通讯协议,支持在单个 TCP 连接上进行双向数据传输。如果代理服务不含 WebSocket 则无法配合 CDN 使用,同时 CDN 本身也需要支持 WebSocket(CloudFlare CDN 支持,建议使用)。

CDN 一般情况下将任意选择靠近你的可用节点来中转你的流量到达被封服务器,使用它来中转流量通常可行,但可能导致速度下降。通过 cloudflare 可以很简单地完成配置:

  1. 将原域名服务商的 dns 服务器地址改为 cloudflare 提供的地址(如原服务商为 cloudflare 则忽略此步)
  2. 在 SSL/TLS 处将加密模式选为"完全"
  3. 在 cloudflare 添加(子)域名解析到被封 ip,代理状态选为已代理,即走让请求 cdn

测试网速

Op1. 服务器测试:

在服务器执行以下多地网速测试脚本:

1curl -Lso- https://raw.githubusercontent.com/wn789/Superspeed/master/superbench.sh | bash

Op2. 本地挂全局代理测试:

访问 speedtest,点击 GO 开始测试。

解锁更多地区

上述代理可以满足我 99% 的需求,但只限于一个地区。如果要解锁更多地区,通常我们可以购买按量付费的机场节点来实现,但不够稳定,而且我一些服务需要使用到 HTTP 代理,大多机场不支持。

幸运的是,BrightData 它出现了,可以利用它强大的 ISP Proxies 来构建 HTTP 代理,效果不错,以下是大致的步骤:

首先开一个 BrightData 的 ISP Proxies,在配置中选择按 ip 付费,选择需要的 region,有几个 region 就至少配几个 ip。复制得到的 host、username 和 password,然后即可配置 http 代理,以 quantumultx 为例:

1[server_local]
2http=brd.superproxy.io:22225, username=$username, password=$password, fast-open=false, udp-relay=false, tag=HTTP-JP

这样就完成了,是不是很简单?注意这里有个坑,因为 BrightData 的 ISP Proxies 不能代理 Google(可以用 BrightData 的 SERP 来弥补),而代理软件使用 Google 作为延迟测试,所以导致我以为配置有问题,其实直接更改延迟测试的 url 即可:

1[general]
2server_check_url =http://www.apple.com/library/test/success.html

再以 Python Requests 请求为例,使用 HTTP 代理只需提供代理地址即可:

1requests.get(url="xxx", proxies={
2    "http": "http://$username:$password@brd.superproxy.io:22225",
3    "https": "http://$username:$password@brd.superproxy.io:22225"
4})

区别之前的代理搭建方式,这样优点是不用买服务器,更方便和灵活,但缺点是可能不够稳定。不过,和之前的代理方式结合起来用,在稳定的基础上,实现了更灵活的代理,解锁了更多网站和功能,也更便于开发者集成到自己的应用中,两者结合,真的实现了我理想中的个人代理服务!


参考文章: