V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codingmiao
V2EX  ›  Java

今天整了个活,用纯 http post 做了一个反向代理/内网穿透的工具

  •  3
     
  •   codingmiao · 2023-12-22 23:25:53 +08:00 · 8449 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    事情是这样子的,我在 A 市工作,我们的 web 应用部署在 B 市,由于用户那边不允许远程访问服务器运维,所以有点事就要飞过去现场处理,超级烦。好在 web 应用只要有网就能访问。

    反正不管 ssh 还是访问 web ,都是把字节传发送到服务器嘛,于是我整了个活,本机用 netty 写个客户端把 ssh 请求发出的字节接住,转成 http post 发到 web 应用的 nginx ,再转发给服务器上的 netty 服务端还原出字节,转到 ssh 端口,大致就是这么个架构:

    示例 1

    然后,我就不用飞来飞去了,坐办公室里用 http 端口连服务器了 O(∩_∩)O 。。

    你问为什么不用 websocket ,因为用户不给在 nginx 上加相关配置。。

    忍不住要分享下,项目地址是 https://github.com/codingmiao/hppt

    第 1 条附言  ·  2023-12-23 00:06:52 +08:00
    听楼下各位大佬的建议,楼主已将服务器还原,不作死,各位用的时候也注意遵纪守法^_^
    第 2 条附言  ·  192 天前

    大半年过去了,发现这玩意除了钻空子,还是有点其它用的,于是我翻新了一波,现在支持编写两个实现类,就能以任意的通讯媒介(比如mq、数据库,甚至聊天软件)来打通两台机器间的网络交互。

    比如这个例子,A、B两台机器没法通信,但通过一个kafka服务就能让A访问B上的端口了:

    kafka

    41 条回复    2024-06-16 01:25:19 +08:00
    laminux29
        1
    laminux29  
       2023-12-22 23:40:22 +08:00   ❤️ 4
    用户不允许远程访问服务器运维,然后你搞技术对抗。

    不出事还好,出事后,用户直接给服务器断电,报警,网监带走硬盘,你还能保住自己吗?
    titanhw
        2
    titanhw  
       2023-12-22 23:45:26 +08:00 via iPhone
    恭喜你实现了: http 代理
    titanhw
        3
    titanhw  
       2023-12-22 23:46:32 +08:00 via iPhone
    有些支持 ws 的协议是不是也可以满足这个需求
    codingmiao
        4
    codingmiao  
    OP
       2023-12-22 23:47:46 +08:00
    @laminux29 好可怕,不敢玩了不敢玩了,这就去把服务器还原回来
    yolee599
        5
    yolee599  
       2023-12-22 23:49:29 +08:00 via Android
    好家伙,你这种行为用专业术语叫“留后门”,出事了会蹲监狱的
    wenyifancc
        6
    wenyifancc  
       2023-12-22 23:49:53 +08:00
    著名隧道工具 gost 满足一切流量转发需求
    Archeb
        7
    Archeb  
       2023-12-22 23:53:54 +08:00   ❤️ 4
    这是内网渗透的经典需求,reGeorg 、reduh 、tunna 、phpsocks……等无数前辈向你投来了关爱的目光
    Lentin
        8
    Lentin  
       2023-12-23 00:26:18 +08:00 via iPhone
    用这是不是就能白嫖不支持 ws 的 cdn 了…
    cdlnls
        9
    cdlnls  
       2023-12-23 01:16:36 +08:00
    还好你不是把这功能集成在你的 web 应用里面,要不然这就是真留后门了。
    keepRun
        10
    keepRun  
       2023-12-23 02:08:02 +08:00 via Android
    有意思
    rming
        11
    rming  
       2023-12-23 02:10:13 +08:00
    这不就是 webshell ?!
    coffeesun
        12
    coffeesun  
       2023-12-23 02:23:39 +08:00 via Android
    给你的工资包括了来回跑的辛苦钱,你这样有法律风险。再者,也有些不可预知的需现场操作你却不在的处境。就比如:在线问诊和去医院看病不是一个价
    Features
        13
    Features  
       2023-12-23 06:22:16 +08:00
    一身冷汗了吧
    还好甲方有问题的时候你没说:我已经远程帮你处理好了
    不然就露馅了。。。
    roycestevie6761
        14
    roycestevie6761  
       2023-12-23 06:39:09 +08:00
    这不就是挂马?
    roycestevie6761
        15
    roycestevie6761  
       2023-12-23 06:40:03 +08:00
    内网访问为了安全,现在反而代出来暴露在公网,666
    SenLief
        16
    SenLief  
       2023-12-23 09:16:44 +08:00
    老哥 隔壁出差属于好事
    yazinnnn0
        17
    yazinnnn0  
       2023-12-23 09:24:59 +08:00
    想了解一下 http 短链接是咋实现代理 tcp 双工的🤨
    weeei
        18
    weeei  
       2023-12-23 11:08:10 +08:00
    大家不用较真,当成 OP 对这个项目的宣传就行,毕竟 OP 说的事情真伪都没有证实。
    Dongxiaohao
        19
    Dongxiaohao  
       2023-12-23 11:14:19 +08:00 via Android
    当初我也是嫌跑机房麻烦,在机房某个服务器放了个 nps 客户端,内网穿过去,但是被甲方那边的什么玩意扫到了,最后被领导叼了,自此之后服务器的远程桌面都不允许开了,有问题直接去机房调试😂
    ashuai
        20
    ashuai  
       2023-12-23 11:51:10 +08:00
    嫌出差麻烦找甲方临时开远程协助类的东西,用完还原。不要自己偷偷挂马
    codingmiao
        21
    codingmiao  
    OP
       2023-12-23 12:08:26 +08:00
    @yazinnnn0 发送方和接收方产生的字节都丢进缓冲池里,定期发起一个 post 请求,post body 把发送方缓冲池里的字节带走,response body 把接收方池子里的字节带回来
    Hopetree
        22
    Hopetree  
       2023-12-23 12:54:37 +08:00
    技术是牛的,但是这个技术感觉不实用
    proxytoworld
        23
    proxytoworld  
       2023-12-23 14:36:00 +08:00
    如果能做成 native binary 就更好了,jar 包还是太大了,得有 jre
    zkwang
        24
    zkwang  
       2023-12-23 14:37:43 +08:00   ❤️ 1
    按 github 教程搭了一遍,运行正常。纯 http post 实现还是有特色的。很多年前有个叫自助冲浪的工具软件,是用 CGI 表单实现了 http 代理。
    lemonrfx
        25
    lemonrfx  
       2023-12-23 16:39:20 +08:00
    不提合规性的话,看起来不错,10 毫秒一次重试的流畅性不成问题。个人觉得还可以考虑一下断线自动重连,毕竟几个请求没发过去也是常事。
    devliu1
        26
    devliu1  
       2023-12-23 20:11:14 +08:00 via Android
    tcp over http?
    itning
        27
    itning  
       2023-12-23 20:28:22 +08:00
    frp 不是现成的吗
    roundgis
        28
    roundgis  
       2023-12-23 20:48:31 +08:00 via Android
    pagekite
    likooo125802023
        29
    likooo125802023  
       2023-12-23 21:32:04 +08:00   ❤️ 1
    能飞积累飞行积分不香么?
    vincent7245
        30
    vincent7245  
       2023-12-23 22:47:46 +08:00
    “由于用户那边不允许远程访问服务器运维“ 你已经违反公司规定了,我觉得你应该看看你的劳动合同,或者你们公司的规章制度,这种设计信息安全的违规应该都是 T0 级别的,开春都不用付违约金
    yinmin
        31
    yinmin  
       2023-12-24 00:48:43 +08:00 via iPhone
    @codingmiao 这题“甲方不给远程,跑现场又太麻烦”,去现场成本太高,找个甲方同事装一个向日葵或类似软件,需要远程的时候让对方开一下向日葵,你连上去维护一下。

    疫情 3 年期间,甲方基本都能接受上面的方案。
    arloor
        32
    arloor  
       2023-12-24 01:22:01 +08:00
    @devliu1 http connect tunnel 就是这个东西,没毛病的
    devliu1
        33
    devliu1  
       2023-12-24 07:53:16 +08:00 via Android
    @arloor 是啊 直接实现 http proxy 就够了😂
    anjingdexiaocai
        34
    anjingdexiaocai  
       2023-12-24 09:09:48 +08:00 via Android
    个人觉得这个方案不够通用
    snoopygao
        35
    snoopygao  
       2023-12-24 15:55:00 +08:00 via iPhone
    让对方提供 vp@啊,费这个劲,还不安全
    aqua02
        36
    aqua02  
       2023-12-24 16:08:47 +08:00
    咋回事啊 ,工作不饱和 ,扣工资,扣绩效
    Ironpan
        37
    Ironpan  
       2023-12-24 20:06:39 +08:00
    为啥要区分 ss 和 cs, 不合并成一个吗
    codingmiao
        38
    codingmiao  
    OP
       2023-12-25 18:38:51 +08:00   ❤️ 1
    @Ironpan 两个包依赖的第三方库不一样,比如 ss 里有 servlet 相关包,所以分开尽量精简一点,frp 之类的工具都是这么玩的。
    fengpan567
        39
    fengpan567  
       2023-12-26 18:06:26 +08:00
    服务器:坏了,我成肉鸡了
    stevenkinwjg
        40
    stevenkinwjg  
       316 天前
    @laminux29 可以直接远程注入了,黑客给你点了个赞
    codingmiao
        41
    codingmiao  
    OP
       192 天前
    @itning 是的,但是 frp 必须开一个单独 TCP 端口,有时候两台机器间没有空余且可达的 TCP 端口。
    于是大半年后我发现这玩意除了主题里的在违法的边缘试探的玩法,还可以改造一下,让它能以任意媒介来打通两台机器间的网络。于是就有了 2.0 版的[自定义通信方式的玩法]( https://github.com/codingmiao/hppt?tab=readme-ov-file#%E7%A4%BA%E4%BE%8B3-%E7%BC%96%E5%86%99%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8D%8F%E8%AE%AE),比如拿 kafka 中介打通两台不互通的机器:

    ![kafka]( https://raw.githubusercontent.com/codingmiao/hppt/main/_doc/img/kafkademo.jpg)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1735 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:37 · PVG 00:37 · LAX 08:37 · JFK 11:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.