p4gefau1t / trojan-go

Go实现的Trojan代理,支持多路复用/路由功能/CDN中转/Shadowsocks混淆插件,多平台,无依赖。A Trojan proxy written in Go. An unidentifiable mechanism that helps you bypass GFW. https://p4gefau1t.github.io/trojan-go/
GNU General Public License v3.0
7.71k stars 1.67k forks source link

[BUG]客户端forward模式,转发udp报错:failed to parse udp packet addr | unable to read ATYP #439

Open simplerick-simplefun opened 2 years ago

simplerick-simplefun commented 2 years ago

简单描述这个 Bug

使用trojan-go客户端,设置forward模式,转发udp数据包,报错failed to parse udp packet addr | unable to read ATYP

如何复现这个 Bug

1.trojan-go客户端A,配置forward模式,监听本地127.0.0.1:Ax,连接服务端trojan-go地址B:By,转发到C:Cz 2.本地程序D发送udp数据包到127.0.0.1:Ax 3.预期结果:程序D正常C:Cz连接 4.实际结果:trojan-go客户端A报错:failed to parse udp packet addr | unable to read ATYP

注意:如果把客户端改成原版trojan,其他均不变,则一切正常。程序D能够正常与C:Cz连接。

服务器和客户端环境信息

客户端Windows 11

服务端和客户端日志

[ERROR] 2022/04/21 18:40:06 github.com/p4gefau1t/trojan-go/tunnel/router.(*PacketConn).packetLoop.func1:conn.go:37 router packetConn error failed to parse udp packet addr | unable to read ATYP | read tcp 192.168.50.219:54647->67.230.191.69:443: wsarecv: An established connection was aborted by the software in your host machine.

服务端和客户端配置文件

{
    "run_type": "forward",
    "local_addr": "127.0.0.1",
    "local_port": [trojan-go_local_listen_port],
    "remote_addr": [trojan-go_server_addr],
    "remote_port": [trojan-go_server_port],
    "target_addr": [udp_parcket_destination_addr],
    "target_port": [udp_parcket_destination_port],
    "udp_timeout": 600,
    "password": [
        "password"
    ],
    "mux": {
        "enabled": false
    },
    "ssl": {
        "sni": [trojan-go_server_sni]
    }
}

服务端和客户端版本信息

Trojan-Go v0.10.6 Go Version: go1.17.1 OS/Arch: windows/amd64 Git Commit: 2dc60f52e79ff8b910e78e444f1e80678e936450

Developed by PageFault (p4gefau1t) Licensed under GNU General Public License version 3 GitHub Repository: https://github.com/p4gefau1t/trojan-go Trojan-Go Documents: https://p4gefau1t.github.io/trojan-go/

其他信息

如果把客户端改成原版trojan,其他均不变,则一切正常。 forward模式下,客户端应该按照配置文件,把数据包转发到设置的目的地IP:port,而不应该去parse这个来源数据包是去哪里的。因为来源数据包本身的目的地是trojan监听的地址:端口,预期目的地是配置文件中设置要转发的地址:端口。数据包不是通过iptable/tproxy转发到trojan-go客户端的,所以不可能parse出来udp packet addr。 我没有测试forward模式下tcp数据包转发,但怀疑存在相同问题。

simplerick-simplefun commented 2 years ago

大概看了一下,应该是这里的问题: https://github.com/p4gefau1t/trojan-go/blob/7f8d638260b0666a288a34ec2112c6da314f8b57/tunnel/trojan/packet.go#L58 这一行就是读取目标地址的,但是forward转发没有地址 会跳到这里: https://github.com/p4gefau1t/trojan-go/blob/7f8d638260b0666a288a34ec2112c6da314f8b57/tunnel/metadata.go#L141 但是这个ReadWithMetadata(payload []byte)应该怎么改,加一个if forward的condition之后,length那里怎么处理,我就不知道了。 https://github.com/p4gefau1t/trojan-go/blob/7f8d638260b0666a288a34ec2112c6da314f8b57/tunnel/trojan/packet.go#L54

Potterli20 commented 2 years ago

以前有相同问题,说是连接时长问题

simplerick-simplefun commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

Potterli20 commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

服务端也有这个日记,也是这个问题 我没有用forward的,但是服务端也有

simplerick-simplefun commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

服务端也有这个日记,也是这个问题 我没有用forward的,但是服务端也有

我的情况是从一开始客户端就报错,第一个数据包都不会发给服务端。所以服务端收不到数据也不会报错。 这个还是很容易复现的,你们试试就知道了。注意设置好route/iptable,把trojan的数据按照原来的链路发送,其余都走wireguard的tun

Potterli20 commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

服务端也有这个日记,也是这个问题 我没有用forward的,但是服务端也有

我的情况是从一开始客户端就报错,第一个数据包都不会发给服务端。所以服务端收不到数据也不会报错。 这个还是很容易复现的,你们试试就知道了。注意设置好route/iptable,把trojan的数据按照原来的链路发送,其余都走wireguard的tun

啊啊有没有更新过go.mod?

xiaods commented 2 years ago
❯ go mod tidy -go=1.17
github.com/p4gefau1t/trojan-go/config imports
        gopkg.in/yaml.v3 tested by
        gopkg.in/yaml.v3.test imports
        gopkg.in/check.v1 loaded from gopkg.in/check.v1@v0.0.0-20161208181325-20d25e280405,
        but go 1.16 would select v1.0.0-20180628173108-788fd7840127
