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

Mr.2: 内网穿透

  •  4
     
  •   thisismr2 ·
    txthinking · 2019-05-05 09:39:29 +08:00 · 10512 次点击
    这是一个创建于 2033 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Mr.2

    Build Status License: GPL v3 EN

    Table of Contents

    Mr.2 是什么

    Mr.2 可以帮助你将内网服务器暴露在外网. 支持 TCP/UDP 协议, 当然也支持 HTTP 协议.
    让这个世界简单点.

    服务端

    $ mr2 server -l :9999 -p password
    

    客户端

    # 将本地服务 127.0.0.1:1234, 暴露在外网: server_address:5678
    $ mr2 client -s server_address:port -p password -P 5678 -c 127.0.0.1:1234
    
    # 将本地目录 /path/to/www, 以 HTTP 协议暴露在外网: server_address:5678
    $ mr2 client -s server_address:port -p password -P 5678 --clientDiretory /path/to/www
    

    示例

    访问内网 HTTP 服务

    $ mr2 client -s server_address:port -p password -P 5678 -c 127.0.0.1:8080
    
    # 然后
    你的外网 HTTP 服务: server_address:5678
    

    SSH 登录到内网机器

    $ mr2 client -s server_address:port -p password -P 5678 -c 127.0.0.1:22
    
    # 然后
    $ ssh -oPort=5678 user@server_address
    

    访问内网 DNS 服务

    $ mr2 client -s server_address:port -p password -P 5678 -c 127.0.0.1:53
    
    # 然后
    你的外网 DNS 服务: server_address:5678
    
    $ dig github.com @server_address -p 5678
    

    通过 HTTP 访问内网机器上的文件

    $ mr2 client -s server_address:port -p password -P 5678 --clientDirectory /path/to/www
    
    # 然后
    你的外网 HTTP 服务: server_address:5678
    

    任何基于 TCP/UDP 的你能想到的想法

    ...

    贡献

    请先阅读 CONTRIBUTING.md

    协议

    以 GPLv3 协议开源

    第 1 条附言  ·  2019-05-05 11:05:10 +08:00
    58 条回复    2019-05-14 00:18:20 +08:00
    thisismr2
        1
    thisismr2  
    OP
       2019-05-05 09:41:32 +08:00
    dabaibai
        2
    dabaibai  
       2019-05-05 09:46:00 +08:00
    FRP?
    thisismr2
        3
    thisismr2  
    OP
       2019-05-05 09:54:30 +08:00
    差不多. 相对使用更简单吧
    thisismr2
        4
    thisismr2  
    OP
       2019-05-05 10:04:00 +08:00
    一直团队内部使用, 后续会把其他相关配套整理后也开源出来
    shoaly
        5
    shoaly  
       2019-05-05 10:24:41 +08:00
    @thisismr2 相比 frp 确实要好理解一些, 主要是 frp 的配置特别绕.....
    顺便问问, 能支持 多密码对应特定端口的方式么.... 这样就可以多个 client 连同一个 server, 通过用户名和密码分开了
    比如:
    mr2 server -l :9999 -p2 {"pws1":"1081","pws2":"1082"} 这种
    Tink
        6
    Tink  
       2019-05-05 11:00:36 +08:00 via iPhone
    好像有点像 dog tunnel ?
    xionger
        7
    xionger  
       2019-05-05 11:04:17 +08:00 via iPhone
    看起来不错,待会到公司了试试
    thisismr2
        8
    thisismr2  
    OP
       2019-05-05 11:05:57 +08:00
    @shoaly 理论上是可以的, 会考虑
    thisismr2
        9
    thisismr2  
    OP
       2019-05-05 11:07:27 +08:00
    @Tink 恕我孤落寡闻😂
    Tink
        10
    Tink  
       2019-05-05 11:12:12 +08:00 via iPhone
    jay0726
        11
    jay0726  
       2019-05-05 11:19:07 +08:00
    基于 Java Netty 实现的可用于内网穿透的代理工具 https://github.com/wucao/natx 帮忙点几个 Star 吧😆
    thisismr2
        12
    thisismr2  
    OP
       2019-05-05 11:22:02 +08:00
    定位还是有点不同的. Mr2 定位简单但足够用, Work as you see first
    xionger
        13
    xionger  
       2019-05-05 11:25:17 +08:00 via iPhone
    楼上来踢馆的好像献丑了,只支持 TCP。
    楼主的貌似 UDP/TCP 全支持,可玩性更多
    xionger
        15
    xionger  
       2019-05-05 11:31:40 +08:00 via iPhone
    刚试了下,目前足够强大,ssh,http,dns TCP UDP 都试了下。
    我试了下如果我本地是 https, 也是支持的,但是建议楼主增加个功能 如果我本地的时 http,能不能外网变成 https。

    BTW 我是你另外项目 Brook 的用户,非常感谢。
    unixeno
        16
    unixeno  
       2019-05-05 11:35:53 +08:00 via Android
    @xionger 这个不应该是 Nginx 之类的干的活吗
    xionger
        17
    xionger  
       2019-05-05 11:45:18 +08:00 via iPhone
    @unixeno 也对

    我想的是,比如我的本地地址是 http://127.0.0.1:8080
    目前已实现外网服务器地址是 http://1.2.3.4:5678
    要是直接变成 https://1.2.3.4:5678 就用不到 nginx 了,哈哈
    wwqgtxx
        18
    wwqgtxx  
       2019-05-05 11:58:13 +08:00 via iPhone
    话说 udp 穿透部分还是走 udp over tcp 这样的么
    thisismr2
        19
    thisismr2  
    OP
       2019-05-05 12:01:50 +08:00
    @xionger

    我们前端也是有这个需求的, 我们团队内部已支持, 支持服务端证书, 也支持客户端自己颁发的证书的(我们公司所有电脑已信任我们自签的根证书)

    比如你上面是可以用自己的根证书给 1.2.3.4 颁发证书, 然后将根证书需要给访问的人信息, 当然不信任也能访问就是浏览器提示不安全, 点下仍继续访问的问题.

    这块其实东西其实不多, 但是也不算少, 就是给人感觉有点啰嗦,
    目前还在整理剥离内部代码后开源.
    thisismr2
        20
    thisismr2  
    OP
       2019-05-05 12:05:16 +08:00
    @wwqgtxx TCP 走 TCP, UDP 走 UDP.
    wwqgtxx
        21
    wwqgtxx  
       2019-05-05 12:11:28 +08:00 via iPhone
    @thisismr2 那还是很好的,回头试试,frp 这一块就是走 over tcp 的,所以 udp 穿透的效果很差。
    话说未来有打算支持一下类似 n2n 这样的功能么?
    xionger
        22
    xionger  
       2019-05-05 12:43:27 +08:00
    @thisismr2 期待
    thisismr2
        23
    thisismr2  
    OP
       2019-05-05 13:00:10 +08:00
    @wwqgtxx 目前 p2p 建立连接需要服务端交换双方基础信息, 且根据 nat 类型还有很大概率最后建立不成功, 不成功还是得服务端中转数据. 经过我们以前的研究, 有不少家庭公司 nat 网络建立失败, 最后还是走了中转. 而且还可能得要求最终端的用户也安装个客户端.
    shoaly
        24
    shoaly  
       2019-05-05 14:01:34 +08:00
    @thisismr2 go 不是很熟 , 可以给一个 大致的代码行数么, 空了试着自己改一个
    iMusic
        25
    iMusic  
       2019-05-05 14:05:13 +08:00
    localhost.run 啥都不用装,不过功能没这么强大
    thisismr2
        26
    thisismr2  
    OP
       2019-05-05 14:36:59 +08:00
    @shoaly 主要是认证这块, 其实的确要改的东西也不是很多, 我这两天增加上这个吧.
    大概结果是:

    ```
    $ mr2 server --portPassword "1000 password" --portPassword "2000 password"
    ```

    client 使用不变
    thisismr2
        27
    thisismr2  
    OP
       2019-05-05 15:32:09 +08:00
    @iMusic 后期会考虑提供免费的 server
    mooncakejs
        28
    mooncakejs  
       2019-05-05 15:37:42 +08:00
    不来个 docker image
    shoaly
        29
    shoaly  
       2019-05-05 16:44:57 +08:00
    @thisismr2 可以的话, 到时候 @我嘛 一定红包酬谢...
    kios
        30
    kios  
       2019-05-05 16:56:05 +08:00
    看上去配置起来比 frp 方便很多
    thisismr2
        31
    thisismr2  
    OP
       2019-05-05 17:24:53 +08:00
    @shoaly 好了 AT 你. red packet 不用了, 不接受个人任何形式的娟增 :) 那俩字打不出来 = = ||
    thisismr2
        32
    thisismr2  
    OP
       2019-05-05 17:45:55 +08:00
    @mooncakejs 可以用自己喜欢的 base image 做个自用嘛
    heretreeli
        33
    heretreeli  
       2019-05-05 17:52:52 +08:00
    n2n ??
    ninestep
        34
    ninestep  
       2019-05-05 18:25:02 +08:00   ❤️ 1
    支持 websocket 吗?我现在用到 frp 就走不通 websocket
    iamxiaoq
        35
    iamxiaoq  
       2019-05-05 18:54:33 +08:00 via Android
    昨天刚刚发现一个类似的 goproxy
    thisismr2
        36
    thisismr2  
    OP
       2019-05-05 19:17:27 +08:00   ❤️ 1
    @ninestep 理论上支持任何 TCP-based UDP-based 的协议. websocket 属于 TCP, 所以是支持的, 我没测试
    thisismr2
        37
    thisismr2  
    OP
       2019-05-05 19:18:14 +08:00
    @kios 😊
    thisismr2
        38
    thisismr2  
    OP
       2019-05-05 19:18:47 +08:00
    @heretreeli 不同
    thisismr2
        39
    thisismr2  
    OP
       2019-05-05 19:47:26 +08:00
    @ninestep websocket 支持. 朋友已测试.
    xionger
        40
    xionger  
       2019-05-05 20:05:45 +08:00
    @unixeno 的确,我现在是 本地 + nginx + mr2
    huaxianyan
        41
    huaxianyan  
       2019-05-05 20:14:21 +08:00
    感谢,回头试试
    WenjieYe
        42
    WenjieYe  
       2019-05-05 21:02:53 +08:00
    感谢
    回头试试
    designer
        43
    designer  
       2019-05-05 21:27:07 +08:00 via iPhone
    支持!
    ihipop
        44
    ihipop  
       2019-05-06 08:49:49 +08:00 via Android
    是 brook 作者吗?
    Dark1X
        45
    Dark1X  
       2019-05-06 17:08:02 +08:00
    支持!非常好用!
    thisismr2
        46
    thisismr2  
    OP
       2019-05-06 17:30:23 +08:00   ❤️ 1
    @shoaly

    ```
    # 只允许部分端口, 并针对每个端口设置密码
    $ mr2 server -l :9999 -P '5678 password' -P '6789 password1'
    ```
    hanguofu
        47
    hanguofu  
       2019-05-07 13:21:33 +08:00 via Android
    整个项目都是用 go 开发的吗?
    thisismr2
        48
    thisismr2  
    OP
       2019-05-07 14:14:32 +08:00
    @hanguofu 是的
    xionger
        49
    xionger  
       2019-05-08 09:33:47 +08:00 via iPhone
    #46 这个很有用
    Valid
        50
    Valid  
       2019-05-08 10:19:51 +08:00
    emmmm,有人 @我我才来的,来了看到没人 @我
    04huang
        51
    04huang  
       2019-05-08 12:09:44 +08:00
    所有的流量都走服务器?
    thisismr2
        52
    thisismr2  
    OP
       2019-05-08 13:04:50 +08:00
    @Valid 玄学问题
    04huang
        53
    04huang  
       2019-05-09 10:28:08 +08:00
    @thisismr2 我发现在 WIN 下老是提示 EOF 然后断开了链接。。
    samondlee
        54
    samondlee  
       2019-05-10 14:41:01 +08:00
    233 可以考虑增加 arm 版本
    树莓派、N1 刷 armbian 应用应该比较多
    thisismr2
        55
    thisismr2  
    OP
       2019-05-11 11:30:07 +08:00 via iPhone
    @samondlee release 页面有啊
    thisismr2
        56
    thisismr2  
    OP
       2019-05-12 22:09:11 +08:00 via iPhone
    @04huang 为了可以复现,可以提个 issue
    hzqim
        57
    hzqim  
       2019-05-14 00:12:46 +08:00
    谢谢分享。
    作为伸手党,期待 openwrt-mr2 以及 luci-app-mr2 的出现。
    hzqim
        58
    hzqim  
       2019-05-14 00:18:20 +08:00
    @chenhw2 已经移植到 Openwrt 了
    openwrt-mr2 https://github.com/chenhw2/openwrt-mr2
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3554 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 04:43 · PVG 12:43 · LAX 20:43 · JFK 23:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.