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

10 minute

购买国外可用服务器

从 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 开始测试。


参考文章: