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 @@
.{{ domainName }}
+
+
+
+
+
+ 毫秒
+
+
@@ -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