v2ray_simple icon indicating copy to clipboard operation
v2ray_simple copied to clipboard

使用ip2socks 代理ipv6地址错误

Open qiuzi opened this issue 1 year ago • 16 comments

不管使用socks5或tproxy模式经过的ipv6地址都是错误 socks5: udp://%5B2404:6800:4009:82b::200a%5D:443 tproxy: ERROR TProxy startLoopUDP loop read failed {"error": "unable to obtain original destination: %!s()"}

qiuzi avatar Aug 14 '22 15:08 qiuzi

试过在 IPv6 地址前后加上 [] 吗?

Leao9203 avatar Aug 22 '22 13:08 Leao9203

@Leao9203 使用的是ip2socks方式对接的 主要是UDP全部出问题

qiuzi avatar Aug 22 '22 14:08 qiuzi

收到。

e1732a364fed avatar Sep 07 '22 09:09 e1732a364fed

你这个百分号是怎么出现的?可能不是vs这里的问题。建议手动测试一下,不使用ip2socks

e1732a364fed avatar Sep 13 '22 06:09 e1732a364fed

在 https://github.com/FlowerWrong/ip2socks/blob/1f8417bf5f199c12397a5bb9dc9404126bdee68a/README.md

标着,似乎还没支持ipv6,在todo里有,没勾选上。

e1732a364fed avatar Sep 13 '22 06:09 e1732a364fed

@e1732a364fed 我使用 https://github.com/zfl9/ipt2socks 况且使用tproxy模式的udp 错误怎么处理?

qiuzi avatar Sep 13 '22 12:09 qiuzi

@e1732a364fed 我使用 https://github.com/zfl9/ipt2socks 况且使用tproxy模式的udp 错误怎么处理?

你配置文件和日志发全一些好吗?

e1732a364fed avatar Sep 13 '22 13:09 e1732a364fed

@e1732a364fed `[[listen]] protocol = "socks5" host = "[::]" port = 1080

[[listen]] protocol = "dokodemo" network = "udp" host = "127.0.0.1" port = 5353 target = "udp://8.8.8.8:53"

[[listen]] protocol = "tproxy" ip = "[::]" port = 60080 [[dial]] protocol = "trojans" uuid = "xxxzzzxx" host = "xxxZsss.eu.org" port = 443 advancedLayer = "grpc" path = "shop" sockopt.mark = 720` 在外面日志暂时给不了你

qiuzi avatar Sep 13 '22 13:09 qiuzi

我看了。

那个 5B 和 5D 实际上就是 ascii 的 []

也就是说,你的上游 把这个中括号也当作 ip的一部分传送过来了,才导致的识别问题。

tproxy 应该没什么ipv6方面的问题的,因为我们这里的代码 trojan-go 也在用。

e1732a364fed avatar Sep 13 '22 13:09 e1732a364fed

@e1732a364fed 其实我想去掉上游ipt2,trojan-go在tproxy udp的ipv6也同样出现问题 你可以复现一下nft的规则配置

qiuzi avatar Sep 13 '22 13:09 qiuzi

https://github.com/heiher/hev-socks5-tproxy 有规则参考

qiuzi avatar Sep 13 '22 13:09 qiuzi

啊,没想到trojan-go也有同样的问题!怪不得。因为我们两个都使用同样的上游代码。

看来需要好好研究一下了。

e1732a364fed avatar Sep 13 '22 14:09 e1732a364fed

我稍微改动了一下,你用最新代码重新编译试试看看还有没有问题

e1732a364fed avatar Sep 13 '22 14:09 e1732a364fed

有空我会试试 现在外地

qiuzi avatar Sep 13 '22 14:09 qiuzi

@e1732a364fed 2022-09-15 12:48:18.620 ERROR TProxy startLoopUDP loop read failed {"error": "unable to obtain original destination: <nil >"} nslookup www.youtube.com 2001:4860:4860::8888 使用tproxy模式还是不行

qiuzi avatar Sep 15 '22 12:09 qiuzi

😭

e1732a364fed avatar Sep 15 '22 14:09 e1732a364fed

socks5 错误具体是什么错误?vs的完整日志输出是什么?

另外,你只给了udp的情况,tcp呢?

e1732a364fed avatar Dec 02 '22 13:12 e1732a364fed

tcp正常

qiuzi avatar Dec 02 '22 13:12 qiuzi

客户端和服务端都是用的vs吗,还是只有客户端用的是vs

e1732a364fed avatar Dec 02 '22 14:12 e1732a364fed

服务端是 https://github.com/XrayR-project/XrayR

qiuzi avatar Dec 02 '22 14:12 qiuzi

有对比过使用v2ray或者xray替换vs吗?

e1732a364fed avatar Dec 02 '22 16:12 e1732a364fed

客户端换过这两种和trojan全系列都能正常 服务端没法更改,用的他人服务

qiuzi avatar Dec 02 '22 22:12 qiuzi

socks5用的是ipt2socks做转换,这个跟服务端没啥关系,貌似是编码方式不兼容

qiuzi avatar Dec 03 '22 04:12 qiuzi

经过真机测试,ipv6确实存在问题,正在解决当中。

经过测试,udp的ipv4传输没问题,ipv6出错,错误报错在trojan服务端。

报错类似下面:

	ERROR	Failed in reading first udp payload, not because of timeout, will hung up	{"connid": 629766, "target": "[\u0003 ..... ]:1", "error": " [ trojan GetAddrFrom err , Detail: invalid data, Data: 120 ] "}

下面提供测试方案:

用golang编写一个udp发送程序,然后构建三个vs配置,第一个配置为 dokodemo -> socks5 第二个配置为 socks5 -> trojan 第三个配置为 trojan -> direct

同时要有一个ipv6机,用nc监听,比如监听4444端口,命令为 nc -v -u -l 4444

分别记为 “udp发送程序”,v1,v2,v3, ipv6机

udp发送程序给 v1 发送 udp数据,v1通过 dokodemo将该udp数据指定 目标为 ipv6机, 经过socks5 发送到 v2

v2将socks5数据转化成 trojan数据,发送给 v3, v3trojan接受到数据,解析出目标为 ipv6机后,向该 ipv6机发送 “udp发送程序” 逐级传来的 那个数据。

发送程序代码如下,用 go run main.go 执行

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	udpServer, err := net.ResolveUDPAddr("udp", "127.0.0.1:63782")

	if err != nil {
		println("ResolveUDPAddr failed:", err.Error())
		os.Exit(1)
	}

	conn, err := net.DialUDP("udp", nil, udpServer)
	if err != nil {
		println("Listen failed:", err.Error())
		os.Exit(1)
	}

	fmt.Println("ready to input")

	defer conn.Close()
	var str string
	for {
		_, err = fmt.Scanln(&str)
		if err != nil {
			println("Scanln failed:", err.Error())
			os.Exit(1)
		}
		conn.Write([]byte(str))
	}

}

不用nc作为数据发送来源,是因为,nc在拨号udp时,会重试多次,而且会预先发送 类似 XXXX 的数据头,这会干扰测试

e1732a364fed avatar Dec 03 '22 04:12 e1732a364fed

你测一下吧,该问题socks5和tproxy无关。是vs的trojan客户端的错误,最新代码已经解决了

e1732a364fed avatar Dec 03 '22 05:12 e1732a364fed

关于tproxy的问题,我新开一个issue, #178

e1732a364fed avatar Dec 03 '22 05:12 e1732a364fed

那个tproxy的问题在最新代码应该也解决了,你测一下吧

e1732a364fed avatar Dec 03 '22 06:12 e1732a364fed

下星期我回家试试 谢谢你的一直维护

qiuzi avatar Dec 03 '22 10:12 qiuzi