【docker】开源内网穿透神器!中微子代理搭建/使用教程
本文发布于290天前,最后更新于204天前,其中的信息可能有所发展或是发生改变。如有疑问请联系邮箱:admin@yemengstar.com。

1.前言

中微子代理是一个基于Netty的开源内网穿透神器。目前支持以下功能:

  • 流量监控
    首页图表、报表管理多维度流量监控。全方位掌握实时、历史代理数据。
  • 域名映射
    HTTP代理绑定子域名,开发调试三方回调更方便。
  • 用户/License
    支持多用户、多客户端使用。后台禁用实时生效。
  • 端口池
    对外端口统一管理,支持用户、License独占端口。
  • 端口映射
    新增、编辑、删除、禁用实时生效。
  • Docker
    服务端支持Docker一键部署。
  • 隧道SSL加密
    隧道通信支持SSL,保护您的数据安全
  • HTTPS
    支持HTTPS
  • 多客户端支持
    暂未支持

项目官网:中微子代理 (gitee.io)

项目Gitee:neutrino-proxy: 一款基于netty的内网穿透神器 (gitee.com)

界面展示:

2.准备

由于夜梦只是需要内网穿透,没有别的使用需求,所以夜梦选择的服务器是莱栈:https://stack.laecloud.com/,他家提供的大多是NAT服务器,但是带宽足够大,通常国内共享30M起步,妥妥够用。

在开始之前,你需要先安装好docker:

wget -qO- get.docker.com | bash

具体内容你可以参考:在服务器上安装docker

3.部署

官方给出的方法有docker一键部署使用jar文件部署,你可以使用sqlite或者是MySQL作为你的数据库。夜梦这里仅演示docker-sqlite的部署。

当前最新版本为1.8.5,下面的脚本中,可以使用:registry.cn-hangzhou.aliyuncs.com/asgc/neutrino-proxy:1.8.5 指定版本安装,推荐使用latest直接安装最新版。

docker run -it -p 9000-9200:9000-9200/tcp -p 8888:8888 \
-d --restart=always --name neutrino-proxy \
registry.cn-hangzhou.aliyuncs.com/asgc/neutrino-proxy:latest

4.映射配置

4.1访问

  • 服务端部署成功后,如果你使用的服务器具有独立IP地址,那么你可以直接访问http://{服务端IP}:8888打开后台管理页面。如果你和夜梦一样使用的是NAT服务器,那么你访问的地址应为http://yourAdress:port
  • 使用默认的管理员帐号登录:admin/123456

由于我们使用的是莱栈NAT服务器,所以需要我们去莱栈官网进行端口映射。

4.2管理后台配置

访问以后,应该能够看到如下的界面

请保持用户名admin,不要修改!否则后续的操作中会报权限错误!

接下来我们配置代理

  • 打开代理配置>License管理页面,可以看到系统已经自动为管理员初始化了一条License记录,复制该LicenseKey备用,后续客户端配置需要。请注意,请不要泄露License记录!拥有License记录即可使用你的代理!如果泄露,请第一时间进行重置!

接下来我们创建映射

  • 打开代理配置>端口映射页面,可以看到系统已经自动为初始化了几条端口映射。可根据需要自行添加、修改。
  • 对夜梦而言,内网穿透用的最多的就是开MC服务器,所以夜梦这里演示TCP协议的 9110 -> 127.0.0.1:25565 。由于没有现成的映射,这里夜梦新建一个。

创建完成

如果你只需要这一个映射,那么请把其他映射删除。或者是你新建一个license后,对这个license建立映射。否则到时候用默认的license启动客户端,所有映射均会启动在线。

由于我们使用的是NAT服务器,所以仍然需要我们将9110端口映射到公网端口上面。

5.启动客户端

  • 在本地neutrino-proxy-client.jar同级别目录下新建app.yml文件,并配置如下内容:
