trojan-go icon indicating copy to clipboard operation
trojan-go copied to clipboard

无法正常设置透明代理服务器

Open bemoons opened this issue 3 years ago • 16 comments

  • [x] 我确定我已经尝试多次复现此次问题,并且将会提供涉及此问题的系统和网络环境,软件及其版本。

我们建议您按照下方模板填写 Bug Report,以便我们收集更多的有效信息

简单描述这个 Bug

目的:在家庭网络中设置一个透明网关。 环境:有公网ip的家庭宽带,hyperV虚拟机,ubuntu 18.04 桌面版。桥接虚拟交换机,固定ip。 操作:trojan-go服务器正常,使用sstap可以进行udp和tcp转发。 现在虚拟机上安装ubuntu 18.04桌面版,并按照trojan go 文档提供的设置透明代理的方法进行部署设置。 使用iphone 手机进行测试。测试方法为:设置手机的wifi 网络ip为手动,分配合适的ip,并设置网关(路由器)项目为透明代理服务器ip。然后测试能否上网。当不对iptables 进行转发时正常上网,无法翻墙。当启动iptable 转发,即: iptables -t mangle -A PREROUTING -i eth0 -p tcp -j TROJAN_GO iptables -t mangle -A PREROUTING -i eth0 -p udp -j TROJAN_GO 两句时,手机无法上网。

如何复现这个 Bug

用nat模式启动客户端,按照文档提供的iptables指令设置,始终无法通过测试。

服务器和客户端环境信息

在此描述你的服务器和客户端所处的网络环境,系统架构,以及其他信息 服务器位于美国 ,搬瓦工vps,centos, 客户端位于中国,家庭网络,hyperv 虚拟机,桥接虚拟交换机,ubuntu18.04桌面版

服务端和客户端日志

[INFO]  2021/04/23 23:24:11 trojan-go v0.8.3 initializing
[INFO]  2021/04/23 23:24:11 cert is unspecified, using default ca list
[INFO]  2021/04/23 23:24:11 tproxy server listening on [::]:6363 (tcp) [::]:6363 (udp)
[ERROR] 2021/04/23 23:27:16 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1:proxy.go:59 failed to accept connection | tproxy failed to obtain original address of tcp socket | getsockopt: protocol not available
[ERROR] 2021/04/23 23:27:16 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1:proxy.go:59 failed to accept connection | tproxy failed to obtain original address of tcp socket | getsockopt: protocol not available
[ERROR] 2021/04/23 23:27:16 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1:proxy.go:59 failed to accept connection | tproxy failed to obtain original address of tcp socket | getsockopt: protocol not available
[ERROR] 2021/04/23 23:27:20 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1:proxy.go:59 failed to accept connection | tproxy failed to obtain original address of tcp socket | getsockopt: protocol not available
[ERROR] 2021/04/23 23:27:26 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1:proxy.go:59 failed to accept connection | tproxy failed to obtain original address of tcp socket | getsockopt: protocol not available
[ERROR] 2021/04/23 23:27:27 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1:proxy.go:59 failed to accept connection | tproxy failed to obtain original address of tcp socket | getsockopt: protocol not available
[ERROR] 2021/04/23 23:27:28 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1:proxy.go:59 failed to accept connection | tproxy failed to obtain original address of tcp socket | getsockopt: protocol not available
[INFO]  2021/04/23 23:36:55 new tproxy udp session from 192.168.1.88:52127 metadata 17.253.116.253:123
[INFO]  2021/04/23 23:36:55 tproxy packet conn accepted
[INFO]  2021/04/23 23:36:57 new tproxy udp session from 192.168.1.88:53641 metadata 17.253.116.253:123
[INFO]  2021/04/23 23:36:57 tproxy packet conn accepted
[INFO]  2021/04/23 23:36:59 new tproxy udp session from 192.168.1.88:53908 metadata 17.253.116.253:123
[INFO]  2021/04/23 23:36:59 tproxy packet conn accepted
[ERROR] 2021/04/23 23:37:55 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayPacketLoop.func1.1:proxy.go:142 socks packet conn closed
[INFO]  2021/04/23 23:37:55 connection to UDP_CONN:0 closed sent: 0 B recv: 0 B
[ERROR] 2021/04/23 23:37:57 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayPacketLoop.func1.1:proxy.go:142 socks packet conn closed
[INFO]  2021/04/23 23:37:57 connection to UDP_CONN:0 closed sent: 0 B recv: 0 B
[ERROR] 2021/04/23 23:38:05 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayPacketLoop.func1.1:proxy.go:142 socks packet conn closed
[INFO]  2021/04/23 23:38:05 connection to UDP_CONN:0 closed sent: 0 B recv: 59 B
[INFO]  2021/04/23 23:38:14 new tproxy udp session from 192.168.1.88:51384 metadata 43.247.88.107:19000
[INFO]  2021/04/23 23:38:14 tproxy packet conn accepted
[INFO]  2021/04/23 23:38:23 new tproxy udp session from 192.168.1.88:60744 metadata 114.114.114.114:53
[INFO]  2021/04/23 23:38:23 new tproxy udp session from 192.168.1.88:64840 metadata 112.124.47.27:53
[INFO]  2021/04/23 23:38:23 new tproxy udp session from 192.168.1.88:58488 metadata 8.8.8.8:53
[INFO]  2021/04/23 23:38:23 new tproxy udp session from 192.168.1.88:50763 metadata 8.8.4.4:53
[INFO]  2021/04/23 23:38:23 tproxy packet conn accepted
[INFO]  2021/04/23 23:38:23 tproxy packet conn accepted
[INFO]  2021/04/23 23:38:23 tproxy packet conn accepted
[INFO]  2021/04/23 23:38:23 tproxy packet conn accepted

