Skip to content
This repository has been archived by the owner on Mar 17, 2024. It is now read-only.

[Feature Request] 请求增加sendThrough功能 #141

Closed
Tun2Sucks opened this issue Sep 1, 2022 · 33 comments
Closed

[Feature Request] 请求增加sendThrough功能 #141

Tun2Sucks opened this issue Sep 1, 2022 · 33 comments
Assignees
Labels
bug Something isn't working feature request 易错点

Comments

@Tun2Sucks
Copy link

比如流媒体解锁,V4可以但V6不行,需要屏蔽V6出站,sendThrough功能就很需要了

目前如果要实现的话,需要开启服务端DNS,并且在Route里把所有V6地址指向黑洞,感觉略复杂且不优雅,因此希望能加入sendThrough,谢谢~

@e1732a364fed
Copy link
Owner

有点意思~

@e1732a364fed
Copy link
Owner

此功能有用、好实现,即将被实现。

@e1732a364fed
Copy link
Owner

最新代码实现了,你可以试试。

@Tun2Sucks
Copy link
Author

最新代码实现了,你可以试试。

测试失败了,服务启动时说:
ERROR can not create outClient: {"error": " [ parse sendthrough ip failed , Detail: address 1.1.1.1: missing port in address ] "}
是必须添加端口吗?

@e1732a364fed
Copy link
Owner

e1732a364fed commented Sep 15, 2022

最新代码实现了,你可以试试。

测试失败了,服务启动时说: ERROR can not create outClient: {"error": " [ parse sendthrough ip failed , Detail: address 1.1.1.1: missing port in address ] "} 是必须添加端口吗?

啊,我注释写错了。应该是要加一个 :0 表示 随机端口

实际上指明端口也不一定是坏事。也许一些udp的特殊用途能用到。

不过确实,应该加一个检测,如果没指名端口,则自动认为是随机端口。

@Tun2Sucks
Copy link
Author

最新代码实现了,你可以试试。

测试失败了,服务启动时说: 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"}

@e1732a364fed
Copy link
Owner

这个错误应该是读取错误,也就是listen部分的问题,和dial没关系,因为还没开始拨号。你可以自行在main.go 里搜索这段错误的位置。

@Tun2Sucks
Copy link
Author

这个错误应该是读取错误,也就是listen部分的问题,和dial没关系,因为还没开始拨号。你可以自行在main.go 里搜索这段错误的位置。

刚才又试了下,没报错了,但是没按指定IP出站,syatemctl日志看起来正常,稍后我开VS里的日志再看看。

@e1732a364fed e1732a364fed reopened this Sep 18, 2022
@e1732a364fed e1732a364fed reopened this Sep 18, 2022
@e1732a364fed
Copy link
Owner

你在 sendThrough配置中,具体是用的 “127.0.0.1:0”,“0.0.0.0", 还是 “111.222.333.444:0" 呢?

如果是前两种,golang应该也是会自动用ipv6的。

@Tun2Sucks
Copy link
Author

是“666.777.888.999:0"

@e1732a364fed
Copy link
Owner

你要是直接贴上你配置文件就省事多了,省的我一句一句问。

你是不是在trojan上设置的sendthrough?

direct也需要设sendThrough的,否则直连的链接是不会通过你trojan设置的sendThrough拨号的。

你的vps如果是在国外,那么一般都是直接direct链接国外网址的,对吧,那你就要在direct上配置sendThrough

@e1732a364fed
Copy link
Owner

如果不是这个问题的话,那么我猜还有一种可能。因为日志里显示似乎所有的请求都是dns解析之前的。也许被解析成ipv6之后,sendThrough的配置就失灵了?(谁知道golang内部搞什么鬼)

如果直接访问一个ipv6的 ip地址呢?

@e1732a364fed
Copy link
Owner

e1732a364fed commented Sep 19, 2022

实在搞不懂啊,为什么你的 "connid" 都是 251049, 而 handler 却显示为 tcp+tls+trojan,不应该再加上 +smux+simplesocks吗。

如果不是多路复用的话,为什么所有连接的connid都是一个值呢。

难道你用正则把所有connid都改了?

@e1732a364fed
Copy link
Owner

你这个connid问题与handler的信息输出的矛盾要向我解释清楚。让你贴配置你就贴全好不好?涉及到复用,我要看你怎么配置的多路复用

