V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
stevenkinwjg
V2EX  ›  分享创造

写了一个内网穿透工具,大家来看看

  •  1
     
  •   stevenkinwjg · 2023-05-26 19:20:49 +08:00 · 4197 次点击
    这是一个创建于 550 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近学习 netty ,为了练手写了这个内网穿透工具 https://github.com/wandererex/wormhole

    wormhole

    功能特性

    将内网的端口映射到公网,从而达到内网穿透的目的

    项目结构

    • server 运行在公网的服务端,接受内网代理的连接,并把内网的端口映射到公网服务器上,客户端通过访问公网端口来访问内网服务
    • proxy 运行在内网,与公网服务建立连接,发送配置,把来自公网的流量转发到内网服务
    • serialize 提供公网服务与内网代理数据的序列化和反序列化功能

    使用

    1. 在公网服务器运行 server
    java -jar server-1.0.0-SNAPSHOT-jar-with-dependencies.jar --port 8090
    
    • --port 接受内网代理连接请求的端口
    1. 在内网服务器运行 proxy
    java -jar proxy-1.0.0-SNAPSHOT-jar-with-dependencies.jar --serverHost 127.0.0.1 --serverPort 8090 --configPath ./config.json
    
    • --serverHost 公网服务的 ip
    • --serverPort 公网服务的端口
    • --configPath 内网服务配置文件
    1. 内网服务配置
    {
      "mysql": {
        "ip": "127.0.0.1",
        "port": "3306",
        "mappingPort": "3307"
      },
      "ssh": {
        "ip": "127.0.0.1",
        "port": "22",
        "mappingPort": "2200"
      }
    }
    

    运行实例

    这是图片

    40 条回复    2023-12-26 18:33:17 +08:00
    lhbc
        1
    lhbc  
       2023-05-26 19:32:52 +08:00 via Android
    用 Java 来写这个有点……
    stevenkinwjg
        2
    stevenkinwjg  
    OP
       2023-05-26 19:38:04 +08:00
    @lhbc 怎么说?
    privil
        3
    privil  
       2023-05-26 19:40:30 +08:00
    @stevenkinwjg #2 还要装个 jdk 太不环保了,要不你用那个能编译成原生程序的来写
    stevenkinwjg
        4
    stevenkinwjg  
    OP
       2023-05-26 19:41:20 +08:00
    @privil 其实这是我学习 netty 的练手项目,会改进的
    stevenkinwjg
        5
    stevenkinwjg  
    OP
       2023-05-26 19:42:00 +08:00
    @privil 用 go 重写一下也行
    yaott2020
        6
    yaott2020  
       2023-05-26 20:05:15 +08:00 via Android
    只是个内网穿透,java 太重了。。
    oldshensheep
        7
    oldshensheep  
       2023-05-26 20:20:13 +08:00
    看了以下开在用 Java8 ,还在用 fastjson 。

    不过你这个可以用 GraalVM 编译成 Native 。

    用 Vertx 写会好受一些。学 Netty 学一半放弃了,日了狗了一样。
    xe2vforesu
        8
    xe2vforesu  
       2023-05-26 23:47:13 +08:00
    点赞,对学习 netty 有帮助,能有详细的文档说明就更好了
    littlewing
        9
    littlewing  
       2023-05-27 00:32:26 +08:00
    看出来是 “为了练手” 了,加油
    hotsymbol
        10
    hotsymbol  
       2023-05-27 11:14:49 +08:00
    用 Java 实现。是需要每个人都有一台 4C16G 的云服务器吗
    Alias4ck
        11
    Alias4ck  
       2023-05-27 11:46:32 +08:00
    可以学习一下 这个 tunel 工具 https://github.com/ekzhang/bore
    npe
        12
    npe  
       2023-05-27 11:58:51 +08:00   ❤️ 1
    人家是在学习 Netty ,用 Java 写咋了?那你用 Rust 写一个呗
    stevenkinwjg
        13
    stevenkinwjg  
    OP
       2023-05-27 12:06:14 +08:00
    @npe 哈哈,就是
    rekulas
        14
    rekulas  
       2023-05-27 13:59:29 +08:00   ❤️ 2
    这不算啥,阿里有个监控都是 java 写的,你安到 1h1g 服务器,监控自己先占个 80%资源 🤣
    stevenkinwjg
        15
    stevenkinwjg  
    OP
       2023-05-27 16:19:07 +08:00
    @oldshensheep 确实比较老了,现在流行啥技术?
    lizhian
        16
    lizhian  
       2023-05-27 17:46:42 +08:00
    作为一个学习项目来说挺好的~
    JustSong
        17
    JustSong  
       2023-05-28 09:42:15 +08:00 via Android
    我也有一个类似的练手项目,不过是 Go 写的,仅单个可执行文件: https://github.com/songquanpeng/go-public
    StevenQAQ
        18
    StevenQAQ  
       2023-05-29 09:48:33 +08:00
    能看出非常深厚的 Java 功底
    ycvk
        19
    ycvk  
       2023-05-29 12:43:32 +08:00
    vertx 或者 quarkus 了解下,按楼上说的,用 GraalVM 编译成 Native 更好些
    bugfan
        20
    bugfan  
       2023-05-31 09:10:39 +08:00
    意思用你这东西,还得先在机器上装个 jvm 啊,,,

    话说之前 v2 上也有个哥们用 java 写了一个穿透

    但是都没有我的方便哇😄
    https://www.i996.me
    yazinnnn
        21
    yazinnnn  
       2023-08-19 11:07:59 +08:00
    🤔测试了一下, 感觉没有并发的能力?

    用 wrk 测试了一下代理的 nginx, rps 只有个位数....

    简单看了眼代码, server 这边每个 proxy server 都会创建一个 event loop group?
    stevenkinwjg
        22
    stevenkinwjg  
    OP
       2023-08-23 10:40:33 +08:00
    @yazinnnn 感谢测试,这个我是为了学习 netty 写的,有很多要优化的地方
    stevenkinwjg
        23
    stevenkinwjg  
    OP
       2023-08-23 10:41:30 +08:00
    @yazinnnn 能把测试的结果贴到 GitHub 上吗?我看看
    yazinnnn
        24
    yazinnnn  
       2023-08-23 11:22:39 +08:00
    @stevenkinwjg #23

    简单总结一下
    单个连接连 proxy server 貌似木有问题, 多个连接去连会出错(没有在代理端口->被代理端口那里区分每个 client?)
    单个连接传输大数据量的文件有 bug
    proxy 和 server 貌似都没有热更新能力, proxy 程序关闭之后, server 也没有关掉开启的 proxy server

    https://gist.github.com/yazinnnn/8e8529fab8eb93ba81ad68e1767a2965
    stevenkinwjg
        25
    stevenkinwjg  
    OP
       2023-08-23 17:36:00 +08:00
    @yazinnnn 好的,我看看
    stevenkinwjg
        26
    stevenkinwjg  
    OP
       2023-09-07 10:55:45 +08:00
    @yazinnnn 大佬,我测试了一下并发连接。结果还好
    ![微信截图_20230907105048.png]( http://tva1.sinaimg.cn/large/00779OZ0ly1hhntyokefkj30r107ydi5.jpg)
    能复现一下你的测试吗
    stevenkinwjg
        27
    stevenkinwjg  
    OP
       2023-09-07 11:05:02 +08:00
    @yazinnnn ![微信截图_20230907105048.png]( https://x.imgs.ovh/x/2023/09/07/64f93dcb31d5f.png)
    stevenkinwjg
        28
    stevenkinwjg  
    OP
       2023-09-07 11:05:32 +08:00
    @yazinnnn 为啥 v 站发不了图片啊
    stevenkinwjg
        29
    stevenkinwjg  
    OP
       2023-09-07 11:06:37 +08:00
    ![微信截图_20230907105048.png]( https://x.imgs.ovh/x/2023/09/07/64f93dcb31d5f.png)
    stevenkinwjg
        30
    stevenkinwjg  
    OP
       2023-09-07 11:06:53 +08:00
    stevenkinwjg
        31
    stevenkinwjg  
    OP
       2023-09-07 11:07:22 +08:00
    <img src="https://x.imgs.ovh/x/2023/09/07/64f93dcb31d5f.png" alt="微信截图_20230907105048.png" title="微信截图_20230907105048.png" />
    stevenkinwjg
        32
    stevenkinwjg  
    OP
       2023-09-07 11:07:41 +08:00
    yazinnnn
        33
    yazinnnn  
       2023-09-07 14:29:08 +08:00
    @stevenkinwjg #26




    跑一下测试堆内存就爆炸了


    限制后, 堆内存快速耗尽
    yazinnnn
        34
    yazinnnn  
       2023-09-07 14:47:21 +08:00

    之前用 quarkus 套 vertx 上写了一个类似功能的工具, 用 graal 构建称 native 成品后性能还算 ok
    stevenkinwjg
        35
    stevenkinwjg  
    OP
       2023-09-09 18:05:16 +08:00
    @yazinnnn 图挂了,发个链接
    stevenkinwjg
        36
    stevenkinwjg  
    OP
       2023-09-14 14:25:46 +08:00
    @yazinnnn https://github.com/wandererex/wormhole 加了测试,现在可以并发连接 了,但 rps 只有几百
    yeyang5211
        37
    yeyang5211  
       342 天前
    @stevenkinwjg 最近在学习 netty 跟着这个项目写了一遍, 每次转发数据的时候都要去 map 里找一下 channel 这样并发起来效率是会变差 ,

    还有一个问题想咨询一下 ackHandle 是干啥的 ?
    是在服务器关闭的时候等待数据读写完毕之后再关闭 channel 吗
    stevenkinwjg
        38
    stevenkinwjg  
    OP
       336 天前
    @yeyang5211 最近优化了一下,主要是防止服务端活客户端关闭时数据还没有完全发给对端就关闭导致的错误
    stevenkinwjg
        39
    stevenkinwjg  
    OP
       336 天前
    性能优化了一下,qps 过 1k 了
    ![我的头像](/https://github.com/wandererex/wormhole/blob/optimize-20231013/test.png)
    stevenkinwjg
        40
    stevenkinwjg  
    OP
       336 天前
    性能优化了一下,qps 过 1k 了
    ![我的头像]( https://github.com/wandererex/wormhole/blob/optimize-20231013/test.png)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:02 · PVG 05:02 · LAX 13:02 · JFK 16:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.