hmgle / graftcp

A flexible tool for redirecting a given program's TCP traffic to SOCKS5 or HTTP proxy.
GNU General Public License v3.0
2.1k stars 173 forks source link

代理出错,graftcp-local 报 getPidByAddr failed 错误 #20

Closed lxf1992521 closed 4 years ago

lxf1992521 commented 5 years ago
  1. 使用环境 使用 master 最新分支编译,操作系统 Ubuntu 14.04.5

  2. 问题重现

    • 创建一个 socks5 代理: ssh localhost -D 1080
    • 启动 graftcp-local: ./graftcp-local/graftcp-local -select_proxy_mode only_socks5
    • 访问百度:./graftcp curl www.baidu.com 重复执行命令,访问百度,则有很大概率出现错误:curl: (56) Recv failure: 连接被对方重设 此时,graftcp-local 报错:[ERROR] getPidByAddr(127.0.0.1:42354) failed
578141611 commented 5 years ago

@hmgle 能不能尽快处理一下这个问题?我也遇到了。 199.201.74.95:10001 是另外一个机器上面搭建的nginx http正向代理,直接在测试机器上使用 curl -x http://199.201.74.95:10001 www.baidu.com 可以正常访问 graftcp-local/graftcp-local -http_proxy 199.201.74.95:10001 -listen 127.0.0.1:1235 -select_proxy_mode only_http_proxy 然后使用方面的语句则不行,有尝试使用 telnet 127.0.0.1 1235 结果也是不正常的

hmgle commented 5 years ago

@578141611 不清楚是否是 #16 提及的问题造成的。方便贴下上述环境时执行 graftcp -p 1235 curl baidu.com 的结果吗?

578141611 commented 5 years ago

graftcp -p 1235 curl baidu.com 提示如下

curl: (52) Empty reply from server

578141611 commented 5 years ago

重新试了一下 graftcp -p 1235 curl baidu.com 提示如下 curl: (56) Recv failure: 连接被对方重设 [ERROR] dialer.Dial(220.181.38.148:80) err: connect proxy error: Bad Request

578141611 commented 5 years ago

能不能查看一下你的环境的 cat proc/net/tcp 我所使用的列数和你的估计不一样: 如下代码是否存在问题 for _, line := range lines[1:] { if strings.Contains(line, localAddrHex) && strings.Contains(line, remoteAddrHex) { fields := strings.Fields(line) if len(fields) > 9 { return fields[9] // fields[9] is inode } } }

hmgle commented 5 years ago

能不能查看一下你的环境的 cat proc/net/tcp 我所使用的列数和你的估计不一样: 如下代码是否存在问题 for _, line := range lines[1:] { if strings.Contains(line, localAddrHex) && strings.Contains(line, remoteAddrHex) { fields := strings.Fields(line) if len(fields) > 9 { return fields[9] // fields[9] is inode } } }

@578141611 Linux 的 /proc/net/tcp 都是统一的格式的:https://www.kernel.org/doc/Documentation/networking/proc_net_tcp.txt 如:

  75: 0100007F:E7A1 0100007F:BFFA 01 00000000:00000000 00:00000000 00000000  1000        0 3402088 1 0000000000000000 20 4 31 10 64
578141611 commented 5 years ago

@hmgle cat /proc/net/tcp没有问题 我在你的代码的基础上加了很多日志,我更到了如下代码: func (l *Local) UpdateProcessAddrInfo() { //这函数堵塞了 r := bufio.NewReader(l.FifoFd) //我在后面打的log没有打出来 for { line, _, err := r.ReadLine() if err != nil { dlog.Errorf("r.ReadLine err: %s", err.Error()) break } // dest_ipaddr:dest_port:pid s := strings.Split(string(line), ":") if len(s) != 3 { dlog.Errorf("r.ReadLine(): %s", string(line)) continue } StorePidAddr(s[2], s[0]+":"+s[1]) } }

578141611 commented 5 years ago

@hmgle type Local struct { faddr *net.TCPAddr // Frontend address: graftcp-local address

faddrString string

socks5Dialer    proxy.Dialer
httpProxyDialer proxy.Dialer
    //这个变量没有看到赋值的地方
FifoFd *os.File

selectMode modeT

}

578141611 commented 5 years ago

@hmgle 另外在提一个建议,你们的graftcp-local所依赖的go代码可以使用gitsubmodule进行部署。我使用你的master代码可以编译,但是使用dev分支代码则不能编译通过,我没有设置go的path。

hmgle commented 5 years ago

重新试了一下 graftcp -p 1235 curl baidu.com 提示如下 curl: (56) Recv failure: 连接被对方重设 [ERROR] dialer.Dial(220.181.38.148:80) err: connect proxy error: Bad Request

@578141611 从这个日志看,graftcp 已经把请求数据传到 graftcp-local 了,graftcp-local 连接目标地址 220.181.38.148:80 出错了。

578141611 commented 5 years ago

@hmgle 感谢。 是我这边nginx的 http 服务器有问题

hmgle commented 5 years ago

@578141611 也谢谢你的反馈。

ghost commented 4 years ago

我也遇到了这个问题。。

$ ./graftcp-local/graftcp-local -listen=:2234 -socks5=127.0.0.1:2333
[2019-10-06 20:44:48] [NOTICE] graftcp-local start
[2019-10-06 20:44:48] [INFO] select_proxy_mode: auto
[2019-10-06 20:44:48] [INFO] graftcp-local start listening :2234...
[2019-10-06 20:44:52] [ERROR] getPidByAddr(127.0.0.1:46252) failed
[2019-10-06 20:44:54] [ERROR] getPidByAddr(127.0.0.1:46254) failed

之后尝试 curl www.baidu.com 的时候会出现上面的错误

hmgle commented 4 years ago

这个问题在最新版(v0.2.1)已经修复,请更新后重新试试。 谢谢。