V2ray-core: v2ray能否穿透第三方http代理?

Created on 28 Oct 2017  ·  24Comments  ·  Source: v2ray/v2ray-core

使用场景是这样的:
公司只能用http代理上网,开始用openvpn设置代理就可以连通外网。但是现在openvpn连不通了。

如果使用v2ray客户端和服务器,中间没有其他代理,openvpn也是可以连通的。
但是如果像我们公司这样,中间有http代理,能否穿透过这个http代理?

研究v2ray好几天了,越搞越迷糊。求大神指点。

Most helpful comment

你好

1813

你的夙愿已成。

All 24 comments

根据你的描述,我觉得v2ray的传出代理可以实现你的要求,但问题在于v2ray的outbound没有http协议,所以你得另外找一个socks转http软件。

理论上,如果v2ray客户端能将原始数据封装,然后通过http代理发给v2ray服务器端,那就是可以实现的。
好吧,这个应该就是VPN原理了。不知道v2ray能不能实现。

@ToutyRater socks转http的软件我找到了,但是问题不在这里。传出代理好像只是转发原始数据,到不了v2ray服务器端。而且传出代理只是本地转发,这跟route就没啥区别了,不知道为什么整个传出代理。

proxysettings确实封装了数据。但是好像跟其他代理软件配合不起来。不知道这种情况v2ray客户端和服务器端应该设置什么协议。搞了半天,还是不行。也没个例子。折腾死我了

二楼正解。
可以参照这里进行配置,把outbound的shadowsocks换成socks发送到本地A端口。找一个socks转换http的程序,监听本地A端口,协议SOCKS5,转发到HTTP代理(某远程B端口)。相当于通过HTTP代理发送由V2ray加密的数据给远程V2Ray服务器,但具体HTTP代理能不能转发TCP数据就不清楚了,毕竟HTTP在7层。

@funbsd 你需要一个高阶配置 proxySettings

简单来说你需要两个 outbound,一个socks 一个 vmess,socks 指向你的 socks -> http 转换程序,vmess 指向服务器的 vmess inbound,然后把 vmess outbound proxy 到 socks。具体的配置需要你自己参透。

@DarienRaymond 我是这么做的,ccproxy/dante做http转换程序,但是不好使。服务器vmess inbound能直接识别http 转换程序转发的http数据吗?服务器是不是应该有2个inbound,一个http inbound接收数据,然后转给另一个vmess inbound解析数据?但是2个inbound能串联起来吗?

又仔细想了一下,并经过测试,底层是tcp的时候是可以的。
websocket不行,因为http中转代理是tcp,不支持websocket。
tls也不行,因为http中转代理不发起tls握手。

为了更好的迷惑http中转代理,一直都是用websocket和tls测试,折腾了好久。

如果inbound能实现2层串联就好了。一层接收数据,再转发到另一层解析数据。
@DarienRaymond 请考虑一下这个建议,不知道技术上有没有可能实现。

研发完感觉不能穿透公司的http代理。
因为是普通tcp,即没有tls,也不是http,估计会被拒掉。

明天去公司试试,碰碰运气。
顺便试试tls和websocket。没准公司用的是高大上的代理,什么都支持。

@funbsd 还得多学习一个啊。如果只是转发了原始数据,到不了v2ray服务端,那说明你配置不对。而且传出代理与inbound无关,主要是outbound和其中的proxySettings,参考这里这里这里,还有这里。给了这么链接还搞不定,那应该是有其它方面的短板限制了你的理解和实操能力

@ToutyRater 我前面已经分析了,已经搞定tcp穿透中间代理了。但是搞不定websocket和tls穿透中间代理,你有办法?给我这么多参考都没啥用。

如果不支持websocket和tls穿透中间代理,那希望v2ray能有2个inbound,一个http inbound接收数据,然后转给另一个vmess inbound解析数据。
或者v2ray自己能实现http outbound,来达到上面的目的。
这样才能更好的隐藏自己,否则纯tcp,稍微有点安全意识的公司,都过不了中间代理。

刚又测试了组合websocket+tls,客户端和服务器端直连可以,但是经过中间代理就不行了。
理论上应该ok的。组合之后应该是https,一般代理都支持的。
各位大神,有啥提示吗?

经过中间代理后,服务器报错:
tls: oversized record received with length 39041

客户端报错:
2017/10/29 14:29:32 [Debug]App|Proxyman|Outbound: proxying to proxy
2017/10/29 14:29:32 [Info]Proxy|VMess|Outbound: tunneling request to tcp:newtab.firefoxchina.cn:80 via tcp:172.31.2.1:44
3
2017/10/29 14:29:32 [Info]Transport|Internet|TCP: dailing TCP to tcp:127.0.0.1:1080
2017/10/29 14:29:32 [Info]App|Proxyman|Outbound: failed to process outbound traffic > Proxy|VMess|Outbound: connection e
nds > Proxy|VMess|Encoding: unexpected response header. Expecting 163 but actually 66
2017/10/29 14:29:32 [Warning]Proxy|HTTP: failed to read response from newtab.firefoxchina.cn > unexpected EOF
2017/10/29 14:29:39 [Warning]App|Proxyman|Inbound: connection ends > Proxy|HTTP: failed to read http request > malformed
HTTP request "d\x00\x00\x00|6\x00\x00\x1a\x00\x00\x00e\x00\x10\x00\x00\x0000FF193528FCPYCQ\x00\x00\x00\x00"

好吧,又忽略了这个问题,跟v2ray服务器连接的是中间代理,而不是v2ray客户端,不能完成握手。websocket+tls经过中间代理的方法不可用。

但是为什么可以代理https网站呢?websocket+tls和纯https有啥区别?
我好像记得抓包的时候v2ray的tls也有client hello和sni。

web服务器上做ssl offload再到v2ray服务器,客户端过中间代理后也是握手失败。

单tls经过中间代理后,也是这个报错,看来只要解决tls握手问题,这个问题就解决了。

有啥软件可以做ssl/tls套,伪装https,支持代理转发?其实我要找到就是这么个东西。
openvpn已经被识别了,不能用了。v2ray tls代理转发报错。
还有啥软件可以实现这个功能?

抓包发现中间代理根本就没发送client hello,直接就是数据。
浏览器经过中间代理就会发送client hello。
怎么才能让中间代理对待v2ray像对待浏览器那样发送client hello?

曾经提过,但是作者不计划支持,见 #450

outbound的http这个可以有啊

stunnel可以发起connect请求到代理
client = yes
accept = 127.0.0.1:8080
connect = proxy:port
protocol = connect
protocolHost = HOST:PORT

然后改hosts文件,将域名指向127.0.0.1,端口号也要一致,应该能过支持connect方法的代理。

忘记讲了,stunnel的connect端必须是https协议,accept端会转成http协议,v2ray对应配置要改的

@funbsd 我记得我按照websocket+tls经过中间代理的方法可以成功。有时间给你抓包看看。

Edit: 测试后发现在linux下并不能成功,不过依稀记得在公司电脑里的windows系统有成功过。

你可以尝试使用一下我写的 h2s,它可以将一个或多个 HTTP/HTTPS 代理转为一个 SOCKS5 代理。

我写 h2s 主要就是为了解决 v2ray 不支持 http 传出的问题,另外就是目前 SOCKS 转 HTTP 的很多,但反过来的似乎没有。

https://github.com/Equim-chan/h2s

与 v2ray 的桥接方式见 https://github.com/Equim-chan/h2s/issues/1

你好

1813

你的夙愿已成。

Was this page helpful?
0 / 5 - 0 ratings