登录 注册

VPS 上的自建代理服务器:安装 3proxy 并进行检查的方法

面向新手的分步指南:用现成的 bash 脚本在 VPS 上安装 3proxy,从外部检查访问,连接浏览器。同时坦诚说明什么时候并不需要它。

暖光照亮的小型家用服务器,一条线缆延伸向夜晚的城市

即使您从未打开过 Linux 控制台,也能搭建个人代理服务器:安装程序本身只需一分钟。下面是分步指南:租用 VPS,运行现成脚本,从外部检查访问,连接浏览器。结果是一个固定 IP,带用户名和密码保护的 HTTP 和 SOCKS5。

文章最后我们会说明,在哪些任务上个人服务器不如服务。我们自己就卖代理,所以直说。

需要什么

项目要求
服务器1 核 512 MB 内存的 VPS:个人代理用最低配方案就够了
系统干净的 Ubuntu 22.04 或 24.04、Debian 12 或 13
访问root 用户和服务商邮件中的密码
终端Windows 10 和 11 用 PowerShell,macOS 和 Linux 用终端

请一开始就按任务选择 VPS 国家:代理地址将来自该国,只有换到另一台服务器才能更改。

我们在表中四种系统的干净镜像上运行了本文所有命令,每个分配 512 MB 内存和一个核心。安装用时 10 到 31 秒,3proxy 空载时占用不到 8 MB。

我们将安装 3proxy。一个程序同时服务 HTTP 和 SOCKS5,内存占用少,用一个文件配置。Squid 只能作 HTTP 代理,Dante 只能作 SOCKS,用它们要配置两个服务。Ubuntu 软件源中没有 3proxy 软件包,所以脚本使用开发者的官方软件包并校验其校验和。

第 1 步。连接到服务器

打开终端,输入命令,填入服务商邮件中的地址:

您的电脑
ssh root@SERVER_IP

首次登录时系统会询问是否信任服务器:输入 yes。输入密码时不会显示,这是设计如此。盲打或粘贴后按 Enter。如果服务商给的是普通用户而不是 root,登录后运行 sudo -i。

第 2 步。运行安装程序

点击“复制”,把整段粘贴到终端窗口并按 Enter。它会自动创建文件并运行。

服务器:安装
cat > install-proxy.sh <<'SCRIPT'
#!/usr/bin/env bash
# Installs 3proxy with HTTP and SOCKS5, login and password required.
# Ubuntu 22.04+ or Debian 12+. Run as root on a clean server.
set -euo pipefail

VERSION="1.0.2"
CONF_DIR="/usr/local/3proxy/conf"

if [ "$(id -u)" -ne 0 ]; then
  echo "Run as root: sudo bash install-proxy.sh"
  exit 1
fi

case "$(dpkg --print-architecture)" in
  amd64) ARCH="x86_64"; SHA="d42c0a15ab7bc2e129de2e72fedfb6c908bfc1f7b7f4be15368c56eeb21e9a08" ;;
  arm64) ARCH="arm64";  SHA="e7b8f21bc527b30e9b7fd2ebd5889a11eb14889bb45f71074c94c865fc1b2556" ;;
  *) echo "Only amd64 and arm64 servers are supported"; exit 1 ;;
esac

echo "==> Installing packages"
export DEBIAN_FRONTEND=noninteractive NEEDRESTART_SUSPEND=1
APT="apt-get -o DPkg::Lock::Timeout=300"
$APT update -qq
$APT install -y -qq curl openssl ca-certificates >/dev/null

DEB="/tmp/3proxy-$VERSION.$ARCH.deb"
curl -fsSL -o "$DEB" "https://github.com/3proxy/3proxy/releases/download/$VERSION/3proxy-$VERSION.$ARCH.deb"
echo "$SHA  $DEB" | sha256sum -c --quiet -
$APT install -y -qq "$DEB" >/dev/null
rm -f "$DEB"

echo "==> Creating login, password and ports"
LOGIN="user$(openssl rand -hex 3)"
PASS="$(openssl rand -hex 12)"
HTTP_PORT="$(shuf -i 20000-59999 -n 1)"
SOCKS_PORT="$((HTTP_PORT + 1))"

