ARTICLE

GOST SOCKS5 代理状态检查与故障排查

GOST SOCKS5 代理状态检查与故障排查
作者mayday.life
时间2026-07-13
观看1 次
阅读约 10 分钟

本文记录一套 GOST SOCKS5 代理的完整排查方法,适用于以下结构:

应用程序
   |
   v
客户端服务器 127.0.0.1:10801
   |
   | socks5+tls
   v
上游服务器 <UPSTREAM_IP>:10800
   |
   v
目标网站

本次故障的最终结论是:客户端 GOST 服务运行正常,但上游服务器的 GOST 服务没有启动。上游 unit 文件并未被删除,实际服务名是 gost.service,而不是最初检查的 gost-server.service。该服务处于 disabled 状态,因此服务器重启后没有自动运行。

一、检查 SOCKS5 监听端口

假设本地 SOCKS5 端口为 10801

sudo ss -lntp | grep ':10801'

示例输出:

LISTEN 0 4096 *:10801 *:* users:(("gost",pid=255133,fd=6))

这表示:

  • 10801 正在监听。
  • 监听程序是 gost
  • 进程 PID 是 255133
  • *:10801 表示监听所有网络接口,而不只是本机回环地址。

如果该代理只供服务器本机使用,建议将监听地址限制为 127.0.0.1:10801,避免代理端口直接暴露到公网。

二、根据 PID 定位 systemd 服务

已知进程 PID 后,可以直接查询所属服务:

sudo systemctl status 255133

本次查询结果显示:

gost-client.service - GOST Client Tunnel Service
Loaded: loaded (/etc/systemd/system/gost-client.service; enabled)
Active: active (running)
Main PID: 255133 (gost)
CGroup: /system.slice/gost-client.service

由此可以确认:

  • 服务名为 gost-client.service
  • 服务正在运行。
  • 服务已经设置为开机启动。
  • 当前 GOST 进程确实由该服务管理。

还可以使用以下命令辅助定位:

cat /proc/255133/cgroup
ps -fp 255133
sudo tr '\0' ' ' < /proc/255133/cmdline; echo
sudo readlink -f /proc/255133/exe

三、查看客户端配置和日志

查看 unit 文件及实际启动参数:

sudo systemctl cat gost-client.service
sudo systemctl show gost-client.service -p ExecStart

查看最近日志:

sudo journalctl -u gost-client.service -n 100 --no-pager

持续观察日志:

sudo journalctl -u gost-client.service -f

注意:ExecStart 中可能包含代理用户名和密码。保存日志、截图或向他人提供输出时,应先隐藏凭据。

四、判断 connection refused 的故障位置

本次客户端日志包含以下关键信息:

[route] 127.0.0.1:<LOCAL_PORT> -> auto://:10801 \
  -> 1@socks5+tls://<UPSTREAM_IP>:10800 -> httpbin.org:80

dial tcp <UPSTREAM_IP>:10800: connect: connection refused

请求路径已经非常明确:

本地程序 -> 127.0.0.1:10801 -> <UPSTREAM_IP>:10800 -> 目标网站

客户端能够接收到本地请求,但建立到上游 10800 的 TCP 连接时被拒绝。因此,故障不在本机 10801,而在上游服务或上游端口。

connection refused 通常表示:

  • 目标服务器网络可达;
  • 目标端口没有程序监听;或者
  • 防火墙使用 REJECT 明确拒绝连接。

如果是安全组丢弃流量或网络路由不通,更常见的表现是连接超时,而不是立即返回 connection refused

五、从客户端测试上游端口

在客户端服务器执行:

nc -vz <UPSTREAM_IP> 10800

常见结果:

Connection refused

表示服务器可达,但端口未监听或被明确拒绝。

Connection timed out

表示应重点检查云安全组、防火墙、路由和公网 IP。

succeeded

表示 TCP 端口已连通,下一步应检查 GOST 协议、TLS、用户名和密码是否匹配。

六、检查上游 GOST 服务

登录上游服务器后,先检查端口和进程:

sudo ss -lntp | grep ':10800'
pgrep -a gost

不要直接假设服务名为 gost-server.service。先搜索实际 unit:

systemctl list-unit-files | grep -i gost
sudo find /etc/systemd/system /lib/systemd/system /usr/lib/systemd/system \
  -type f -iname '*gost*' -print

同时检查程序安装情况:

command -v gost
gost -V

本次实际输出为:

gost.service    disabled    enabled
/etc/systemd/system/gost.service
/usr/local/bin/gost
gost 2.11.5 (go1.19.2 linux/amd64)

这说明:

  • unit 文件仍然存在;
  • 正确服务名是 gost.service
  • GOST 二进制仍然存在;
  • 服务当前为 disabled,不会随系统启动;
  • 输出最后一列的 enabled 是系统预设值,不代表服务当前已启用。

由于 pgrep 没有找到进程,ss 也没有发现 10800 监听,因此可以确认上游 GOST 当时没有运行。

七、恢复上游服务

先检查服务配置和当前状态:

sudo systemctl cat gost.service
sudo systemctl status gost.service --no-pager -l

确认 ExecStart 中的监听端口、协议和凭据正确后,启动服务并设置开机自启:

sudo systemctl enable --now gost.service

再次确认:

sudo systemctl status gost.service --no-pager
sudo ss -lntp | grep ':10800'
pgrep -a gost

正常情况下,端口输出应类似:

LISTEN 0 4096 0.0.0.0:10800 0.0.0.0:* users:(("gost",pid=<PID>,fd=<FD>))

如果启动失败,查看日志:

sudo journalctl -u gost.service -n 100 --no-pager

修改 unit 文件后,需要重新加载并重启:

sudo systemctl daemon-reload
sudo systemctl restart gost.service

八、端到端验证

上游服务恢复后,先在客户端服务器检查 TCP 端口:

nc -vz <UPSTREAM_IP> 10800

然后通过本地 SOCKS5 代理请求公网 IP:

curl --socks5-hostname 127.0.0.1:10801 https://api.ipify.org

也可以请求测试网站:

curl --socks5-hostname 127.0.0.1:10801 http://httpbin.org/ip

同时观察客户端日志:

sudo journalctl -u gost-client.service -f

验证成功时,不应再出现:

connect: connection refused

九、仍然无法连接时的检查项

1. 检查服务监听地址

如果上游只监听:

127.0.0.1:10800

外部客户端无法连接。需要根据实际安全设计,让服务监听公网或内网网卡,例如 0.0.0.0:10800,然后通过防火墙限制来源。

2. 检查防火墙

sudo ufw status verbose
sudo iptables -L -n
sudo nft list ruleset

如果使用云服务器,还需要检查云厂商安全组是否允许 TCP 10800

建议只允许客户端服务器的固定 IP 访问该端口,不要直接向整个公网开放。

3. 检查协议和凭据

本次客户端使用的上游协议是:

socks5+tls://<UPSTREAM_IP>:10800

服务端必须使用兼容的 socks5+tls 配置。若服务端配置了认证,客户端用户名和密码也必须一致。

4. 检查公网 IP 和端口

确认客户端 unit 中配置的上游 IP 仍是当前服务器公网 IP:

sudo systemctl show gost-client.service -p ExecStart

同时确认上游服务实际监听的端口确实是 10800

十、常用管理命令

客户端服务:

sudo systemctl status gost-client.service
sudo systemctl restart gost-client.service
sudo journalctl -u gost-client.service -f

上游服务:

sudo systemctl status gost.service
sudo systemctl restart gost.service
sudo systemctl enable gost.service
sudo journalctl -u gost.service -f

端口检查:

sudo ss -lntp | grep -E ':10800|:10801'

十一、快速排查清单

遇到 GOST SOCKS5 无法连接时,可以按以下顺序检查:

  1. 使用 ss -lntp 确认本地 SOCKS5 端口是否监听。
  2. 根据 PID 使用 systemctl status <PID> 定位服务名。
  3. 使用 journalctl 确认失败发生在本地还是上游。
  4. 使用 nc -vz <UPSTREAM_IP> <PORT> 测试上游 TCP 端口。
  5. 在上游搜索真实的 GOST unit 名称,不要凭名称猜测。
  6. 使用 pgrepss 确认上游进程及监听端口。
  7. 使用 systemctl enable --now 启动服务并设置开机自启。
  8. 检查防火墙、安全组、监听地址、协议和认证信息。
  9. 使用 curl --socks5-hostname 完成端到端验证。

本次故障通过第 5 至第 7 步定位并恢复:上游服务实际名为 gost.service,因未启用开机启动而停止运行,最终导致客户端连接上游 10800 时收到 connection refused

COMMENTS

评论

0 条

暂无已通过的评论。