不联网的服务器是否可以通过 ws 协议代理访问互联网

201 天前
 lio996

一直都是默默的看大家的帖子,今天实在是想发个帖子请教虾各位大佬。就是目前我这边也不算是是需求吧,就是自己想实现解决这个场景的问题。目前遇到的问题就是程序是部署在政务云上面的,服务器不联网然后高德地图初始化需要联网(PS:表示代码不是我写的,用的是很老旧的 JS 了,如果是我开发的话肯定主流 VUE 了)获取一些数据,虽然我告诉那个开发可以参考 vue 。但是人家觉得自己的技术就能吃到老,就是不愿意学习了解新技术,然后就和我说要政务云那边开一个互联网资源的白名单。这个估计是开通不了,不过我是有时候 go 开发一个简易的程序,基于 ws 协议。为啥要这么干,是因为政务云不然外面访问机器,但是我可以通过 ws 协议实现 webssh 以及 webvnc 访问维护(老板嫌弃每次要堡垒机维护麻烦,而且堡垒机巨难用)。然后突发奇想能不能反向通过 ws 协议给主动连入的客户端发送代理请求,由客户端拿到互联网资源之后再走 ws 发回给服务端,比较是全双工的嘛。借助 ai 问了下,说是可行,然后就开始编码,目前就卡在实时双向拷贝上面会出问题了。比如我在服务器本地有个 socks 的代理,这个代理收到的任何请求都直接发送给 ws ,由 ws 发送给连入的 ws 客户端那边的本地 socks 联网拿到资源之后再回传到服务器。结果还是一样,也是出错,双向实时拷贝过不了。以上都是我本地虚拟机模拟测试出现的问题,没有直接上政务云的,毕竟程序都没写好。理论上来说应该是可以的吧,毕竟是双向通信,当然也不会有人像我这么干的,哈哈哈哈。

2705 次点击
所在节点    程序员
40 条回复
liangxiangdong
200 天前
不知道我理解的对不对,服务器在政务网上,需要访问互联网的高德。既然流量能入,肯定有互联网机器到政务机器是通的。如果是这种情况,直接在主机上配置假 hosts,一层一层往外代理。既 hosts 192.168.x.x api.amap.com 。nginx 在转到上一层。一层一层代出去。到最后通互联网那台机器 nginx 转到实际地址就行。不知道具体情况,仅供参考。
gogogo2000
200 天前
一个可行的方案是双 frp 。
政务云上一个 frpc ,一个 frps (假设端口 888 ),外网服务器一个 frps ,假设端口为 777

政务云通过 frpc 向外网服务器暴露自己的 frps 服务为端口 999 ,这时候外网服务器的 999 端口实际上就是政务云的 frps888 了,那么代理就可以通过这个 999 端口的 frps 将自身映射到政务云本地上去了(如 666 )。这时候政务云本地的 666 端口就是代理的端口。

gov:666 -> gov:888 -> frpc-> vps:999 -> proxy:any
gogogo2000
200 天前
当然我记得用 gost 的 rtcp 好像是可以直接实现的,不过那个东西使用难度其实比想象中的要大,因为文档实在是比较抽象,有点生涩难懂
lio996
200 天前
@gogogo2000 首先向外网暴露端口就不可行了,政务云只能被动的等待外部的连接,不允许开放端口。开放的端口只有 nginx 的 ssl 端口,而且所有对外提供服务的程序都是由 nginx 反向代理的。如果政务云允许主动暴露某个端口,我自己早就用 go 就实现需求了。我现在其实就是想反过来,政务云被动等待外部 ws 客户端的接入,然后把政务云本地的 socks 代理的流量通过这个双向的 ws 发送给连接的 ws 客户端那边,然后客户端那边再帮忙处理 socks 的连接,相当于利用 ws 这个管道连接外部的 socks 的代理服务。
lio996
200 天前
@liangxiangdong 这个肯定是不行的,哈哈哈哈,这个不就是相当于寻找外网出口吗
gogogo2000
200 天前
@lio996 #24 你 i 自己写当然是可以的,只是过程比较复杂自己研究下就是了,原理绝对是可行的。

如果是利用现有工具的话,想要不暴露到公网那不是很简单嘛,把 frpc 的 tcp 改为 stcp ,就不暴露了
lio996
200 天前
@gogogo2000 但是这个只是被反向代理的不暴露端口,哈哈哈,可能我这边想法太过于奇葩了,目前是测试了好几种方式都没办法实现反向利用主动连入的客户端实现上网的需求,所以才来发帖请教各位大佬
rekulas
200 天前
@lio996 "将本地 socks 的代理流量主动发送给这个连接的客户端那边,然后客户端那边收到之后完成互联网解析在通过 ws 通道发回给服务端,然后服务端再发回给本地的 socks 达到连接网络的目的。"