echo "$LOGIN:CL:$PASS" > "$CONF_DIR/passwd"

cat > "$CONF_DIR/3proxy.cfg" <<EOF
nscache 65536
nserver 1.1.1.1
nserver 8.8.8.8
log /logs/3proxy.log D
rotate 7
maxconn 200
users \$/conf/passwd
auth strong
deny * * 127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16,100.64.0.0/10
deny * * * 25
allow *
proxy -a -p$HTTP_PORT
socks -p$SOCKS_PORT
EOF

chown proxy:proxy "$CONF_DIR/passwd" "$CONF_DIR/3proxy.cfg"
chmod 640 "$CONF_DIR/passwd" "$CONF_DIR/3proxy.cfg"

if command -v ufw >/dev/null && ufw status | grep -q "Status: active"; then
  echo "==> Opening ports in ufw"
  ufw allow "$HTTP_PORT/tcp" >/dev/null
  ufw allow "$SOCKS_PORT/tcp" >/dev/null
fi

echo "==> Starting the service"
systemctl enable 3proxy >/dev/null 2>&1
systemctl restart 3proxy
sleep 2

if ! systemctl is-active --quiet 3proxy; then
  echo "3proxy did not start. Details: journalctl -u 3proxy -n 30"
  exit 1
fi

SERVER_IP=""
for URL in https://ifconfig.me https://api.ipify.org; do
  SERVER_IP="$(curl -s --max-time 20 -x "http://$LOGIN:$PASS@127.0.0.1:$HTTP_PORT" "$URL" || true)"
  [ -n "$SERVER_IP" ] && break
done

if [ -z "$SERVER_IP" ]; then
  echo "The proxy runs but its test request failed. Details: tail /usr/local/3proxy/logs/3proxy.log.*"
  exit 1
fi

umask 077
cat > /root/proxy.txt <<EOF
Server:     $SERVER_IP
HTTP port:  $HTTP_PORT
SOCKS port: $SOCKS_PORT
Login:      $LOGIN
Password:   $PASS

curl -x "http://$LOGIN:$PASS@$SERVER_IP:$HTTP_PORT" https://ifconfig.me
curl --socks5-hostname "$LOGIN:$PASS@$SERVER_IP:$SOCKS_PORT" https://ifconfig.me
bash check-proxy.sh $SERVER_IP $HTTP_PORT $SOCKS_PORT $LOGIN $PASS
EOF

echo
echo "Done. These details are saved in /root/proxy.txt"
echo
cat /root/proxy.txt
SCRIPT
bash install-proxy.sh

脚本按顺序做这些事:

  • 安装 3proxy 软件包,并校验文件下载时未被篡改;
  • 生成随机用户名、密码和两个高位端口,扫描器查看这些端口的频率低于 3128 和 1080;
  • 禁止无用户名连接,关闭代理访问服务器内部地址和云服务地址;
  • 封锁邮件端口 25,这样即使密码泄露,垃圾邮件发送者也无法让您的地址进入黑名单;
  • 从 HTTP 请求头中删除客户端信息:网站看不到您的真实 IP;
  • 启用重启后自动运行,如果 ufw 防火墙处于活动状态则打开端口。

最后会出现这样的报告,只是数值是您的:

输出示例
Done. These details are saved in /root/proxy.txt

Server:     203.0.113.10
HTTP port:  34512
SOCKS port: 34513
Login:      user4f2a9c
Password:   8c1f0e77a2d94b36c5e1a07d

curl -x "http://user4f2a9c:8c1f0e77a2d94b36c5e1a07d@203.0.113.10:34512" https://ifconfig.me
curl --socks5-hostname "user4f2a9c:8c1f0e77a2d94b36c5e1a07d@203.0.113.10:34513" https://ifconfig.me
bash check-proxy.sh 203.0.113.10 34512 34513 user4f2a9c 8c1f0e77a2d94b36c5e1a07d

把这些数据复制保存好。在服务器上它们位于文件 /root/proxy.txt,命令 cat /root/proxy.txt 可再次显示。

第 3 步。在服务商面板中打开端口

