-
Notifications
You must be signed in to change notification settings - Fork 435
故障排查
如果透明代理未正常工作,请按照如下顺序进行自我排查:
如果脚本执行有报错,先判断是不是配置问题,比如 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 端口,建议关闭 systemd-resolved(或者将此处的端口改为其他值)。
-
ipts_set_snat:这个只会影响内网主机,如果黑名单正常访问(如google),但白名单无法访问(如baidu),可以将此选项改为 true,看看是否正常。
-
ipts_set_snat6:同 ipts_set_snat。
-
ipts_proxy_dst_port:如果不清楚作用,请保持默认值:留空。
如果有某个服务不是 running 状态,请检查配置是否正确,端口是否冲突。并打开 代理进程、chinadns-ng 的详细日志,检查相关日志输出。
在 ss-tproxy 主机检查 dns 是否正常,如果 curl 提示 Could not resolve host
,那就是 dns 有问题。观察 dns进程的日志、代理进程的日志,看有没有异常提示。
记得白名单和黑名单都测试一下,如果白名单正常但黑名单不正常,通常就是代理软件有问题,检查代理是否支持 UDP,因为 dns 默认走 UDP 协议。
比如使用 curl 访问白名单和黑名单,如果白名单正常,黑名单不正常,通常是代理软件问题,检查代理配置是否正确。
如果在其他主机出现黑名单正常,白名单不正常的情况,可能需要设置 snat 规则,请查看上面的 snat 配置说明。
请给出 ss-tproxy.conf 配置、代理软件配置,代理程序的日志,dns程序的日志。
如果执行有报错,请带上 -x 再运行一次(如 ss-tproxy start -x
),把调试输出发出来。
并描述是 DNS 有问题,还是 TCP/UDP 代理问题。是 ss-tproxy 本机有问题,还是内网主机有问题。