@Tun2Sucks
Copy link
Author

我又试了V2ray,配置文件没有DNS字段,使用sendThrough后可以达到预期目标,出站都是V4,V2和VS的DNS逻辑可能不同。

@e1732a364fed
Copy link
Owner

目前的判断,应该是dns问题。也许我们不应该在sendThrough后,直接把dns解析交给系统。我们要强制解析成对应ip类型才行。

估计是因为,同一个网卡同时具有ipv4和ipv6的话,golang在实际使用时可能不会尊重我们传入的localAddr?如果是分开的网卡可能就不会出现这个问题。

@e1732a364fed
Copy link
Owner

参考一下

Shadowsocks-NET/v2ray-go@bc95364

@e1732a364fed
Copy link
Owner

另外,拨号时,如果是注明 "tcp4" 或者 "tcp6", 应该可以:

https://stackoverflow.com/questions/53055808/golang-force-net-http-client-to-use-ipv4-ipv6

@e1732a364fed
Copy link
Owner

在最新 提交 ed7fbcb 中,注明了一下4/6,你可以再次编译尝试一下。

@Tun2Sucks
Copy link
Author

试了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名字的,变成空白了,等有空打印下详细日志

@e1732a364fed
Copy link
Owner

e1732a364fed commented Dec 5, 2022

最新代码解决了该问题,我测试通过了,你也编译试一下吧

@e1732a364fed e1732a364fed added the bug Something isn't working label Dec 5, 2022
@e1732a364fed e1732a364fed self-assigned this Dec 5, 2022
e1732a364fed added a commit that referenced this issue Dec 5, 2022
不能给direct设置 AddrStr 为 sendThrough地址,否则该地址会被认为是拨号的目标地址
@e1732a364fed
Copy link
Owner

我之前测试明明成功的,怎么又不行。

@e1732a364fed e1732a364fed reopened this Dec 10, 2022
@e1732a364fed
Copy link
Owner

我测的时候,0.0.0.0就是可以指定v4的。(然后[::0] 可以指定v6)

@e1732a364fed
Copy link
Owner

成功时,会显示 ipv6的地址无法被解析,can't resolve 之类的。

@e1732a364fed
Copy link
Owner

你在本地测试一下这个配置:

[[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"}

@Tun2Sucks
Copy link
Author

我是只做服务端,意思是需要客户端也用VS吗

@e1732a364fed
Copy link
Owner

不是啊。这不是测试吗,一样啊

@e1732a364fed
Copy link
Owner

你服务端不就是 direct 出吗。现状我们在自己电脑上这么测不也是direct 出吗,这不是同理吗?反正sendThrough就是测direct

@Tun2Sucks
Copy link
Author

好的,我去试试

@Tun2Sucks
Copy link
Author

测试了一下

任何代理客户端都不打开,直接访问 www.test-ipv6.com ,测出的结果是全绿,10/10,就是说IPV6没有任何问题

使用最新版verysimple.exe以及上边几楼的配置,打开测试网站后,依然有IPV6地址,但不是全绿,有2个红色的:
测试结果表明你的 IPv6 MTU 可能存在问题,这会导致 IPv6 网站加载缓慢乃至失败。 [更多信息]
IPv6 基本正常,但较大的数据包传输失败,部分网站可能无法正常显示。请向运营商咨询 MTU 是否存在问题,尤其是网络隧道的 MTU。 检查你的防火墙,确保已放行 ICMPv6 消息(尤其是第 2 类,“数据包过大”)。 [更多信息]

我的系统是Win7,不知道是不是你在linux系统里测试的?Win还是没能完全屏蔽掉V6,需要debug日志吗?

@e1732a364fed
Copy link
Owner

我是在macos里测的。

@e1732a364fed
Copy link
Owner

e1732a364fed commented Dec 13, 2022

我在windows上测试了一下(win10),结果很完美,完全能挡住。ip和域名都能挡住

挡住ip时,会显示 dial tcp4: address xxxx::1 no suitable address found.

我没法重现你所讲的一切

@Tun2Sucks
Copy link
Author

升级到1.2.5试了下,功能完全正常,之前是不是有代码没合并呀: ),先关了

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working feature request 易错点
Projects
None yet
Development

No branches or pull requests

2 participants