From 8d9fc4cff6cc06d218f0348a6643d5f357cab031 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Fri, 22 Sep 2023 22:41:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E9=80=9AUDP=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=9B=B4=E6=96=B0SQL=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/proxy/portMapping.vue | 16 ++++++++++++++-- .../client/util/UdpServerUtil.java | 13 +++++++++++++ .../src/main/resources/app.yml | 2 +- .../dromara/neutrinoproxy/core/Constants.java | 6 ++++++ .../controller/PortMappingController.java | 14 +++++++++++++- .../req/proxy/PortMappingCreateReq.java | 8 ++++++++ .../req/proxy/PortMappingUpdateReq.java | 8 ++++++++ .../res/proxy/PortMappingDetailRes.java | 8 ++++++++ .../res/proxy/PortMappingListRes.java | 8 ++++++++ .../server/dal/entity/PortMappingDO.java | 8 ++++++++ .../proxy/core/ProxyTunnelChannelHandler.java | 5 ++++- .../proxy/core/UdpVisitorChannelHandler.java | 17 ++++++++++------- .../handler/ProxyMessageConnectHandler.java | 2 ++ .../handler/UdpProxyMessageConnectHandler.java | 9 +++++++-- .../server/service/PortMappingService.java | 17 ++++++++++++++++- .../server/service/VisitorChannelService.java | 3 ++- .../resources/sql/mariadb/init-structure.sql | 4 +++- .../main/resources/sql/mysql/init-structure.sql | 4 +++- .../sql/mysql/update/UPDATE-20230922.SQL | 2 ++ .../resources/sql/sqlite/init-structure.sql | 4 +++- .../sql/sqlite/update/UPDATE-20230922.SQL | 2 ++ 21 files changed, 141 insertions(+), 19 deletions(-) create mode 100644 neutrino-proxy-server/src/main/resources/sql/mysql/update/UPDATE-20230922.SQL create mode 100644 neutrino-proxy-server/src/main/resources/sql/sqlite/update/UPDATE-20230922.SQL diff --git a/neutrino-proxy-admin/src/views/proxy/portMapping.vue b/neutrino-proxy-admin/src/views/proxy/portMapping.vue index c120ac41..9caf8f0e 100644 --- a/neutrino-proxy-admin/src/views/proxy/portMapping.vue +++ b/neutrino-proxy-admin/src/views/proxy/portMapping.vue @@ -168,6 +168,14 @@ + + + + + + + + @@ -281,7 +289,9 @@ export default { serverPort: undefined, clientIp: undefined, clientPort: undefined, - protocal: undefined + protocal: undefined, + proxyResponses: undefined, + proxyTimeoutMs: undefined }, selectObj: { statusOptions: [{ label: '启用', value: 1 }, { label: '禁用', value: 2 }], @@ -431,7 +441,9 @@ export default { serverPort: undefined, clientIp: '127.0.0.1', clientPort: undefined, - userId: undefined + userId: undefined, + proxyResponses: undefined, + proxyTimeoutMs: undefined } this.serverPortList = [] this.loadServerPortQuery.licenseId = null; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java index 48b833c0..cd9f9ea0 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java @@ -1,8 +1,10 @@ package org.dromara.neutrinoproxy.client.util; import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.dromara.neutrinoproxy.client.config.ProxyConfig; @@ -174,10 +176,21 @@ public class UdpServerUtil { System.currentTimeMillis() - lockChannel.getTakeTime().getTime() >= lockChannel.getProxyTimeoutMs() ) { iter.remove(); + UdpChannelBindInfo udpChannelBindInfo = lockChannel.getChannel().attr(Constants.UDP_CHANNEL_BIND_KEY).get(); + // 此处必须释放代理隧道 + closeChannel(udpChannelBindInfo.getTunnelChannel()); lockChannel.getChannel().attr(Constants.UDP_CHANNEL_BIND_KEY).set(null); udpServerFreePortPool.offer(lockChannel.getPort()); log.debug("[udp channel]release udp channel port:{}", lockChannel.getPort()); } } } + + private static void closeChannel(Channel channel) { + try { + channel.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE); + } catch (Exception e) { + // ignore + } + } } diff --git a/neutrino-proxy-client/src/main/resources/app.yml b/neutrino-proxy-client/src/main/resources/app.yml index 89977937..3b869fb3 100644 --- a/neutrino-proxy-client/src/main/resources/app.yml +++ b/neutrino-proxy-client/src/main/resources/app.yml @@ -47,6 +47,6 @@ neutrino: boss-thread-count: 5 work-thread-count: 20 # udp傀儡端口范围 - puppet-port-range: 10000-10100 + puppet-port-range: 10000-10500 # 是否开启隧道传输报文日志(日志级别为debug时开启才有效) transfer-log-enable: ${CLIENT_LOG:false} diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java index 5a3d916c..59c5175e 100644 --- a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java +++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java @@ -40,6 +40,12 @@ public interface Constants { AttributeKey TARGET_IP = AttributeKey.newInstance("targetIp"); AttributeKey TARGET_PORT = AttributeKey.newInstance("targetPort"); + AttributeKey PROXY_RESPONSES = AttributeKey.newInstance("proxyResponses"); + AttributeKey PROXY_TIMEOUT_MS = AttributeKey.newInstance("proxyTimeoutMs"); + + // 临时解决 udp channel被close的问题 + AttributeKey IS_UDP_KEY = AttributeKey.newInstance("isUdp"); + int HEADER_SIZE = 4; int TYPE_SIZE = 1; diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java index 5a52640c..e9f536e0 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java @@ -40,7 +40,7 @@ public class PortMappingController { ParamCheckUtil.checkNotNull(req.getServerPort(), "serverPort"); ParamCheckUtil.checkNotNull(req.getClientPort(), "clientPort"); ParamCheckUtil.checkNotEmpty(req.getProtocal(), "protocal"); - ParamCheckUtil.checkMaxLength(req.getDescription(), 50, "描述", "50"); + ParamCheckUtil.checkMaxLength(req.getDescription(), 50, "描述", "50"); if (StringUtils.isBlank(req.getClientIp())) { // 没传客户端ip,默认为127.0.0.1 req.setClientIp("127.0.0.1"); @@ -52,6 +52,12 @@ public class PortMappingController { req.setSubdomain(null); } req.setProtocal(networkProtocolEnum.getDesc()); + if (null == req.getProxyResponses()) { + req.setProxyResponses(0); + } + if (null == req.getProxyTimeoutMs()) { + req.setProxyTimeoutMs(0L); + } return portMappingService.create(req); } @@ -76,6 +82,12 @@ public class PortMappingController { req.setSubdomain(null); } req.setProtocal(networkProtocolEnum.getDesc()); + if (null == req.getProxyResponses()) { + req.setProxyResponses(0); + } + if (null == req.getProxyTimeoutMs()) { + req.setProxyTimeoutMs(0L); + } return portMappingService.update(req); } diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java index 3f6d7f2c..5270e8c6 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java @@ -54,6 +54,14 @@ public class PortMappingCreateReq { * 客户端端口 */ private Integer clientPort; + /** + * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数) + */ + private Integer proxyResponses; + /** + * 代理超时时间 + */ + private Long proxyTimeoutMs; /** * 描述 */ diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java index 0ce46f64..5b1a94b9 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java @@ -58,6 +58,14 @@ public class PortMappingUpdateReq { * 客户端端口 */ private Integer clientPort; + /** + * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数) + */ + private Integer proxyResponses; + /** + * 代理超时时间 + */ + private Long proxyTimeoutMs; /** * 描述 */ diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java index f378ede2..c0d95255 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java @@ -49,6 +49,14 @@ public class PortMappingDetailRes { * {@link OnlineStatusEnum} */ private Integer isOnline; + /** + * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数) + */ + private Integer proxyResponses; + /** + * 代理超时时间 + */ + private Long proxyTimeoutMs; /** * 启用状态 * {@link EnableStatusEnum} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java index 1dcab22a..8a022cee 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java @@ -89,6 +89,14 @@ public class PortMappingListRes { * {@link EnableStatusEnum} */ private Integer enable; + /** + * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数) + */ + private Integer proxyResponses; + /** + * 代理超时时间 + */ + private Long proxyTimeoutMs; /** * 描述 */ diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java index a36409a1..f83d656f 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java @@ -78,6 +78,14 @@ public class PortMappingDO { * {@link OnlineStatusEnum} */ private Integer isOnline; + /** + * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数) + */ + private Integer proxyResponses; + /** + * 代理超时时间 + */ + private Long proxyTimeoutMs; /** * 启用状态 * {@link EnableStatusEnum} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java index a3fc522e..d44cc9e2 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java @@ -89,8 +89,11 @@ public class ProxyTunnelChannelHandler extends SimpleChannelInboundHandler>>{}", ctx.channel().id().asLongText()); byte[] bytes = new byte[datagramPacket.content().readableBytes()]; datagramPacket.content().readBytes(bytes); datagramPacket.content().resetReaderIndex(); @@ -36,12 +37,14 @@ public class UdpVisitorChannelHandler extends SimpleChannelInboundHandler