服务端和客户端配置文件

 {
    "run_type": "nat",
    "local_addr": "0.0.0.0",
    "local_port": 6363,
    "remote_addr": myname.com",
    "remote_port": 443,
    "password": [
        "password"
    ],
    "ssl": {
        "sni": "myname.com"
    }
}

 iptables -t mangle -N TROJAN_GO

 iptables -t mangle -A TROJAN_GO -d myseverip -j RETURN

 iptables -t mangle -A TROJAN_GO -d 0.0.0.0/8 -j RETURN
 iptables -t mangle -A TROJAN_GO -d 10.0.0.0/8 -j RETURN
 iptables -t mangle -A TROJAN_GO -d 127.0.0.0/8 -j RETURN
 iptables -t mangle -A TROJAN_GO -d 169.254.0.0/16 -j RETURN
 iptables -t mangle -A TROJAN_GO -d 172.16.0.0/12 -j RETURN
 iptables -t mangle -A TROJAN_GO -d 192.168.0.0/16 -j RETURN
 iptables -t mangle -A TROJAN_GO -d 224.0.0.0/4 -j RETURN
 iptables -t mangle -A TROJAN_GO -d 240.0.0.0/4 -j RETURN

 iptables -t mangle -A TROJAN_GO -p tcp -j TPROXY --on-port 6363 --tproxy-mark 0x01/0x01
 iptables -t mangle -A TROJAN_GO -p udp -j TPROXY --on-port 6363 --tproxy-mark 0x01/0x01

 iptables -t mangle -A PREROUTING -i eth0 -p tcp -j TROJAN_GO
 iptables -t mangle -A PREROUTING -i eth0 -p udp -j TROJAN_GO

ip route add local default dev lo table 100
 ip rule add fwmark 1 lookup 100

服务端和客户端版本信息

请执行./trojan-go -version并将输出完整粘贴在此处

Trojan-Go v0.8.3 Go Version: go1.16.2 OS/Arch: linux/amd64 Git Commit: 8b01e5122bbcfadfb50a75a09d184798acfa9de7

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/

其他信息

不启动tcp转发,手机可以正常上网,无法翻墙,但log里面似乎udp转发正常的。鄙人网络知识浅薄,请不吝赐教。

bemoons avatar Apr 23 '21 16:04 bemoons

把tcp 放在nat表里面,似乎有效,但是youtube视频打不开,是否应该给tcp包也打上mark?

bemoons avatar Apr 26 '21 01:04 bemoons

"local_addr": "127.0.0.1",

iptables -t mangle -A TROJAN_GO -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 6363 --tproxy-mark 0x01/0x01

DHCP依靠udp传输 你得把67 68 端口排除掉

qiuzi avatar May 02 '21 19:05 qiuzi

我也遇到了这个问题,DNS的UDP包可以正常转发,TCP不行

liiir avatar May 08 '21 02:05 liiir

"local_addr": "127.0.0.1",

iptables -t mangle -A TROJAN_GO -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 6363 --tproxy-mark 0x01/0x01

