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 会调用另一条命令。
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安全检查清单
访问设置有误的代理会变成公共代理。扫描器不断扫描服务商地址,开放的端口很快就会进入免费列表:接下来就是他人的流量、被占满的通道和向服务商的投诉。脚本处理了基本项,其余靠您:
- 用下面的命令启用防火墙,填入报告中的端口:对外只保留 SSH 和代理。
- 启用系统自动更新。3proxy 是单独的软件包,所以每隔几个月检查是否有新版本。
- 请记住,代理的用户名和密码未加密传输。在公共网络中邻居可能截获,所以在咖啡馆和机场请通过 VPN 连接代理,或把访问限制为您的 IP。详见公共 Wi-Fi 分析。
- 每月查看一次日志中的陌生地址,并用 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 分钟阅读