Skip to content

故障排查

zfl9 edited this page Jun 21, 2023 · 9 revisions

如果透明代理未正常工作,请按照如下顺序进行自我排查:

脚本是否报错

如果脚本执行有报错,先判断是不是配置问题,比如 ss-tproxy.conf 某些配置的语法错了。因为 ss-tproxy.conf 是一个 bash 脚本,因此必须符合 bash 的语法。比如给变量赋值时,等号两边不能有空格,字符串请尽量使用引号括起来,不允许空函数(如果函数确实要是空的,那就加个 return 语句)。

执行出错时,请带上 -x 选项,重新执行一遍,看看是哪行出错,报告问题时,请描述是哪条命令出错,并且附上完整的 -x 输出(如果有隐私数据,请自行修改)。

配置是否正确

检查 ss-tproxy.conf、代理软件的配置是否正确,README 说明了许多配置细节,ss-tproxy.conf 中也有详细说明,它们并不是废话,请细心阅读。比较容易出错的配置有:

  • tproxy:必须与本机代理进程的传入协议一致(主要是 TCP),TCP 有两种传入协议:REDIRECT(NAT)、TPROXY。

  • tcponly:如果 UDP 代理不支持(取决于代理套件、代理配置、server端配置、机场配置),请设为 true,只代理 TCP。

  • selfonly:如果希望代理内网主机,请设为 false,并且内网主机的 网关、DNS 必须都指向 ss-tproxy 主机。

  • proxy_procgroup:所有本机代理进程都必须以此 group 身份运行,运行 grep Gid /proc/进程PID/status,检查最后一列的 gid 是否与此处配置的 gid 一致(可以通过 /etc/group 文件获知 name 的 gid),如果不一致,说明没有以给定的 fsgid 身份运行。你可以使用 set_proxy_group 可执行文件名 修改所属 group,设置 setgid 权限位,然后重启代理进程,检查 fsgid 是否正确。如果代理进程有提供 change group 的功能,也可以使用它们来切换 gid。

  • proxy_tcpport:端口必须与本机代理进程的 TCP 传入端口一致,并且这个端口需要支持 REDIRECT/TPROXY 传入,具体是哪个,取决于 tproxy 配置。

  • proxy_udpport:端口必须与本机代理进程的 UDP 传入端口一致,并且这个端口需要支持 TPROXY 传入;如果是 tcponly 模式,此配置忽略。

  • dns_mainport:如果 ss-tproxy 主机上有其他进程监听了 53 端口,请修改为其他端口。已知 systemd-resolved 会监听 53 端口,会导致 dnsmasq 启动失败。

  • chinadns_bind_port:如果存在端口冲突,请修改。

  • dns2tcp_enable:如果你不清楚该选项的作用,请保持默认值:auto。

  • dns2tcp_bind_port:如果存在端口冲突,请修改。

  • ipts_set_snat:这个只会影响内网主机,如果黑名单正常访问(如google),但白名单无法访问(如baidu),可以将此选项改为 true,看看是否正常。

  • ipts_set_snat6:同 ipts_set_snat。

  • ipts_proxy_dst_port:如果不清楚作用,请保持默认值:留空。

服务是否 running

如果有某个服务不是 running 状态,请检查配置是否正确,端口是否冲突。并且打开 代理进程、dns进程(dnsmasq/chinadns/dns2tcp)的详细日志,检查日志输出。

检查 dns 是否正常

在 ss-tproxy 主机检查 dns 是否正常,如果 curl 提示 Could not resolve host,那就是 dns 有问题。观察 dns进程的日志、代理进程的日志,看有没有异常提示。

记得白名单和黑名单都测试一下,如果白名单正常但黑名单不正常,通常就是代理软件有问题,检查代理是否支持 UDP,因为 dns 默认走 UDP 协议。

检查 tcp/udp 是否正常

比如使用 curl 访问白名单和黑名单,如果白名单正常,黑名单不正常,通常是代理软件问题,检查代理配置是否正确。

如果在其他主机出现黑名单正常,白名单不正常的情况,可能需要设置 snat 规则,请查看上面的 snat 配置说明。

通过 issue 报告问题

请给出 ss-tproxy.conf 配置、代理软件配置,代理程序的日志,dns程序的日志。

如果执行有报错,请带上 -x 再运行一次(如 ss-tproxy start -x),把调试输出发出来。

并描述是 DNS 有问题,还是 TCP/UDP 代理问题。是 ss-tproxy 本机有问题,还是内网主机有问题。