DHCP依靠udp传输 你得把67 68 端口排除掉

感谢回复,我主要是解决没有软路由的情况下,oculus quest2 上网的问题,用的是固定ip可能没遇到这个问题。本身是个门外汉,排除端口的写法还要研究一下,见谅。等我测试好再来回复。

bemoons avatar May 08 '21 02:05 bemoons

我也遇到了这个问题,DNS的UDP包可以正常转发,TCP不行

可以试试,把tcp放在nat表里面。用REDIRECT 转发到trojan go 客户端端口。oculus quest2 目前好像正常工作,访问web,下载程序都正常。但ios手机遇到youtube app 能打开页面但是打不开视频的情况。 看log有如下ERROR: [ERROR] 2021/05/08 10:46:50 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayPacketLoop.func1.1:proxy.go:142 socks packet conn closed

bemoons avatar May 08 '21 02:05 bemoons

“ local_addr”:“ 127.0.0.1”, iptables -t mangle -A TROJAN_GO -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 6363 --tproxy-mark 0x01 / 0x01 DHCP的udp传输你得把67 68排除掉

感谢回复,我主要是解决没有软路由的情况下,oculus quest2上网的问题,用的是固定ip可能没遇到这个问题。本身是个门外汉,排除了端口的写法还要研究一下,见谅。等我测试好再来回复。

如果不作为网关应该使用全局配置方案 https://github.com/shadowsocks/shadowsocks-libev#transparent-proxy-pure-tproxy

qiuzi avatar May 08 '21 03:05 qiuzi

这个只是作为oculus quest2的网关来全局转发的。没有配置在路由器上当其他设备的网关。

bemoons avatar May 08 '21 03:05 bemoons

遵循以下配置即可,0.14.4版本 Debian旁路由测试通过

    /sbin/iptables -t nat -A PREROUTING -i $INTERFACE -p tcp -j REDIRECT --to-ports $TROJAN_GO_PORT
    /sbin/iptables -t mangle -A PREROUTING -i $INTERFACE -p udp -j TPROXY --on-port $TROJAN_GO_PORT --tproxy-mark 5186
    /sbin/iptables -t mangle -A PREROUTING -i $INTERFACE -p udp -j MARK --set-mark 5186
    ip route add local default dev lo table 5186
    ip rule add fwmark 5186 lookup 5186

MoeGuoH avatar Jul 17 '21 16:07 MoeGuoH

@bemoons 我也碰到这个问题了 情况跟你一样 我是使用树莓派给switch做透明代理 请问你解决了吗 是trojan-go的问题还是iptables配置的问题呢 不太懂这块 除了trojao-go的版本不一样,其他都一样

root@raspberrypi:~# ./trojan-go -version Trojan-Go v0.10.4 Go Version: go1.16.4 OS/Arch: linux/arm Git Commit: 068d23371c2676212a3399edbabfb2aaedf63750

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/

zpsw avatar Jul 26 '21 13:07 zpsw

@bemoons 我也碰到这个问题了 情况跟你一样 我是使用树莓派给switch做透明代理 请问你解决了吗 是trojan-go的问题还是iptables配置的问题呢 不太懂这块 除了trojao-go的版本不一样,其他都一样

root@raspberrypi:~# ./trojan-go -version Trojan-Go v0.10.4 Go Version: go1.16.4 OS/Arch: linux/arm Git Commit: 068d233

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/

暂时算是能用。 就是把tcp和udp包分开写,mangle里面写udp规则,nat里面写tcp规则。内容差不多,只是nat不支持TPROXY,要改成REDIRECT。

bemoons avatar Jul 29 '21 01:07 bemoons

@bemoons 我也碰到这个问题了 情况跟你一样 我是使用树莓派给switch做透明代理 请问你解决了吗 是trojan-go的问题还是iptables配置的问题呢 不太懂这块 除了trojao-go的版本不一样,其他都一样

root@raspberrypi:~# ./trojan-go -version Trojan-Go v0.10.4 Go Version: go1.16.4 OS/Arch: linux/arm Git Commit: 068d233 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/

暂时算是能用。 就是把tcp和udp包分开写,mangle里面写udp规则,nat里面写tcp规则。内容差不多,只是nat不支持TPROXY,要改成REDIRECT。

我把树莓派里的trojan-go换成了xray,服务端还是trojan-go,现在已经没问题了

zpsw avatar Aug 02 '21 06:08 zpsw