neutrino:
  proxy:
    logger:
      # 日志级别
      level: ${LOG_LEVEL:info}
    client:
      # 线程池相关配置,用于技术调优,可忽略
      thread-count: 50
      # 隧道SSL证书配置
      key-store-password: ${STORE_PASS:123456}
      jks-path: ${JKS_PATH:classpath:/test.jks}
      # 服务端IP
      server-ip: ${SERVER_IP:localhost}
      # 服务端端口(对应服务端app.yml中的tunnel.port、tunnel.ssl-port)
      server-port: ${SERVER_PORT:9002}
      # 是否启用SSL(注意:该配置必须和server-port对应上)
      ssl-enable: ${SSL_ENABLE:true}
      # 客户端连接唯一凭证
      license-key: ${LICENSE_KEY:}
      # 客户端唯一身份标识(可忽略,若不设置首次启动会自动生成)
      client-id: ${CLIENT_ID:}
      # 是否开启隧道传输报文日志(日志级别为debug时开启才有效)
      transfer-log-enable: ${CLIENT_LOG:false}
      # 重连设置
      reconnection:
        # 重连间隔(秒)
        interval-seconds: 10
        # 是否开启无限重连(未开启时,客户端license不合法会自动停止应用,开启了则不会,请谨慎开启)
        unlimited: false

以下是最新的服务端配置格式(app.yml),填写上面客户端配置的时候可以参考。

server:
  # 服务端web端口,用于支持HTTP接口,管理后台页面访问
  port: ${WEB_PORT:8888}

neutrino:
  proxy:
    logger:
      # 日志级别
      level: ${LOG_LEVEL:info}
    # 隧道相关配置-用于维持服务端与客户端的通信
    tunnel:
      # 线程池相关配置,用于技术调优,可忽略
      boss-thread-count: 2
      work-thread-count: 10
      # 隧道非SSL端口
      port: ${OPEN_PORT:9000}
      # 隧道SSL端口
      ssl-port: ${SSL_PORT:9002}
      # 隧道SSL证书配置
      key-store-password: ${STORE_PASS:123456}
      key-manager-password: ${MGR_PASS:123456}
      jks-path: ${JKS_PATH:classpath:/test.jks}
      # 是否开启隧道传输报文日志(日志级别为debug时开启才有效)
      transfer-log-enable: ${TUNNEL_LOG:false}
    server:
      # 线程池相关配置,用于技术调优,可忽略
      boss-thread-count: 5
      work-thread-count: 20
      # http代理端口,默认80
      http-proxy-port: ${HTTP_PROXY_PORT:80}
      # https代理端口,默认443 (需要配置域名、证书)
      https-proxy-port: ${HTTPS_PROXY_PORT:443}
      # 如果不配置,则不支持域名映射
      domain-name: ${DOMAIN_NAME:}
      # https证书配置
      key-store-password: ${HTTPS_STORE_PASS:}
      jks-path: ${HTTPS_JKS_PATH:}
      # 是否开启代理服务报文日志(日志级别为debug时开启才有效)
      transfer-log-enable: ${SERVER_LOG:false}
  data:
    db:
      # 数据库类型,目前支持sqlite、mysql、mariadb
      type: ${DB_TYPE:sqlite}
      # 数据库连接URL
      url: ${DB_URL:jdbc:sqlite:data.db}
      # 数据库用户名
      username: ${DB_USER:}
      # 数据库密码
      password: ${DB_PASSWORD:}

如果使用的是NAT服务器,需要将9000(noSLL)/9002(SSL)端口映射到公网,使用映射到公网的端口。具体操作办法和之前一样。

最终客户端配置应该和下面差不多

neutrino:
  proxy:
    client:
      # ssl证书密钥(使用jjar包内自带的证书,则此处无需修改)
      key-store-password: 123456
      # ssl证书管理密钥(使用jjar包内自带的证书,则此处无需修改。自定义证书,则此处配置对应的路径)
      jks-path: classpath:/test.jks
      # 代理服务端IP
      server-ip: ipipip
      # 代理服务端IP, 若是非ssl端口,则ssl-enable需要配置为false
      server-port: 9002
      # 是否启用ssl
      ssl-enable: true
      # licenseKey,客户端凭证。此处需要配置刚刚从管理后台复制的LicenseKey
      license-key: xxxx

以实际举例,如果你开我的世界服务器,使用中微子代理进行内网穿透,并且中微子所在的NAT服务器:

  • IP地址为233:233:233:233
  • 9000(非SSL)端口映射为23333端口
  • license-key为:yemeng666
  • 你未进行其他操作

