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.启动客户端
- 首先确保本地已安装java8运行环境,下载地址:Java Downloads | Oracle 中国
- 打开发行版页面 (opens new window),下载最新的release包:
neutrino-proxy-client.jar
- 在本地
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