部分服务商会在服务器前放置自己的网络防火墙,在客户面板中配置。如果您有,请在那里放行两个端口的 TCP。面板中没有此类选项就可以跳过这一步。

第 4 步。从外部检查代理

要从自己的电脑检查:这样您才能以外部视角看到服务器。在 Linux 和 macOS 上,把这段粘贴到终端:它会创建文件 check-proxy.sh。然后粘贴并运行安装报告的最后一行,其中已包含您的数据。

您的电脑:检查
cat > check-proxy.sh <<'SCRIPT'
#!/usr/bin/env bash
# Usage: bash check-proxy.sh HOST HTTP_PORT SOCKS_PORT LOGIN PASSWORD
# Run it from your own computer: only an outside check shows the real picture.
set -u
if [ "$#" -ne 5 ]; then
  echo "Usage: bash check-proxy.sh HOST HTTP_PORT SOCKS_PORT LOGIN PASSWORD"
  exit 2
fi
HOST="$1"; HTTP_PORT="$2"; SOCKS_PORT="$3"; LOGIN="$4"; PASS="$5"
URL="https://ifconfig.me"
FAILED=0

pass() { echo "[ OK ] $1"; }
fail() { echo "[FAIL] $1"; FAILED=$((FAILED + 1)); }
info() { echo "[INFO] $1"; }

MY_IP=$(curl -4 -s --max-time 10 "$URL" || curl -4 -s --max-time 10 https://api.ipify.org || true)
info "Your own IP: ${MY_IP:-unknown}"

HTTP_IP=$(curl -s --max-time 20 -x "http://$LOGIN:$PASS@$HOST:$HTTP_PORT" "$URL" || true)
if [ -n "$HTTP_IP" ]; then pass "HTTP proxy works, exit IP $HTTP_IP"; else fail "HTTP proxy gave no answer"; fi

SOCKS_IP=$(curl -s --max-time 20 --socks5-hostname "$LOGIN:$PASS@$HOST:$SOCKS_PORT" "$URL" || true)
if [ -n "$SOCKS_IP" ]; then pass "SOCKS5 proxy works, exit IP $SOCKS_IP"; else fail "SOCKS5 proxy gave no answer"; fi

if [ -n "$HTTP_IP" ] && [ "$HTTP_IP" = "$MY_IP" ]; then
  info "Exit IP equals your IP: fine on the server itself, a problem anywhere else"
fi

CODE=$(curl -s --max-time 20 -o /dev/null -w "%{http_code}" -x "http://$HOST:$HTTP_PORT" "http://ifconfig.me" || true)
if [ "$CODE" = "407" ]; then pass "HTTP without login is refused (407)"; else fail "HTTP without login returned $CODE, expected 407"; fi

CODE=$(curl -s --max-time 20 -o /dev/null -w "%{http_code}" -x "http://$LOGIN:wrong-$PASS@$HOST:$HTTP_PORT" "http://ifconfig.me" || true)
if [ "$CODE" = "407" ]; then pass "HTTP with a wrong password is refused (407)"; else fail "HTTP with a wrong password returned $CODE, expected 407"; fi

if [ -n "$SOCKS_IP" ]; then
  if curl -s --max-time 20 -o /dev/null --socks5-hostname "$HOST:$SOCKS_PORT" "$URL"; then
    fail "SOCKS5 lets you in without a login: the proxy is open"
  else
    pass "SOCKS5 without login is refused"
  fi
fi

if [ -n "$MY_IP" ] && [ -n "$HTTP_IP" ] && [ "$HTTP_IP" != "$MY_IP" ]; then
  if curl -s --max-time 20 -x "http://$LOGIN:$PASS@$HOST:$HTTP_PORT" "http://ifconfig.me/all" | grep -qF "$MY_IP"; then
    fail "The site can see your own IP in the proxy headers"
  else
    pass "Your own IP is not visible in the headers"
  fi
fi

echo
if [ "$FAILED" -eq 0 ]; then
  echo "All checks passed."
else
  echo "Failed checks: $FAILED"
  exit 1
fi
SCRIPT

如果一切设置正确,输出是这样的:

输出示例
[INFO] Your own IP: 198.51.100.7
[ OK ] HTTP proxy works, exit IP 203.0.113.10
[ OK ] SOCKS5 proxy works, exit IP 203.0.113.10
[ OK ] HTTP without login is refused (407)
[ OK ] HTTP with a wrong password is refused (407)
[ OK ] SOCKS5 without login is refused
[ OK ] Your own IP is not visible in the headers

All checks passed.

在 Windows 上,脚本在 Git Bash 中运行。没有它时,PowerShell 中两条命令就够了,每条都应输出您服务器的地址。一定要写 curl.exe:PowerShell 中单写 curl 会调用另一条命令。

PowerShell
curl.exe -x "http://LOGIN:PASSWORD@HOST:HTTP_PORT" https://ifconfig.me
curl.exe --socks5-hostname "LOGIN:PASSWORD@HOST:SOCKS_PORT" https://ifconfig.me

如果检查未通过

您看到什么原因怎么办
两行都是“gave no answer”,代码 000通往服务器的路径上端口被关闭在服务商面板和 ufw 中打开,核对服务器地址
代理只在服务器本机响应服务商或运营商的防火墙重复第 3 步,联系服务商客服
密码正确却返回 407用户名或密码有误,或您的 IP 不在允许范围内对照 /root/proxy.txt 和设置中的 allow 行
SOCKS5 不需用户名就能进入设置被手动更改重新运行安装程序,会生成新数据
安装程序提示“did not start”服务未启动查看原因:journalctl -u 3proxy -n 30
安装程序提示“test request failed”服务在运行,但服务器无法通过代理访问互联网查看日志:tail /usr/local/3proxy/logs/3proxy.log.*
安装时依赖错误系统早于 Ubuntu 22.04 和 Debian 12在服务商面板中重装新系统

第 5 步。连接代理

浏览器请使用 HTTP 端口:没有扩展的 Chrome 和 Firefox 无法为 SOCKS5 输入用户名和密码。各项填在哪里,见手动配置代理一文。程序通常接受 IP:PORT:LOGIN:PASSWORD 形式的线路,如果需要其他格式,可用代理转换器改写。

连上了吗?通过代理打开匿名检测:您会看到网站所见的地址和请求头。HTTP 和 SOCKS5 的区别以及不同软件该用哪个端口,见协议对比一文。

如何管理服务器

下面所有命令都在服务器上运行。服务状态和今天的连接日志。3proxy 每天新建一个文件,保留一周。按 Ctrl+C 退出日志:

服务器
systemctl status 3proxy --no-pager
tail -f "$(ls -t /usr/local/3proxy/logs/* | head -1)"

更改密码。把 LOGIN 换成报告中的用户名。命令会显示新密码,旧密码立即失效,/root/proxy.txt 中仍是之前的数据:

服务器
NEW="$(openssl rand -hex 12)"
sed -i "s/^LOGIN:CL:.*/LOGIN:CL:$NEW/" /usr/local/3proxy/conf/passwd
systemctl restart 3proxy
cat /usr/local/3proxy/conf/passwd

添加第二个用户:

服务器
echo "friend:CL:$(openssl rand -hex 12)" >> /usr/local/3proxy/conf/passwd
systemctl restart 3proxy
cat /usr/local/3proxy/conf/passwd

如果您的地址固定,可只允许该地址。把 YOUR_IP 换成您的 IP。其他地址即使密码正确,代理也会返回 407:

服务器
sed -i 's/^allow \*$/allow * YOUR_IP/' /usr/local/3proxy/conf/3proxy.cfg
systemctl restart 3proxy

不再需要服务器时删除一切:

服务器
systemctl disable --now 3proxy
apt-get purge -y 3proxy </dev/null
rm -rf /usr/local/3proxy /etc/3proxy /root/proxy.txt

安全检查清单

访问设置有误的代理会变成公共代理。扫描器不断扫描服务商地址,开放的端口很快就会进入免费列表:接下来就是他人的流量、被占满的通道和向服务商的投诉。脚本处理了基本项,其余靠您:

  1. 用下面的命令启用防火墙,填入报告中的端口:对外只保留 SSH 和代理。
  2. 启用系统自动更新。3proxy 是单独的软件包,所以每隔几个月检查是否有新版本。
  3. 请记住,代理的用户名和密码未加密传输。在公共网络中邻居可能截获,所以在咖啡馆和机场请通过 VPN 连接代理,或把访问限制为您的 IP。详见公共 Wi-Fi 分析。
  4. 每月查看一次日志中的陌生地址,并用 RBL 黑名单检查服务器 IP。
服务器
DEBIAN_FRONTEND=noninteractive apt-get install -y ufw unattended-upgrades </dev/null
printf 'APT::Periodic::Update-Package-Lists "1";\nAPT::Periodic::Unattended-Upgrade "1";\n' > /etc/apt/apt.conf.d/20auto-upgrades
ufw allow 22/tcp
ufw allow HTTP_PORT/tcp
ufw allow SOCKS_PORT/tcp
ufw --force enable

如果您的 SSH 在其他端口,运行前把 22 换成它,否则会失去对服务器的访问。

您得到什么,失去什么

自己的 VPS代理服务
控制和日志完全归您在运营方一侧
地址数量一个,最多几个数千地址的线路池
地址类型服务商的数据中心从数据中心到家庭和蜂窝
地理位置您 VPS 所在国家可选国家,住宅还可选城市
轮换没有,地址固定按请求或按会话
维护更新和在线率靠您包含在价格中
入门价格VPS 租金加时间从按小时订阅起

这里最重要的是地址类型这一行。VPS 位于托管子网中,任何网站都能从自治系统看出来:用 ASN 查询检查您的服务器。电商平台和社交网络对这类网段很警惕,个人服务器在那里改变不了什么。它的地址不会变成家庭或蜂窝地址。

在费用上也别抱幻想。便宜的 VPS 与邻居共享处理器和通道,所以晚间掉速很常见。许多服务商限制流量,超额费用明显高于代理服务的每 GB 价格。

什么时候值得自建代理

  • 为自己的服务提供固定 IP。管理后台和内部面板只对一个地址开放:VPS 便宜又长期地提供它。
  • 自己机器之间的隧道。办公室和服务器直接相连,由您决定什么经过这个节点。
  • 日志要求。流量记录必须只保存在您这里。
  • 学习。搭建、弄坏、修好:这是理解代理内部如何工作的最快方式。

什么时候需要服务

一旦任务需要多个地址、轮换或特定 IP 类型,个人服务器就出局了:维护数百台 VPS 比任何方案都贵。采集、价格监控、账号工作和广告检查都依靠线路池。我们的方案适合这些任务:带 ip:port 列表的套餐和可选国家的住宅地址。许多人两者都用:个人服务器用于访问自己的系统,服务线路池用于工作任务。

继续阅读

黑暗的城市,佛塔剪影和现代高楼由发光的弧线相连

代理

中国代理指南:谁需要中国 IP,它又能带来哪些实际的好处呢

中国网络有自己的规则,从外部观察几乎没有意义:部分网站只响应中国地址,价格和搜索结果也与全球不同。本文说明哪些任务需要中国 IP,这类代理实际能带来什么、做不到什么,以及选择哪种形式:中国套餐地址池还是住宅线路。

1 分钟阅读
三条形状各异的发光隧道在黑暗的数据中心汇聚到一个拱门

代理

代理服务器的类型:HTTP 和 SOCKS5 究竟有哪些区别详解

协议决定软件如何把请求交给代理:HTTP 代理读取完整请求,CONNECT 为 TLS 打开隧道,SOCKS5 传输数据流并支持 UDP。我们配合示意图和表格分析全部四种协议:socks5h 在哪里重要,为什么反检测浏览器用 HTTP,匿名级别如何从请求头看出,以及协议如何与地址来源搭配。

2 分钟阅读
欧洲深色立体地图,城市之间有发光的细线

代理

欧洲代理指南:谁需要欧洲 IP,又应该选择哪一种合适的方案

网站越来越多地把内容与访客所在国家绑定:柏林和巴黎的价格、结果、库存和广告都不一样。我们梳理必须使用欧洲地址的任务,并为每种任务选择工具:套餐中的欧洲地址池用于批量检查,可选国家和城市的住宅线路用于账号和精确定位。

1 分钟阅读

全部文章

价格 免费试用1小时