github.com/p4gefau1t/trojan-go/log/golog/buffer tested by
        github.com/p4gefau1t/trojan-go/log/golog/buffer.test imports
        github.com/smartystreets/goconvey/convey imports
        github.com/jtolds/gls imports
        github.com/gopherjs/gopherjs/js loaded from github.com/gopherjs/gopherjs@v0.0.0-20181017120253-0766667cb4d1,
        but go 1.16 would select v0.0.0-20210420193930-a4630ec28c79

To upgrade to the versions selected by go 1.16:
        go mod tidy -go=1.16 && go mod tidy -go=1.17
If reproducibility with go 1.16 is not needed:
        go mod tidy -compat=1.17
For other options, see:
        https://golang.org/doc/modules/pruning
Potterli20 commented 2 years ago
❯ go mod tidy -go=1.17
github.com/p4gefau1t/trojan-go/config imports
        gopkg.in/yaml.v3 tested by
        gopkg.in/yaml.v3.test imports
        gopkg.in/check.v1 loaded from gopkg.in/check.v1@v0.0.0-20161208181325-20d25e280405,
        but go 1.16 would select v1.0.0-20180628173108-788fd7840127
github.com/p4gefau1t/trojan-go/log/golog/buffer tested by
        github.com/p4gefau1t/trojan-go/log/golog/buffer.test imports
        github.com/smartystreets/goconvey/convey imports
        github.com/jtolds/gls imports
        github.com/gopherjs/gopherjs/js loaded from github.com/gopherjs/gopherjs@v0.0.0-20181017120253-0766667cb4d1,
        but go 1.16 would select v0.0.0-20210420193930-a4630ec28c79

To upgrade to the versions selected by go 1.16:
        go mod tidy -go=1.16 && go mod tidy -go=1.17
If reproducibility with go 1.16 is not needed:
        go mod tidy -compat=1.17
For other options, see:
        https://golang.org/doc/modules/pruning

我已经上1.18😂

simplerick-simplefun commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

服务端也有这个日记,也是这个问题 我没有用forward的,但是服务端也有

我的情况是从一开始客户端就报错,第一个数据包都不会发给服务端。所以服务端收不到数据也不会报错。 这个还是很容易复现的,你们试试就知道了。注意设置好route/iptable,把trojan的数据按照原来的链路发送,其余都走wireguard的tun

啊啊有没有更新过go.mod?

release版本是1.17 我尝试了了1.18也一样不行

Potterli20 commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

服务端也有这个日记,也是这个问题 我没有用forward的,但是服务端也有

我的情况是从一开始客户端就报错,第一个数据包都不会发给服务端。所以服务端收不到数据也不会报错。 这个还是很容易复现的,你们试试就知道了。注意设置好route/iptable,把trojan的数据按照原来的链路发送,其余都走wireguard的tun

啊啊有没有更新过go.mod?

release版本是1.17 我尝试了了1.18也一样不行

我更新了trojan-go,可以试试看

simplerick-simplefun commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

服务端也有这个日记,也是这个问题 我没有用forward的,但是服务端也有

我的情况是从一开始客户端就报错,第一个数据包都不会发给服务端。所以服务端收不到数据也不会报错。 这个还是很容易复现的,你们试试就知道了。注意设置好route/iptable,把trojan的数据按照原来的链路发送,其余都走wireguard的tun

啊啊有没有更新过go.mod?

release版本是1.17 我尝试了了1.18也一样不行

我更新了trojan-go,可以试试看

还是不行啊。看来有空得跟原版trojan对比一下代码,看看是哪里不一样。大致上还是处理udp和forward的部分,也许是conn的部分。

Potterli20 commented 2 years ago

以前有相同问题,说是连接时长问题

我这个根本无法连接成功。实际使用情况是: trojan-go使用forward模式监听127.0.0.1:12345 使用wireguard连接127.0.0.1:12345 "udp_timeout" 设置了 600 连接不成功,报错。 使用trojan原版则没有问题。

服务端也有这个日记,也是这个问题 我没有用forward的,但是服务端也有

我的情况是从一开始客户端就报错,第一个数据包都不会发给服务端。所以服务端收不到数据也不会报错。 这个还是很容易复现的,你们试试就知道了。注意设置好route/iptable,把trojan的数据按照原来的链路发送,其余都走wireguard的tun

啊啊有没有更新过go.mod?

release版本是1.17 我尝试了了1.18也一样不行

我更新了trojan-go,可以试试看

还是不行啊。看来有空得跟原版trojan对比一下代码,看看是哪里不一样。大致上还是处理udp和forward的部分,也许是conn的部分。

找到了bug?😂

chr09670 commented 2 years ago

客户端用openwrt,passwall的trojan-go,服务端是容器p4gefau1t/trojan-go,配置除了添加ws和mux,其它都是默认的,在服务端日志也发现了这个问题[ERROR] 2022/05/26 01:46:38 github.com/p4gefau1t/trojan-go/tunnel/simplesocks.(*Server).acceptLoop:server.go:41 simplesocks server faield to read header | EOF

neteroster commented 2 years ago

同样,无法转发 WireGuard 数据包。

yaoxi-std commented 7 months ago

2024 年了,这个 BUG 还没有修吗?/kel