[Feature Request] 请求增加sendThrough功能
比如流媒体解锁,V4可以但V6不行,需要屏蔽V6出站,sendThrough功能就很需要了
目前如果要实现的话,需要开启服务端DNS,并且在Route里把所有V6地址指向黑洞,感觉略复杂且不优雅,因此希望能加入sendThrough,谢谢~
有点意思~
此功能有用、好实现,即将被实现。
最新代码实现了,你可以试试。
最新代码实现了,你可以试试。
测试失败了,服务启动时说: ERROR can not create outClient: {"error": " [ parse sendthrough ip failed , Detail: address 1.1.1.1: missing port in address ] "} 是必须添加端口吗?
最新代码实现了,你可以试试。
测试失败了,服务启动时说: ERROR can not create outClient: {"error": " [ parse sendthrough ip failed , Detail: address 1.1.1.1: missing port in address ] "} 是必须添加端口吗?
啊,我注释写错了。应该是要加一个 :0 表示 随机端口
实际上指明端口也不一定是坏事。也许一些udp的特殊用途能用到。
不过确实,应该加一个检测,如果没指名端口,则自动认为是随机端口。
最新代码实现了,你可以试试。
测试失败了,服务启动时说: ERROR can not create outClient: {"error": " [ parse sendthrough ip failed , Detail: address 1.1.1.1: missing port in address ] "} 是必须添加端口吗?
啊,我注释写错了。应该是要加一个
:0表示 随机端口实际上指明端口也不一定是坏事。也许一些udp的特殊用途能用到。
不过确实,应该加一个检测,如果没指名端口,则自动认为是随机端口。
加上:0后启动不报错了,但出站时还是有错误,导致走不了这个dial: Failed in reading first payload, not because of timeout, will hung up {"connid": 664907, "target": "1.1.1.1:42430", "error": "body closed by handler"}
这个错误应该是读取错误,也就是listen部分的问题,和dial没关系,因为还没开始拨号。你可以自行在main.go 里搜索这段错误的位置。
这个错误应该是读取错误,也就是listen部分的问题,和dial没关系,因为还没开始拨号。你可以自行在main.go 里搜索这段错误的位置。
刚才又试了下,没报错了,但是没按指定IP出站,syatemctl日志看起来正常,稍后我开VS里的日志再看看。
这个错误应该是读取错误,也就是listen部分的问题,和dial没关系,因为还没开始拨号。你可以自行在main.go 里搜索这段错误的位置。
日志来了,级别是debug,服务器为V4V6双栈,在dial处指定为V4的IP,但实际访问谷歌会同时使用V4和V6(用谷歌搜索my ip即可显示当前访问IP),在IPV6的测试网站也会显示有IPV6地址(如果指定V4出站的话预期行为是检测不出V6地址) 日志中的 111.222.333.444 和 2408:2:2:2:2:2:2:2 是本地地址 666.777.888.999 和 2200:8000:2000:9999::1 是服务器地址
你在 sendThrough配置中,具体是用的 “127.0.0.1:0”,“0.0.0.0", 还是 “111.222.333.444:0" 呢?
如果是前两种,golang应该也是会自动用ipv6的。
是“666.777.888.999:0"
你要是直接贴上你配置文件就省事多了,省的我一句一句问。
你是不是在trojan上设置的sendthrough?
direct也需要设sendThrough的,否则直连的链接是不会通过你trojan设置的sendThrough拨号的。
你的vps如果是在国外,那么一般都是直接direct链接国外网址的,对吧,那你就要在direct上配置sendThrough
如果不是这个问题的话,那么我猜还有一种可能。因为日志里显示似乎所有的请求都是dns解析之前的。也许被解析成ipv6之后,sendThrough的配置就失灵了?(谁知道golang内部搞什么鬼)
如果直接访问一个ipv6的 ip地址呢?
实在搞不懂啊,为什么你的 "connid" 都是 251049, 而 handler 却显示为 tcp+tls+trojan,不应该再加上 +smux+simplesocks吗。
如果不是多路复用的话,为什么所有连接的connid都是一个值呢。
难道你用正则把所有connid都改了?
你要是直接贴上你配置文件就省事多了,省的我一句一句问。
你是不是在trojan上设置的sendthrough?
direct也需要设sendThrough的,否则直连的链接是不会通过你trojan设置的sendThrough拨号的。
你的vps如果是在国外,那么一般都是直接direct链接国外网址的,对吧,那你就要在direct上配置sendThrough
我的配置比较简单,只有Listen和dial,之前用没任何问题,就现在新增了这个sendThrough,所以我没贴,现在我贴上来吧
[[listen]]部分就是Trojans,没什么异常就不贴了,确实有复用,日志里connid这个问题咱们不管它
[[dial]] tag = "Trojan" protocol = "direct" fullcone = true sendThrough = "666.777.888.999:0"
因为我看example里是只有dial部分,所以我只在dial那里写了,感觉listen部分不需要
至于DNS解析,我觉得有可能,我稍后看看V2ray那边的做法吧
你这个connid问题与handler的信息输出的矛盾要向我解释清楚。让你贴配置你就贴全好不好?涉及到复用,我要看你怎么配置的多路复用
我又试了V2ray,配置文件没有DNS字段,使用sendThrough后可以达到预期目标,出站都是V4,V2和VS的DNS逻辑可能不同。
目前的判断,应该是dns问题。也许我们不应该在sendThrough后,直接把dns解析交给系统。我们要强制解析成对应ip类型才行。
估计是因为,同一个网卡同时具有ipv4和ipv6的话,golang在实际使用时可能不会尊重我们传入的localAddr?如果是分开的网卡可能就不会出现这个问题。
参考一下
https://github.com/Shadowsocks-NET/v2ray-go/pull/12/commits/bc953646c627a3e1d2b911a889e2b7e1125249f9
另外,拨号时,如果是注明 "tcp4" 或者 "tcp6", 应该可以:
https://stackoverflow.com/questions/53055808/golang-force-net-http-client-to-use-ipv4-ipv6
在最新 提交 ed7fbcbb5065a37c5331aadf798e431d6beb9e5a 中,注明了一下4/6,你可以再次编译尝试一下。
试了beta4,加入了 sendThrough = "666.777.888.999:0" 但还是优先走的V6,并且VS在启动时有一句没见过的报错 2022-11-01 23:20:55.417 ERROR can not create outClient: {"error": "wrong parameter"} 另外日志中的出站也有点变化,结尾变成了 "through": "tcp+direct://"} ,双斜杠后边本来是dial名字的,变成空白了,等有空打印下详细日志
[[dial]] tag = "Trojan" protocol = "direct" sendThrough = "666.777.888.999:0"
本地地址是 2408:2:2:2:2:2:2:2 服务器地址是 666.777.888.999 和 2200:8000:2000:9999::1
只加了sendThrough这行,其余没变化,没开DNS和route。启动时有报错 ERROR can not create outClient: {"error": "wrong parameter"} ,出站日志打印的末尾缺失了tag
最新代码解决了该问题,我测试通过了,你也编译试一下吧
我之前测试明明成功的,怎么又不行。
我测的时候,0.0.0.0就是可以指定v4的。(然后[::0] 可以指定v6)
成功时,会显示 ipv6的地址无法被解析,can't resolve 之类的。
你在本地测试一下这个配置:
[[listen]]
protocol = "socks5http"
port = 10800
host = "127.0.0.1"
[[dial]]
protocol = "direct"
sendThrough = "0.0.0.0:0"
我测是好使的,访问 http://www.test-ipv6.com/ 是显示没有ipv6的(我不用vs做代理访问时是有ipv6的)
成功无法访问的日志:
2022-12-10 08:49:39.080 INFO Request {"connid": 859882, "From": "127.0.0.1:52386", "Target": "tcp://mtu1280.jp2.test-ipv6.com:80", "through": "dual+direct://0.0.0.0:0#x1"}
2022-12-10 08:49:39.138 WARN Failed dialing {"connid": 859882, "target": "mtu1280.jp2.test-ipv6.com:80", "error": "dial tcp4: lookup mtu1280.jp2.test-ipv6.com on [2408:xxxxxxxxx]:53: no such host"}
我是只做服务端,意思是需要客户端也用VS吗
不是啊。这不是测试吗,一样啊
你服务端不就是 direct 出吗。现状我们在自己电脑上这么测不也是direct 出吗,这不是同理吗?反正sendThrough就是测direct
好的,我去试试
测试了一下
任何代理客户端都不打开,直接访问 www.test-ipv6.com ,测出的结果是全绿,10/10,就是说IPV6没有任何问题
使用最新版verysimple.exe以及上边几楼的配置,打开测试网站后,依然有IPV6地址,但不是全绿,有2个红色的: 测试结果表明你的 IPv6 MTU 可能存在问题,这会导致 IPv6 网站加载缓慢乃至失败。 [更多信息] IPv6 基本正常,但较大的数据包传输失败,部分网站可能无法正常显示。请向运营商咨询 MTU 是否存在问题,尤其是网络隧道的 MTU。 检查你的防火墙,确保已放行 ICMPv6 消息(尤其是第 2 类,“数据包过大”)。 [更多信息]
我的系统是Win7,不知道是不是你在linux系统里测试的?Win还是没能完全屏蔽掉V6,需要debug日志吗?