你自己把简单的事情讲复杂了
就是基于 ws 的代理
https://github.com/root-gg/wsp
https://github.com/genshen/wssocks
我没试过,但是你自己搜下 http over ws proxy/socks over ws proxy 等可以找到很多库,上面两个宣传可以访问内网的,如果作者没说谎应该是可以实现你的需求
lio996
200 天前
@rekulas 这两个有看到测试过,不符合我的使用场景
gogogo2000
200 天前
@lio996 #27 这个想法虽然比较少见,但是确实是完全可行的。你就这么想好了,我这个方案显然是可行的吧,只是在安全性上没有符合你的要求而已。你只需要自己写代码使用相同的逻辑,只是略去暴露端口的行为,就可以完成对应的功能了。

无非就是 local socks proxy client->ws tunnel->remote receiver->target 这个流程而已,我说的 frp 方案只是用线程的方案实现了这套流程,只不过我并不知道是否有现成的软件一站式提供了这整套的功能罢了
azarasi
199 天前
我以前写过类似的东西,也是用 go 的,我是把 socks 代理的目的地址端口都写在 websocket 握手时候的 http 请求头里,然后开两个 io.copy 线程就可以了,注意处理 tcp 断开产生的 err ,
lovelylain
199 天前
@lio996 内网 websocat+frps ,通过 websocat 将 frps 的端口映射出去;外网 websocat+frpc+代理,通过 websocat 将 frps 端口转化为本地,供本地 frpc 连接,本地 frpc 将本地代理映射到 frps 端。
yinmin
199 天前
政务云打洞,准备去背锅踩缝纫机吗?

你同事说“开互联网资源白名单”,就直接让他提申请,被拒就老实了该改就得改。

你政务云打洞,万一被黑倒查出你,即使不是你的问题,大佬们都躲了,一个锅扣你头上,轻者除名,重者踩缝纫机,何必呢
lio996
199 天前
@yinmin 不用这么紧张,只是说突然有这个想法而已,而且自己写的程序难道不会加验证吗?而且我这边本地有个场景的环境,肯定是不会头铁到政务网上面测试的。
lio996
199 天前
@azarasi 这个写过,不过测试不成功。因为是服务端这边是主动提供 ws 服务,但是是要被动的等待外面的 ws 客户端连入的,等 ws 连入之后再将自己需要联网请求的资源走 ws 发给 ws 客户端那边帮忙联网拿数据。
rekulas
198 天前
帮你试了下 frp,是可以实现需求的
frp 已经支持 ws 协议,但是如果要实现连接任意 url 的 ws 服务 frp 似乎还没有支持(有人有提过 pr 不知道为什么没合并), 用了这位网友提供的 pr,测试可以

https://github.com/fatedier/frp/issues/2194#issuecomment-933677092

假设内网部署代理为 192.168.0.1:1080

frps.ini 配置
[common]
bind_port = 7001
type = websocket
kcp_bind_port = 7001
token=abc123

nginx 配置
location /wstest/ {
proxy_redirect off;
proxy_pass http://127.0.0.1:7001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_read_timeout 600s;
}

frpc.ini 配置
[common]
server_addr = wss://domain.com/wstest/
token = abc123
tls_enable = true
protocol = websocket

[ptest]
type = tcp
local_ip = 192.168.0.1
local_port = 1080
remote_port = 2008

拨号成功后,服务器可通过 localhost:2008 将客户端作为一级代理, 服务端最好防火墙拦截 2008 以免泄露代理到公网

都在政务单位了还是小心点 仅供测试,不要玩火
rekulas
198 天前
附带一句,我用的它的 https://github.com/tudyzhb/frp/tree/wss 分支编译的
lio996
195 天前
@rekulas 有防火墙的,肯定不让用这种 frp 的,防火墙那边有数字指纹的,一下子就识别了,哈哈哈。当然就算我自己写出来了,也不敢用,本身政务云那边就不允许联网,除非白名单走定向。
rekulas
195 天前
@lio996 当然,有规定还是得遵守,我只是提供一个纯技术上的解决方案
lio996
195 天前
@rekulas 哈哈哈,可以可以,其实我已经实现了,不过就是不好用,只能一次通信,然后必须重启程序。但是吧,还是按规定咯,毕竟专属网络不允许联网。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1112726

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX