V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lio996
V2EX  ›  程序员

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

  •  
  •   lio996 · 31 天前 · 2201 次点击

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

    40 条回复    2025-02-25 16:54:11 +08:00
    zsj1029
        1
    zsj1029  
       31 天前
    可以参考下 trojan ,v2ray 等翻墙软件,不联网肯定不行,看你描述,服务器可以出站访问外网,不能入站吧(被访问),或者是反过来的
    1423
        2
    1423  
       31 天前
    前人都做过了, gost -L=ss+ws://:8080 就行, 加上 rtcp 也一样, 都是成熟了好几年的东西
    7gugu
        3
    7gugu  
       31 天前
    wstunnel 就可以,不过这么做不合规吧,慎用
    lio996
        4
    lio996  
    OP
       31 天前
    不是,是服务器不能联网,但是部署的服务是可以对外提供服务的
    lio996
        5
    lio996  
    OP
       31 天前
    @7gugu 好的,我先了解下看看是什么高科技
    lio996
        6
    lio996  
    OP
       31 天前
    @7gugu 看了下,并不是我想要的东西。我的需求恰好相反,服务器只能被动的接收来自外部的连接,现在是想利用 ws 协议将服务器本地需要联网的代理数据包走 ws 传输给当前与服务器建立连接的 ws 客户端处理。毕竟客户端是从外网主动连接无法联网的服务器的,客户端是有外网访问权限的,就想着客户端帮忙访问互联网达到服务网也能联网的情况。
    zuotun
        7
    zuotun  
       31 天前
    不要这样做,都知道是政务云了就别搞这些违规操作。从原理上来说当然可以而且有很多方法,例如正向代理丢给堡垒机干、自己搓一个假的高德、放弃这个想法,又没人要你做(推荐)。
    lio996
        8
    lio996  
    OP
       31 天前
    @zuotun 额,确实这样不太好,不过也是想试试看看能不能实现。如果能实现的话,毕竟代码自己写的,可以考虑只允许本地连接并且加认证防止被查,哈哈哈。当然了,真的实现了的话,也不会一直保持这个通道是开的,肯定是用的时候开启来。
    wheat0r
        9
    wheat0r  
       31 天前
    众所周知,合规性不是技术问题。
    fuzzsh
        10
    fuzzsh  
       31 天前 via Android
    icmp 都能开出 tunnel ,ws 不是易如反掌?
    vicv
        11
    vicv  
       31 天前 via iPhone
    技术上有解决办法,但是出了安全问题谁背锅?
    wunonglin
        12
    wunonglin  
       31 天前
    这不是办法的事,是背锅的事。看清本质
    lio996
        13
    lio996  
    OP
       31 天前
    @fuzzsh 我是想要反过来,但是目前还没有看到有人这么做
    cj323
        14
    cj323  
       31 天前 via iPhone
    我也觉得可以。你想也让坛友帮你可以贴下报错。
    cctv180
        15
    cctv180  
       31 天前
    @lio996 #4 如果路由器是自己的可以很方便处理啊,把服务器的 dns 和网关改错不改变网段就没网了 。路由把对应端口映射到服务器完事了。
    rekulas
        16
    rekulas  
       31 天前
    看懂你需求了

    不过你既然都可以服务端开 ws 服务了,为啥不直接开个 tcp 协议的, frp 直接转发一下,就把客户端的代理暴露给服务端了

    ws 当然也可以实现,只要有数据交换就可以代理,不过这样玩的人很少

    https://gost.run/tutorials/protocols/ws/

    gost 可以基于 ws 来进行多种模式的代理, 可以试试, 应该也可以实现你的需求
    lio996
        17
    lio996  
    OP
       31 天前
    @rekulas 好的,我试试,不过服务端这边是不让开端口的,都是走 nginx ssl 反向代理给外界访问的
    lio996
        18
    lio996  
    OP
       31 天前
    @rekulas 应该是不能满足我的需求,哈哈。我的需求是服务端收到来自外界的客户端的连接之后,然后服务端将本地 socks 的代理流量主动发送给这个连接的客户端那边,然后客户端那边收到之后完成互联网解析在通过 ws 通道发回给服务端,然后服务端再发回给本地的 socks 达到连接网络的目的。
    hxy100
        19
    hxy100  
       31 天前
    gost +1
    lio996
        20
    lio996  
    OP
       31 天前
    @hxy100 我测试了下,像我这样反过来的好像不行
    liangxiangdong
        21
    liangxiangdong  
       31 天前
    不知道我理解的对不对,服务器在政务网上,需要访问互联网的高德。既然流量能入,肯定有互联网机器到政务机器是通的。如果是这种情况,直接在主机上配置假 hosts,一层一层往外代理。既 hosts 192.168.x.x api.amap.com 。nginx 在转到上一层。一层一层代出去。到最后通互联网那台机器 nginx 转到实际地址就行。不知道具体情况,仅供参考。
    gogogo2000
        22
    gogogo2000  
       31 天前
    一个可行的方案是双 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
        23
    gogogo2000  
       31 天前
    当然我记得用 gost 的 rtcp 好像是可以直接实现的,不过那个东西使用难度其实比想象中的要大,因为文档实在是比较抽象,有点生涩难懂
    lio996
        24
    lio996  
    OP
       31 天前
    @gogogo2000 首先向外网暴露端口就不可行了,政务云只能被动的等待外部的连接,不允许开放端口。开放的端口只有 nginx 的 ssl 端口,而且所有对外提供服务的程序都是由 nginx 反向代理的。如果政务云允许主动暴露某个端口,我自己早就用 go 就实现需求了。我现在其实就是想反过来,政务云被动等待外部 ws 客户端的接入,然后把政务云本地的 socks 代理的流量通过这个双向的 ws 发送给连接的 ws 客户端那边,然后客户端那边再帮忙处理 socks 的连接,相当于利用 ws 这个管道连接外部的 socks 的代理服务。
    lio996
        25
    lio996  
    OP
       31 天前
    @liangxiangdong 这个肯定是不行的,哈哈哈哈,这个不就是相当于寻找外网出口吗
    gogogo2000
        26
    gogogo2000  
       31 天前
    @lio996 #24 你 i 自己写当然是可以的,只是过程比较复杂自己研究下就是了,原理绝对是可行的。

    如果是利用现有工具的话,想要不暴露到公网那不是很简单嘛,把 frpc 的 tcp 改为 stcp ,就不暴露了
    lio996
        27
    lio996  
    OP
       30 天前
    @gogogo2000 但是这个只是被反向代理的不暴露端口,哈哈哈,可能我这边想法太过于奇葩了,目前是测试了好几种方式都没办法实现反向利用主动连入的客户端实现上网的需求,所以才来发帖请教各位大佬
    rekulas
        28
    rekulas  
       30 天前
    @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
        29
    lio996  
    OP
       30 天前
    @rekulas 这两个有看到测试过,不符合我的使用场景
    gogogo2000
        30
    gogogo2000  
       30 天前
    @lio996 #27 这个想法虽然比较少见,但是确实是完全可行的。你就这么想好了,我这个方案显然是可行的吧,只是在安全性上没有符合你的要求而已。你只需要自己写代码使用相同的逻辑,只是略去暴露端口的行为,就可以完成对应的功能了。

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

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

    你政务云打洞,万一被黑倒查出你,即使不是你的问题,大佬们都躲了,一个锅扣你头上,轻者除名,重者踩缝纫机,何必呢
    lio996
        34
    lio996  
    OP
       29 天前
    @yinmin 不用这么紧张,只是说突然有这个想法而已,而且自己写的程序难道不会加验证吗?而且我这边本地有个场景的环境,肯定是不会头铁到政务网上面测试的。
    lio996
        35
    lio996  
    OP
       29 天前
    @azarasi 这个写过,不过测试不成功。因为是服务端这边是主动提供 ws 服务,但是是要被动的等待外面的 ws 客户端连入的,等 ws 连入之后再将自己需要联网请求的资源走 ws 发给 ws 客户端那边帮忙联网拿数据。
    rekulas
        36
    rekulas  
       29 天前
    帮你试了下 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
        37
    rekulas  
       29 天前
    附带一句,我用的它的 https://github.com/tudyzhb/frp/tree/wss 分支编译的
    lio996
        38
    lio996  
    OP
       26 天前
    @rekulas 有防火墙的,肯定不让用这种 frp 的,防火墙那边有数字指纹的,一下子就识别了,哈哈哈。当然就算我自己写出来了,也不敢用,本身政务云那边就不允许联网,除非白名单走定向。
    rekulas
        39
    rekulas  
       26 天前
    @lio996 当然,有规定还是得遵守,我只是提供一个纯技术上的解决方案
    lio996
        40
    lio996  
    OP
       25 天前
    @rekulas 哈哈哈,可以可以,其实我已经实现了,不过就是不好用,只能一次通信,然后必须重启程序。但是吧,还是按规定咯,毕竟专属网络不允许联网。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:42 · PVG 13:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.