那么最终的配置应该为:

neutrino:
  proxy:
    client:
      # ssl证书密钥(使用jjar包内自带的证书,则此处无需修改)
      key-store-password: 123456
      # ssl证书管理密钥(使用jjar包内自带的证书,则此处无需修改。自定义证书,则此处配置对应的路径)
      jks-path: classpath:/test.jks
      # 代理服务端IP
      server-ip: 233:233:233:233
      # 代理服务端IP, 若是非ssl端口,则ssl-enable需要配置为false
      server-port: 23333
      # 是否启用ssl
      ssl-enable: false
      # licenseKey,客户端凭证。此处需要配置刚刚从管理后台复制的LicenseKey
      license-key: yemeng666
  • 执行命令java -jar neutrino-proxy-client.jar config=app.yml启动客户端
  • 查看服务端License管理,刷新页面,对应的License在线状态为在线,则表明客户端已正常连接。

6.代理验证

  • 本地启动被代理服务,如:redis、本地web项目、本地mysql等等
  • 先确保本地能正常访问被代理服务,如果本地都不能访问,不用想代理更不可能!
  • 通过访问服务端IP+9110上面License配置的端口映射中的服务端端口/服务端ip+映射端口访问本地被代理服务

本地启动成功后,会有如下提示:

[Solon] App: Start loading
[Solon] App: Plugin starting
[Solon] App: Bean scanning
2023-08-10 11:29:27.455 default [main] INFO  o.d.n.core.dispatcher.DefaultDispatcher - 消息调度器 处理器初始化完成
[Solon] App: End loading elapsed=849ms pid=21744 v=2.3.6
2023-08-10 11:29:28.069 default [nioEventLoopGroup-2-1] INFO  o.d.neutrinoproxy.client.core.ProxyClientService - [客户端指令隧道] 连接代理服务成功. channelId:f4a475fffec4329f-66666666-66666666-2dd1c7f4cd0df90c-66666666
2023-08-10 11:29:28.296 default [nioEventLoopGroup-2-1] INFO  o.d.n.client.handler.ProxyMessageAuthHandler - 认证结果:{"msg":"璁よ瘉鎴愬姛!","licenseKey":"d0c4be666666666eab9e2333a8b2a902","code":0}

服务端会提示已经在线:

7.实际操作

可能夜梦在上面的教程中描述的比较混乱(好吧其实夜梦想一次性讲清楚NAT机和非NAT机的操作办法,看样子不行)。所以在这一部分中,夜梦将演示如何使用NAT主机部署中微子代理进行内网穿透,从而开设我的世界服务器(本地25565端口)。由于难度不大,所以夜梦仅文字叙述关键操作,日后如果有时间的话夜梦会补上具体操作。

  • 在NAT服务器上面安装docker
  • 在NAT服务器上面部署中微子代理
  • 将中微子代理WEB面板8888端口映射到公网,例如公网10000端口
  • 记录license
  • 删除多余的映射,仅建立服务端端口->25565,并将服务端端口映射至公网,例如公网10001端口
  • 将NAT服务器9000端口映射到公网,例如公网10002端口
  • 最后在本地填入配置信息

配置信息:

neutrino:
  proxy:
    client:
      # ssl证书密钥(使用jjar包内自带的证书,则此处无需修改)
      key-store-password: 123456
      # ssl证书管理密钥(使用jjar包内自带的证书,则此处无需修改。自定义证书,则此处配置对应的路径)
      jks-path: classpath:/test.jks
      # 代理服务端IP
      server-ip: 你的NAT主机IP地址
      # 代理服务端IP, 若是非ssl端口,则ssl-enable需要配置为false
      server-port: 你将NAT主机9000端口映射到公网的端口,例如10002
      # 是否启用ssl
      ssl-enable: false
      # licenseKey,客户端凭证。此处需要配置刚刚从管理后台复制的LicenseKey
      license-key: 你的license
本文为夜梦星尘原创文章。
文章作者:夜梦星尘
文章链接:【docker】开源内网穿透神器!中微子代理搭建/使用教程
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自夜梦星尘
支持作者:夜梦星尘的爱发电
上一篇
下一篇