Results 171 comments of zfl9

vpn就是将多个位于不同网络的主机连起来,就像是真实的局域网那样连接起来,没什么特别之处。 说白了,一个主机连上vpn后,不过就是在这台主机上多了一个 网络接口(网卡)。该主机传出的流量要发往谁(哪个网络接口),都是通过路由规则决定的。 dns也是一样的,主机配置的dns是什么ip,就会根据路由规则,将其发往正确的目的地。在我们这里,ss-tproxy主机就是正确的目的地,因为它有防污染的dns服务(chinadns-ng)。 --- 你要理解一个正常的网络访问是什么流程,才知道如何实现你的目的: - 通常都是通过域名访问目标网络服务,因此第一步就是DNS解析,因此主机的DNS设置很重要,如果需要避免污染(google等网站会被污染),必须使用ss-tproxy主机上的DNS服务,否则解析拿到的IP就是错误的。 - DNS解析拿到IP之后,就是根据主机的路由规则,看IP数据包要从哪个网络接口发出去。如果你希望走ss-tproxy的代理,自然要想办法让这些IP包发往ss-tproxy主机,这样ss-tproxy这边才能处理它。 - 要做的这一点,有个最简单的办法,就是在主机上配置默认路由,将默认路由(网关)指向ss-tproxy主机的IP(vpn接口的ip),这就是“常规局域网代理时”,局域网主机所做的事情(也即文档说的,如果局域网主机想走ss-tproxy的透明代理服务,就需要把“网关”和DNS指向ss-tproxy主机)。

是的,你这个dns没有走ss-tproxy的chinadns-ng,所以解析拿到的ip不对

有类似用法的,手机上确实不好调试,如果能运行 Termux 的话,可能调试起来好一些。

我记得naive支持redir://传入协议,虽然我不知道你的具体使用环境,但根据你的描述。我感觉增加一个iptables规则,就能将dns访问重定向至naive,从而走代理 假设你配置的dns上游是tcp://8.8.8.8,并且naive的redir监听端口是1088,则 iptables -t nat -A OUTPUT -p tcp -d 8.8.8.8 --dport 53 -j REDIRECT --to-ports 1088

我的想法是,如果能通过其他方式解决(比如上面这种简单方法),就尽量不给chinadns-ng增加过多代码。 chinadns-ng基本都是运行在Linux透明代理环境中,所以我觉得加个iptables/nftables规则应该是比较轻松自然的事。

端口错了,要么修改 clash.yaml 把 tproxy-port 改为 60080 (同readme的配置),要么修改 ss-tproxy.conf,把 proxy_tcpport 和 proxy_udpport 改为 7893,总之必须保持一致。

clash配置问题?先自己检查下吧。readme的clash配置是测试过的,另外你说在docker部署?ss-tproxy在docker容器内?curl/wget 在宿主机?

还有为什么你的 start_clash 会漏出 clash 日志?readme 里面已经把 stdout stderr 重定向到日志文件了呀。

跨容器(network namespace)的透明代理,我没有测试过,最好不要这么做,除非你深刻理解透明代理和docker容器之间的网络模型。 我建议你把 ss-tproxy 和 相关的代理进程(clash)运行在宿主机而不是容器内,或者,如果要使用容器,那么 ss-tproxy 所在容器的网络要使用 host(即,宿主机的 network namespace),而不是默认的 bridge(会创建单独的 network namespace)。 ss-tproxy 的“本机”代理,仅限当前 network namespace。如果要跨 network namespace,必须抽象出一个“局域网”,将其他主机(network namespace)的网关和dns指向 ss-tproxy 主机(network namespace)所在 IP。