@bemoons 我也碰到这个问题了 情况跟你一样 我是使用树莓派给switch做透明代理 请问你解决了吗 是trojan-go的问题还是iptables配置的问题呢 不太懂这块 除了trojao-go的版本不一样,其他都一样

root@raspberrypi:~# ./trojan-go -version Trojan-Go v0.10.4 Go Version: go1.16.4 OS/Arch: linux/arm Git Commit: 068d233 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/

暂时算是能用。 就是把tcp和udp包分开写,mangle里面写udp规则,nat里面写tcp规则。内容差不多,只是nat不支持TPROXY,要改成REDIRECT。

能否把可用的路由配置贴一下呢?想在vmware上搭一台虚机放trojan-go的client并配置透明代理,供有需求的设备比如homeassistant虚机访问github上的资源。对网络一窍不通,请教下~

ldwnt avatar Dec 10 '21 09:12 ldwnt

我已经放弃了,这边好了那边又出问题。 不想学网络的话建议花几十块钱买个k2p路由器,刷个支持trojango的潘多拉固件,一切都解决了。

bemoons avatar Dec 11 '21 09:12 bemoons

我已经放弃了,这边好了那边又出问题。 不想学网络的话建议花几十块钱买个k2p路由器,刷个支持trojango的潘多拉固件,一切都解决了。

搭了智能家居的一套东西,homeassistant虚机所在的物理机要放在一级路由下,没法挂到一个新买的二级路由下。。

ldwnt avatar Dec 11 '21 09:12 ldwnt

iptables -t mangle -A PREROUTING -i eth0 -p tcp -j TROJAN_GO iptables -t mangle -A PREROUTING -i eth0 -p udp -j TROJAN_GO

ip route add local default dev lo table 100 ip rule add fwmark 1 lookup 100

请教下是这样么

# 新建TROJAN_GO链
iptables -t mangle -N TROJAN_GO

# 绕过Trojan-Go服务器地址
iptables -t mangle -A TROJAN_GO -d <trojan-go server ip> -j RETURN

# 绕过私有地址
iptables -t mangle -A TROJAN_GO -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A TROJAN_GO -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A TROJAN_GO -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A TROJAN_GO -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A TROJAN_GO -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A TROJAN_GO -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A TROJAN_GO -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A TROJAN_GO -d 240.0.0.0/4 -j RETURN

# 未命中上文的规则的包,打上标记
iptables -t mangle -A TROJAN_GO -i <loacl interface> -p udp -j TPROXY --on-port 10803 --tproxy-mark 0x01/0x01
iptables -t mangle -A TROJAN_GO -i <loacl interface> -p udp -j MARK --set-mark 0x01/0x01

# 从ens33网卡流入的所有TCP/UDP包,跳转TROJAN_GO链
iptables -t mangle -A PREROUTING -p udp -i <loacl interface> -j TROJAN_GO


# 新建TROJAN_GO链
iptables -t nat -N TROJAN_GO

# 绕过Trojan-Go服务器地址
iptables -t nat -A TROJAN_GO -d <trojan-go server ip> -j RETURN
iptables -t nat -I TROJAN_GO -d 173.82.114.15/24 -j RETURN
# 绕过私有地址
iptables -t nat -A TROJAN_GO -d 0.0.0.0/8 -j RETURN
iptables -t nat -A TROJAN_GO -d 10.0.0.0/8 -j RETURN
iptables -t nat -A TROJAN_GO -d 127.0.0.0/8 -j RETURN
iptables -t nat -A TROJAN_GO -d 169.254.0.0/16 -j RETURN
iptables -t nat -A TROJAN_GO -d 172.16.0.0/12 -j RETURN
iptables -t nat -A TROJAN_GO -d 192.168.0.0/16 -j RETURN
iptables -t nat -A TROJAN_GO -d 224.0.0.0/4 -j RETURN
iptables -t nat -A TROJAN_GO -d 240.0.0.0/4 -j RETURN

iptables -t nat -A TROJAN_GO -i <loacl interface> -p tcp -j REDIRECT --to-ports 10803
iptables -t nat -A PREROUTING -p tcp -i <loacl interface> -j TROJAN_GO


# 添加路由,打上标记的包重新进入本地回环
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100

ip route flush cache

ldwnt avatar Dec 11 '21 09:12 ldwnt

nftables 有大佬试过怎么配置么?

9840144 avatar Mar 12 '22 09:03 9840144