diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/ProxyClient.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/ProxyClient.java index c01f343a..feca73ae 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/ProxyClient.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/ProxyClient.java @@ -22,12 +22,12 @@ public class ProxyClient { public static void main(String[] args) { Solon.start(ProxyClient.class, args, app -> { - setAlias("neutrino.proxy.client.serverIp", "serverIp"); - setAlias("neutrino.proxy.client.serverPort", "serverPort"); - setAlias("neutrino.proxy.client.sslEnable", "sslEnable"); - setAlias("neutrino.proxy.client.jksPath", "jksPath"); - setAlias("neutrino.proxy.client.keyStorePassword", "keyStorePassword"); - setAlias("neutrino.proxy.client.licenseKey", "licenseKey"); + setAlias("neutrino.proxy.tunnel.serverIp", "serverIp"); + setAlias("neutrino.proxy.tunnel.serverPort", "serverPort"); + setAlias("neutrino.proxy.tunnel.sslEnable", "sslEnable"); + setAlias("neutrino.proxy.tunnel.jksPath", "jksPath"); + setAlias("neutrino.proxy.tunnel.keyStorePassword", "keyStorePassword"); + setAlias("neutrino.proxy.tunnel.licenseKey", "licenseKey"); // 设置日志级别 setLogLevel(app); }); diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java index 68aa435b..1ef6d166 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java @@ -14,6 +14,8 @@ import org.noear.solon.annotation.Inject; public class ProxyConfig { @Inject("${neutrino.proxy.protocol}") private Protocol protocol; + @Inject("${neutrino.proxy.tunnel}") + private Tunnel tunnel; @Inject("${neutrino.proxy.client}") private Client client; @@ -30,7 +32,7 @@ public class ProxyConfig { } @Data - public static class Client { + public static class Tunnel { private String keyStorePassword; private String jksPath; private String serverIp; @@ -45,9 +47,25 @@ public class ProxyConfig { private Reconnection reconnection; } + @Data + public static class Client { +// private Tcp tcp; +// private Udp udp; + } + @Data public static class Reconnection { private Integer intervalSeconds; private Boolean unlimited; } + + @Data + private static class Tcp { + + } + + @Data + private static class Udp { + + } } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CmdChannelHandler.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CmdChannelHandler.java index decd5c0b..5d482fea 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CmdChannelHandler.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CmdChannelHandler.java @@ -24,8 +24,8 @@ public class CmdChannelHandler extends SimpleChannelInboundHandler public CmdChannelHandler() { ProxyConfig proxyConfig = Solon.context().getBean(ProxyConfig.class); - if (null != proxyConfig.getClient() && null != proxyConfig.getClient().getHeartbeatLogEnable()) { - transferLogEnable = proxyConfig.getClient().getHeartbeatLogEnable(); + if (null != proxyConfig.getClient() && null != proxyConfig.getTunnel().getHeartbeatLogEnable()) { + transferLogEnable = proxyConfig.getTunnel().getHeartbeatLogEnable(); } } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java index b3365549..39c6f38c 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java @@ -69,8 +69,8 @@ public class ProxyClientService { @Init public void init() { - this.reconnectExecutor.scheduleWithFixedDelay(this::reconnect, 10, proxyConfig.getClient().getReconnection().getIntervalSeconds(), TimeUnit.SECONDS); - this.workerGroup = new NioEventLoopGroup(proxyConfig.getClient().getThreadCount()); + this.reconnectExecutor.scheduleWithFixedDelay(this::reconnect, 10, proxyConfig.getTunnel().getReconnection().getIntervalSeconds(), TimeUnit.SECONDS); + this.workerGroup = new NioEventLoopGroup(proxyConfig.getTunnel().getThreadCount()); realServerBootstrap.group(workerGroup); realServerBootstrap.channel(NioSocketChannel.class); @@ -78,7 +78,7 @@ public class ProxyClientService { @Override public void initChannel(SocketChannel ch) throws Exception { - if (null != proxyConfig.getClient().getTransferLogEnable() && proxyConfig.getClient().getTransferLogEnable()) { + if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { ch.pipeline().addFirst(new LoggingHandler(RealServerChannelHandler.class)); } ch.pipeline().addLast(new RealServerChannelHandler()); @@ -87,15 +87,15 @@ public class ProxyClientService { proxyTunnelBootstrap.group(workerGroup); proxyTunnelBootstrap.channel(NioSocketChannel.class); - proxyTunnelBootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getClient().getServerIp(), proxyConfig.getClient().getServerPort())); + proxyTunnelBootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); proxyTunnelBootstrap.handler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { - if (proxyConfig.getClient().getSslEnable()) { + if (proxyConfig.getTunnel().getSslEnable()) { ch.pipeline().addLast(createSslHandler()); } - if (null != proxyConfig.getClient().getTransferLogEnable() && proxyConfig.getClient().getTransferLogEnable()) { + if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { ch.pipeline().addFirst(new LoggingHandler(ProxyChannelHandler.class)); } ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), @@ -116,16 +116,16 @@ public class ProxyClientService { // * Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。 // */ // cmdTunnelBootstrap.option(ChannelOption.TCP_NODELAY, true); - cmdTunnelBootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getClient().getServerIp(), proxyConfig.getClient().getServerPort())); + cmdTunnelBootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); cmdTunnelBootstrap.handler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { - if (proxyConfig.getClient().getSslEnable()) { + if (proxyConfig.getTunnel().getSslEnable()) { ch.pipeline().addLast(createSslHandler()); } - if (null != proxyConfig.getClient().getTransferLogEnable() && proxyConfig.getClient().getTransferLogEnable()) { + if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { ch.pipeline().addFirst(new LoggingHandler(CmdChannelHandler.class)); } ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), @@ -146,23 +146,23 @@ public class ProxyClientService { } public void start() { - if (StrUtil.isEmpty(proxyConfig.getClient().getServerIp())) { + if (StrUtil.isEmpty(proxyConfig.getTunnel().getServerIp())) { log.error("not found server-ip config."); Solon.stop(); return; } - if (null == proxyConfig.getClient().getServerPort()) { + if (null == proxyConfig.getTunnel().getServerPort()) { log.error("not found server-port config."); Solon.stop(); return; } - if (null != proxyConfig.getClient().getSslEnable() && proxyConfig.getClient().getSslEnable() - && StrUtil.isEmpty(proxyConfig.getClient().getJksPath())) { + if (null != proxyConfig.getTunnel().getSslEnable() && proxyConfig.getTunnel().getSslEnable() + && StrUtil.isEmpty(proxyConfig.getTunnel().getJksPath())) { log.error("not found jks-path config."); Solon.stop(); return; } - if (StrUtil.isEmpty(proxyConfig.getClient().getLicenseKey())) { + if (StrUtil.isEmpty(proxyConfig.getTunnel().getLicenseKey())) { log.error("not found license-key config."); Solon.stop(); return; @@ -174,7 +174,7 @@ public class ProxyClientService { log.error("client start error", e); } } else { - channel.writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getClient().getLicenseKey(), ProxyUtil.getClientId())); + channel.writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getTunnel().getLicenseKey(), ProxyUtil.getClientId())); } } @@ -191,7 +191,7 @@ public class ProxyClientService { channel = future.channel(); // 连接成功,向服务器发送客户端认证信息(licenseKey) ProxyUtil.setCmdChannel(future.channel()); - future.channel().writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getClient().getLicenseKey(), ProxyUtil.getClientId())); + future.channel().writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getTunnel().getLicenseKey(), ProxyUtil.getClientId())); log.info("[客户端指令隧道] 连接代理服务成功. channelId:{}", future.channel().id().asLongText()); // reconnectServiceEnable = true; @@ -205,11 +205,11 @@ public class ProxyClientService { private ChannelHandler createSslHandler() { try { - InputStream jksInputStream = FileUtil.getInputStream(proxyConfig.getClient().getJksPath()); + InputStream jksInputStream = FileUtil.getInputStream(proxyConfig.getTunnel().getJksPath()); SSLContext clientContext = SSLContext.getInstance("TLS"); final KeyStore ks = KeyStore.getInstance("JKS"); - ks.load(jksInputStream, proxyConfig.getClient().getKeyStorePassword().toCharArray()); + ks.load(jksInputStream, proxyConfig.getTunnel().getKeyStorePassword().toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); TrustManager[] trustManagers = tmf.getTrustManagers(); diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java index e0a05f17..b97b6ed4 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java @@ -34,7 +34,7 @@ public class ProxyMessageAuthHandler implements ProxyMessageHandler { // 客户端认证失败,直接停止服务 log.info("client auth failed , client stop."); context.channel().close(); - if (!proxyConfig.getClient().getReconnection().getUnlimited()) { + if (!proxyConfig.getTunnel().getReconnection().getUnlimited()) { Solon.stop(); } } else if (ExceptionEnum.CONNECT_FAILED.getCode().equals(code) || diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageConnectHandler.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageConnectHandler.java index bf74b562..51003346 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageConnectHandler.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageConnectHandler.java @@ -57,7 +57,7 @@ public class ProxyMessageConnectHandler implements ProxyMessageHandler { realServerChannel.attr(Constants.NEXT_CHANNEL).set(channel); // 远程绑定 - channel.writeAndFlush(ProxyMessage.buildConnectMessage(visitorId + "@" + proxyConfig.getClient().getLicenseKey())); + channel.writeAndFlush(ProxyMessage.buildConnectMessage(visitorId + "@" + proxyConfig.getTunnel().getLicenseKey())); realServerChannel.config().setOption(ChannelOption.AUTO_READ, true); ProxyUtil.addRealServerChannel(visitorId, realServerChannel); diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java index 4514c78c..80121228 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java @@ -140,8 +140,8 @@ public class ProxyUtil { return clientId; } ProxyConfig proxyConfig = Solon.context().getBean(ProxyConfig.class); - if (StringUtils.isNotBlank(proxyConfig.getClient().getClientId())) { - clientId = proxyConfig.getClient().getClientId(); + if (StringUtils.isNotBlank(proxyConfig.getTunnel().getClientId())) { + clientId = proxyConfig.getTunnel().getClientId(); return clientId; } String id = FileUtil.readContentAsString(CLIENT_ID_FILE); diff --git a/neutrino-proxy-client/src/main/resources/app.yml b/neutrino-proxy-client/src/main/resources/app.yml index 23072516..28eb2c0b 100644 --- a/neutrino-proxy-client/src/main/resources/app.yml +++ b/neutrino-proxy-client/src/main/resources/app.yml @@ -15,7 +15,7 @@ neutrino: logger: # 日志级别 level: ${LOG_LEVEL:info} - client: + tunnel: # 线程池相关配置,用于技术调优,可忽略 thread-count: 50 # 隧道SSL证书配置 @@ -41,3 +41,4 @@ neutrino: interval-seconds: 10 # 是否开启无限重连(未开启时,客户端license不合法会自动停止应用,开启了则不会,请谨慎开启) unlimited: false + client: diff --git a/todolist.MD b/todolist.MD index 264c8d08..9017982a 100644 --- a/todolist.MD +++ b/todolist.MD @@ -26,6 +26,10 @@ - [ ] 访问白名单 - [ ] 端口映射分组 - [ ] 支持UDP + - 服务端 + - 原`neutrino.proxy.server`配置移到`neutrino.proxy.server.tcp`下 + - 客户端 + - 原`neutrino.proxy.client`配置移到`neutrino.proxy.tunnel`下 # Bug - 指令通达被close的问题,org.dromara.neutrinoproxy.server.proxy.core.ProxyTunnelChannelHandler.channelInactive