mirror of
https://gitee.com/wujiawei1207537021/wu-lazy-cloud-network.git
synced 2025-06-06 13:27:55 +08:00
【fix】添加 @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
This commit is contained in:
parent
2e40988ef4
commit
fe3adeee03
@ -443,5 +443,17 @@ public class ClientAutoConfiguration {
|
|||||||
public ClientHandleDistributeSocksClientProxyClientTransferTransferRequestAdvanced clientHandleDistributeSocksClientProxyClientTransferTransferRequestAdvanced(){
|
public ClientHandleDistributeSocksClientProxyClientTransferTransferRequestAdvanced clientHandleDistributeSocksClientProxyClientTransferTransferRequestAdvanced(){
|
||||||
return new ClientHandleDistributeSocksClientProxyClientTransferTransferRequestAdvanced();
|
return new ClientHandleDistributeSocksClientProxyClientTransferTransferRequestAdvanced();
|
||||||
}
|
}
|
||||||
|
@Bean
|
||||||
|
public ClientHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced clientHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced(){
|
||||||
|
return new ClientHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced();
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public ClientHandleSocksDistributeServerProxyClientRequestTypeAdvanced clientHandleSocksDistributeServerProxyClientRequestTypeAdvanced(){
|
||||||
|
return new ClientHandleSocksDistributeServerProxyClientRequestTypeAdvanced();
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public ClientHandleSocksDistributeServerProxyClientTransferCloseAdvanced clientHandleSocksDistributeServerProxyClientTransferCloseAdvanced(){
|
||||||
|
return new ClientHandleSocksDistributeServerProxyClientTransferCloseAdvanced();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.advanced;
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.handler.codec.socksx.v5.Socks5AddressType;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.config.NettyClientProperties;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.NettySocksClientProxyClient;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.socket.NettySocksServerProxyClientRealSocket;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.client.AbstractHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Role;
|
||||||
|
import org.wu.framework.spring.utils.SpringContextHolder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
|
@Slf4j
|
||||||
|
public class ClientHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced extends
|
||||||
|
AbstractHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced<NettyProxyMsg> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理当前数据
|
||||||
|
*
|
||||||
|
* @param nettyChannelContext 当前通道
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
||||||
|
|
||||||
|
// 创建传输通道
|
||||||
|
// 绑定真实通道
|
||||||
|
|
||||||
|
Channel channel = nettyChannelContext.channel();
|
||||||
|
String clientId = nettyProxyMsg.getClientIdString();
|
||||||
|
byte[] visitorId = nettyProxyMsg.getVisitorId();
|
||||||
|
String targetIp = nettyProxyMsg.getTargetIpString();
|
||||||
|
Integer targetPort = Integer.parseInt(nettyProxyMsg.getTargetPortString());
|
||||||
|
|
||||||
|
byte[] data = nettyProxyMsg.getData();
|
||||||
|
byte socks5AddressType = data[0];
|
||||||
|
|
||||||
|
|
||||||
|
List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList = new ArrayList<>(SpringContextHolder.getApplicationContext().getBeansOfType(HandleChannelTypeAdvanced.class).values());
|
||||||
|
NettyClientProperties nettyClientProperties = SpringContextHolder.getBean(NettyClientProperties.class);
|
||||||
|
|
||||||
|
NettySocksClientProxyClient nettySocksClientProxyClient = new NettySocksClientProxyClient();
|
||||||
|
nettySocksClientProxyClient.setTargetClientId(clientId);
|
||||||
|
nettySocksClientProxyClient.setNettyClientProperties(nettyClientProperties);
|
||||||
|
nettySocksClientProxyClient.setHandleChannelTypeAdvancedList(handleChannelTypeAdvancedList);
|
||||||
|
nettySocksClientProxyClient.setTargetIp(targetIp);
|
||||||
|
nettySocksClientProxyClient.setTargetPort(targetPort);
|
||||||
|
|
||||||
|
ChannelAttributeKeyUtils.buildVisitorId(channel, visitorId);
|
||||||
|
ChannelAttributeKeyUtils.buildSocks5AddressType(channel,socks5AddressType);
|
||||||
|
|
||||||
|
// 创建真实通道
|
||||||
|
NettySocksServerProxyClientRealSocket.buildRealServer(
|
||||||
|
clientId,
|
||||||
|
targetIp,
|
||||||
|
targetPort,
|
||||||
|
new String(visitorId),
|
||||||
|
nettyClientProperties,
|
||||||
|
handleChannelTypeAdvancedList
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.advanced;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler.NettySocksServerProxyClientRealHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.client.AbstractHandleSocksDistributeServerProxyClientRequestTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Role;
|
||||||
|
import org.wu.framework.core.utils.ObjectUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NettySocksServerProxyClientRealHandler
|
||||||
|
*/
|
||||||
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
|
@Slf4j
|
||||||
|
public class ClientHandleSocksDistributeServerProxyClientRequestTypeAdvanced extends
|
||||||
|
AbstractHandleSocksDistributeServerProxyClientRequestTypeAdvanced<NettyProxyMsg> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理当前数据
|
||||||
|
*
|
||||||
|
* @param nettyChannelContext 当前通道
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
||||||
|
Channel channel = nettyChannelContext.channel();
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(channel);
|
||||||
|
if(ObjectUtils.isNotEmpty(nextChannel)&&nextChannel.isActive()){
|
||||||
|
ByteBuf buf = nextChannel.config().getAllocator().buffer(nettyProxyMsg.getData().length);
|
||||||
|
buf.writeBytes(nettyProxyMsg.getData());
|
||||||
|
nextChannel.writeAndFlush(buf);
|
||||||
|
}else {
|
||||||
|
log.error("客户端代理服务端socks,本地通道已关闭!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.advanced;
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.client.AbstractHandleSocksDistributeServerProxyClientRequestTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.client.AbstractHandleSocksDistributeServerProxyClientTransferCloseAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Role;
|
||||||
|
|
||||||
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
|
@Slf4j
|
||||||
|
public class ClientHandleSocksDistributeServerProxyClientTransferCloseAdvanced extends
|
||||||
|
AbstractHandleSocksDistributeServerProxyClientTransferCloseAdvanced<NettyProxyMsg> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理当前数据
|
||||||
|
*
|
||||||
|
* @param nettyChannelContext 当前通道
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
||||||
|
//
|
||||||
|
Channel channel = nettyChannelContext.channel();
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(channel);
|
||||||
|
channel.close();
|
||||||
|
nextChannel.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.filter;
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelPipeline;
|
||||||
|
import io.netty.channel.socket.SocketChannel;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler.NettySocksClientProxyClientRealHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler.NettySocksServerProxyClientRealHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.decoder.TransferDecoder;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.encoder.TransferEncoder;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.filter.DebugChannelInitializer;
|
||||||
|
|
||||||
|
public class NettySocksServerProxyClientRealFilter extends DebugChannelInitializer<SocketChannel> {
|
||||||
|
/**
|
||||||
|
* This method will be called once the {@link Channel} was registered. After the method returns this instance
|
||||||
|
* will be removed from the {@link ChannelPipeline} of the {@link Channel}.
|
||||||
|
*
|
||||||
|
* @param ch the {@link Channel} which was registered.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void initChannel0(SocketChannel ch) {
|
||||||
|
ChannelPipeline pipeline = ch.pipeline();
|
||||||
|
// 解码、编码
|
||||||
|
pipeline.addLast(new TransferDecoder(Integer.MAX_VALUE, 1024 * 1024*10));
|
||||||
|
pipeline.addLast(new TransferEncoder());
|
||||||
|
pipeline.addLast(new NettySocksServerProxyClientRealHandler());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.filter;
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import io.netty.channel.ChannelPipeline;
|
||||||
|
import io.netty.channel.socket.SocketChannel;
|
||||||
|
import io.netty.handler.timeout.IdleStateHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler.NettySocksServerProxyClientTransferHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelTypeAdapter;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.decoder.NettyProxyMsgDecoder;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.encoder.NettyProxyMsgEncoder;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.filter.DebugChannelInitializer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* netty 客户端连接真实服服务端访客拦截器
|
||||||
|
*/
|
||||||
|
public class NettySocksServerProxyClientTransferFilter extends DebugChannelInitializer<SocketChannel> {
|
||||||
|
private final ChannelTypeAdapter channelTypeAdapter;
|
||||||
|
|
||||||
|
public NettySocksServerProxyClientTransferFilter(ChannelTypeAdapter channelTypeAdapter) {
|
||||||
|
this.channelTypeAdapter = channelTypeAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method will be called once the {@link Channel} was registered. After the method returns this instance
|
||||||
|
* will be removed from the {@link ChannelPipeline} of the {@link Channel}.
|
||||||
|
*
|
||||||
|
* @param ch the {@link Channel} which was registered.
|
||||||
|
* @throws Exception is thrown if an error occurs. In that case it will be handled by
|
||||||
|
* {@link #exceptionCaught(ChannelHandlerContext, Throwable)} which will by default connectionClose
|
||||||
|
* the {@link Channel}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void initChannel0(SocketChannel ch) throws Exception {
|
||||||
|
ChannelPipeline pipeline = ch.pipeline();
|
||||||
|
// // 解码、编码
|
||||||
|
|
||||||
|
pipeline.addLast(new IdleStateHandler(0, 4, 0));
|
||||||
|
|
||||||
|
pipeline.addLast(new NettyProxyMsgDecoder(Integer.MAX_VALUE, 0, 4, -4, 0));
|
||||||
|
pipeline.addLast(new NettyProxyMsgEncoder());
|
||||||
|
pipeline.addLast(new NettySocksServerProxyClientTransferHandler(channelTypeAdapter));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelFutureListener;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
|
import io.netty.util.ReferenceCountUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.NettyByteBuf;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class NettyServerProxyClientVisitorInboundHandler extends SimpleChannelInboundHandler<NettyByteBuf> {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelActive(ChannelHandlerContext ctx) {
|
||||||
|
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelRead0(ChannelHandlerContext ctx, NettyByteBuf nettyByteBuf) throws Exception {
|
||||||
|
log.info("【socks】转发客户端的请求到代理服务器");
|
||||||
|
// 结果下发
|
||||||
|
Channel channel = ctx.channel();
|
||||||
|
byte[] bytes = nettyByteBuf.getData();
|
||||||
|
log.debug("bytes.length:{}",bytes.length);
|
||||||
|
log.debug("客户端代理服务端,socks本地接收请求数据:{}", new String(bytes));
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(channel);
|
||||||
|
|
||||||
|
if (nextChannel.isActive()) {
|
||||||
|
// 上报数据到服务端
|
||||||
|
NettyProxyMsg nettyProxyMsg = new NettyProxyMsg();
|
||||||
|
nettyProxyMsg.setType(ProxyMessageType.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_);
|
||||||
|
|
||||||
|
nettyProxyMsg.setData(nettyByteBuf.getData());
|
||||||
|
nextChannel.writeAndFlush(nettyProxyMsg);
|
||||||
|
} else {
|
||||||
|
log.info("释放内存");
|
||||||
|
ReferenceCountUtil.release(nettyByteBuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
log.info("【socks】客户端与代理服务器的连接已经断开,即将断开代理服务器和目标服务器的连接");
|
||||||
|
Channel channel = ctx.channel();
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(channel);
|
||||||
|
if (nextChannel.isActive()) {
|
||||||
|
// 下发断开链接
|
||||||
|
NettyProxyMsg nettyProxyMsgTransferClose = new NettyProxyMsg();
|
||||||
|
nettyProxyMsgTransferClose.setType(ProxyMessageType.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_);
|
||||||
|
nextChannel.writeAndFlush(nettyProxyMsgTransferClose);
|
||||||
|
if (ctx.channel().isActive()) {
|
||||||
|
ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||||||
|
log.error("【socks】NettyServerProxyClientVisitorInboundHandler exception", cause);
|
||||||
|
ctx.close();
|
||||||
|
}
|
||||||
|
}
|
@ -53,7 +53,7 @@ public class NettySocksClientProxyClientRealHandler extends SimpleChannelInbound
|
|||||||
if (nextChannel != null) {
|
if (nextChannel != null) {
|
||||||
// 上报关闭这个客户端的访客通道
|
// 上报关闭这个客户端的访客通道
|
||||||
NettyProxyMsg closeVisitorMsg = new NettyProxyMsg();
|
NettyProxyMsg closeVisitorMsg = new NettyProxyMsg();
|
||||||
closeVisitorMsg.setType(TcpMessageType.TCP_REPORT_CLIENT_PERMEATE_CLIENT_TRANSFER_CLOSE);
|
closeVisitorMsg.setType(ProxyMessageType.SOCKS_REPORT_CLIENT_PROXY_CLIENT_TRANSFER_CLOSE_);
|
||||||
closeVisitorMsg.setVisitorId(visitorId);
|
closeVisitorMsg.setVisitorId(visitorId);
|
||||||
nextChannel.writeAndFlush(closeVisitorMsg);
|
nextChannel.writeAndFlush(closeVisitorMsg);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,82 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.NettyByteBuf;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.constant.TcpMessageType;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 来自客户端 真实服务器返回的数据请求
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class NettySocksServerProxyClientRealHandler extends SimpleChannelInboundHandler<NettyByteBuf> {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelRead0(ChannelHandlerContext ctx,NettyByteBuf nettyByteBuf) {
|
||||||
|
|
||||||
|
byte[] bytes = nettyByteBuf.getData();
|
||||||
|
log.debug("bytes.length:{}",bytes.length);
|
||||||
|
log.debug("接收客户端真实服务数据:{}", new String(bytes));
|
||||||
|
String visitorId = ChannelAttributeKeyUtils.getVisitorId(ctx.channel());
|
||||||
|
Integer visitorPort = ChannelAttributeKeyUtils.getVisitorPort(ctx.channel());
|
||||||
|
String clientId = ChannelAttributeKeyUtils.getClientId(ctx.channel());
|
||||||
|
// 访客通信通道 上报服务端代理完成
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(ctx.channel());
|
||||||
|
NettyProxyMsg returnMessage = new NettyProxyMsg();
|
||||||
|
returnMessage.setType(ProxyMessageType.SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_);
|
||||||
|
returnMessage.setVisitorId(visitorId);
|
||||||
|
returnMessage.setClientId(clientId);
|
||||||
|
returnMessage.setVisitorPort(visitorPort);
|
||||||
|
returnMessage.setData(bytes);
|
||||||
|
|
||||||
|
nextChannel.writeAndFlush(returnMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
super.channelActive(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
String visitorId = ChannelAttributeKeyUtils.getVisitorId(ctx.channel());
|
||||||
|
// 客户端真实通信通道
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(ctx.channel());
|
||||||
|
if (nextChannel != null) {
|
||||||
|
// 上报关闭这个客户端的访客通道
|
||||||
|
NettyProxyMsg closeVisitorMsg = new NettyProxyMsg();
|
||||||
|
closeVisitorMsg.setType(ProxyMessageType.SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_);
|
||||||
|
closeVisitorMsg.setVisitorId(visitorId);
|
||||||
|
nextChannel.writeAndFlush(closeVisitorMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
super.channelInactive(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
// 获取访客的传输通道
|
||||||
|
if (ctx.channel().isWritable()) {
|
||||||
|
log.debug("Channel is writable again");
|
||||||
|
// 恢复之前暂停的操作,如写入数据
|
||||||
|
} else {
|
||||||
|
log.debug("Channel is not writable");
|
||||||
|
// 暂停写入操作,等待可写状态
|
||||||
|
}
|
||||||
|
log.info("channelWritabilityChanged!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||||||
|
super.exceptionCaught(ctx, cause);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelTypeAdapter;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class NettySocksServerProxyClientTransferHandler extends SimpleChannelInboundHandler<NettyProxyMsg> {
|
||||||
|
private final ChannelTypeAdapter channelTypeAdapter;
|
||||||
|
|
||||||
|
public NettySocksServerProxyClientTransferHandler(ChannelTypeAdapter channelTypeAdapter) {
|
||||||
|
this.channelTypeAdapter = channelTypeAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
super.channelActive(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelRead0(ChannelHandlerContext ctx, NettyProxyMsg nettyProxyMsg) throws Exception {
|
||||||
|
channelTypeAdapter.handler(ctx, nettyProxyMsg);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
|
||||||
|
String clientId = ChannelAttributeKeyUtils.getClientId(ctx.channel());
|
||||||
|
String visitorId = ChannelAttributeKeyUtils.getVisitorId(ctx.channel());
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(ctx.channel());
|
||||||
|
log.warn("close client permeate client transfer real clientId:{} visitorId:{}", clientId, visitorId);
|
||||||
|
// 关闭访客
|
||||||
|
if (nextChannel != null) {
|
||||||
|
|
||||||
|
// 上报关闭这个客户端的访客通道
|
||||||
|
NettyProxyMsg closeVisitorMsg = new NettyProxyMsg();
|
||||||
|
closeVisitorMsg.setType(ProxyMessageType.SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_);
|
||||||
|
closeVisitorMsg.setVisitorId(visitorId);
|
||||||
|
nextChannel.writeAndFlush(closeVisitorMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
super.channelInactive(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {
|
||||||
|
// 处理客户端本地真实通道问题
|
||||||
|
if (ctx.channel().isWritable()) {
|
||||||
|
log.debug("Channel is writable again");
|
||||||
|
// 恢复之前暂停的操作,如写入数据
|
||||||
|
} else {
|
||||||
|
log.debug("Channel is not writable");
|
||||||
|
// 暂停写入操作,等待可写状态
|
||||||
|
}
|
||||||
|
log.info("channelWritabilityChanged!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||||||
|
super.exceptionCaught(ctx, cause);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,166 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.socket;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.bootstrap.Bootstrap;
|
||||||
|
import io.netty.channel.*;
|
||||||
|
import io.netty.channel.socket.nio.NioSocketChannel;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.config.NettyClientProperties;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.filter.NettySocksClientProxyClientRealFilter;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.filter.NettySocksClientProxyClientTransferFilter;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.filter.NettySocksServerProxyClientRealFilter;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.filter.NettySocksServerProxyClientTransferFilter;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.NettyRealIdContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelTypeAdapter;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.factory.EventLoopGroupFactory;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class NettySocksServerProxyClientRealSocket {
|
||||||
|
|
||||||
|
|
||||||
|
public static void buildRealServer(String clientId,
|
||||||
|
String targetIp,
|
||||||
|
Integer targetPort,
|
||||||
|
String visitorId,
|
||||||
|
NettyClientProperties nettyClientProperties,
|
||||||
|
List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
EventLoopGroup eventLoopGroup = EventLoopGroupFactory.createClientWorkGroup();
|
||||||
|
|
||||||
|
Bootstrap bootstrap = new Bootstrap();
|
||||||
|
bootstrap
|
||||||
|
.group(eventLoopGroup)
|
||||||
|
.channel(NioSocketChannel.class)
|
||||||
|
.option(ChannelOption.TCP_NODELAY, true)
|
||||||
|
// 设置读缓冲区为2M
|
||||||
|
.option(ChannelOption.SO_RCVBUF, 2048 * 1024)
|
||||||
|
// 设置写缓冲区为1M
|
||||||
|
.option(ChannelOption.SO_SNDBUF, 1024 * 1024)
|
||||||
|
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000 * 60)//连接超时时间设置为 60 秒
|
||||||
|
.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
|
||||||
|
.handler(new NettySocksServerProxyClientRealFilter())
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
bootstrap.connect(targetIp, targetPort).addListener((ChannelFutureListener) future -> {
|
||||||
|
if (future.isSuccess()) {
|
||||||
|
// 客户端链接真实服务成功 设置自动读写false 等待访客连接成功后设置成true
|
||||||
|
Channel realChannel = future.channel();
|
||||||
|
realChannel.config().setOption(ChannelOption.AUTO_READ, false);
|
||||||
|
|
||||||
|
log.info("访客通过 客户端:【{}】,visitorId:{},绑定本地服务,IP:{},端口:{} 新建通道成功", clientId, visitorId, targetIp, targetPort);
|
||||||
|
// 客户端真实通道
|
||||||
|
NettyRealIdContext.pushReal(realChannel, visitorId);
|
||||||
|
// 绑定访客ID到当前真实通道属性
|
||||||
|
ChannelAttributeKeyUtils.buildVisitorId(realChannel, visitorId);
|
||||||
|
ChannelAttributeKeyUtils.buildClientId(realChannel, clientId);
|
||||||
|
|
||||||
|
// 连接服务端 然后绑定通道
|
||||||
|
// 新建一个通道处理
|
||||||
|
newVisitorConnect2Server(
|
||||||
|
clientId,
|
||||||
|
targetIp,
|
||||||
|
targetPort,
|
||||||
|
visitorId,
|
||||||
|
realChannel,
|
||||||
|
nettyClientProperties,
|
||||||
|
handleChannelTypeAdvancedList
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
log.error("客户:【{}】,无法连接当前网络内的目标IP:【{}】,目标端口:【{}】", clientId, targetIp, targetPort);
|
||||||
|
// DefaultSocks5CommandResponse commandResponse = new DefaultSocks5CommandResponse(Socks5CommandStatus.FAILURE, socks5AddressType);
|
||||||
|
// transferChannel.writeAndFlush(commandResponse);
|
||||||
|
// realChannel.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建访客连接服务端
|
||||||
|
*
|
||||||
|
* @param nettyClientProperties 服务端配置信息
|
||||||
|
* @param handleChannelTypeAdvancedList 处理器适配器
|
||||||
|
* @throws InterruptedException 异常
|
||||||
|
*/
|
||||||
|
protected static void newVisitorConnect2Server(String clientId,
|
||||||
|
String targetIp,
|
||||||
|
Integer targetPort,
|
||||||
|
String visitorId,
|
||||||
|
Channel realChannel,
|
||||||
|
NettyClientProperties nettyClientProperties,
|
||||||
|
List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList) throws InterruptedException {
|
||||||
|
EventLoopGroup eventLoopGroup = EventLoopGroupFactory.createClientWorkGroup();
|
||||||
|
Bootstrap bootstrap = new Bootstrap();
|
||||||
|
bootstrap.group(eventLoopGroup)
|
||||||
|
.channel(NioSocketChannel.class)
|
||||||
|
.option(ChannelOption.SO_KEEPALIVE, true)
|
||||||
|
// 设置读缓冲区为2M
|
||||||
|
.option(ChannelOption.SO_RCVBUF, 2048 * 1024)
|
||||||
|
// 设置写缓冲区为1M
|
||||||
|
.option(ChannelOption.SO_SNDBUF, 1024 * 1024)
|
||||||
|
// .option(ChannelOption.TCP_NODELAY, false)
|
||||||
|
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000 * 60)//连接超时时间设置为 60 秒
|
||||||
|
.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
|
||||||
|
|
||||||
|
.handler(new NettySocksServerProxyClientTransferFilter(new ChannelTypeAdapter(handleChannelTypeAdvancedList)))
|
||||||
|
;
|
||||||
|
|
||||||
|
String inetHost = nettyClientProperties.getInetHost();
|
||||||
|
int inetPort = nettyClientProperties.getInetPort();
|
||||||
|
// local client id
|
||||||
|
|
||||||
|
|
||||||
|
// 客户端新建访客通道 连接服务端IP:{},连接服务端端口:{}
|
||||||
|
log.info("client creates a new visitor channel to connect to server IP: {}, connecting to server port: {} with visitorId:{} & clientId:{}", inetHost, inetPort, visitorId, clientId);
|
||||||
|
ChannelFuture future = bootstrap.connect(inetHost, inetPort);
|
||||||
|
|
||||||
|
future.addListener((ChannelFutureListener) futureListener -> {
|
||||||
|
Channel transferChannel = futureListener.channel();
|
||||||
|
if (futureListener.isSuccess()) {
|
||||||
|
realChannel.config().setOption(ChannelOption.AUTO_READ, true);
|
||||||
|
// 通知服务端访客连接成功
|
||||||
|
NettyProxyMsg nettyProxyMsg = new NettyProxyMsg();
|
||||||
|
nettyProxyMsg.setVisitorId(visitorId);
|
||||||
|
nettyProxyMsg.setClientId(clientId);
|
||||||
|
nettyProxyMsg.setClientTargetIp(targetIp);
|
||||||
|
nettyProxyMsg.setClientTargetPort(targetPort);
|
||||||
|
nettyProxyMsg.setType(ProxyMessageType.SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_);
|
||||||
|
transferChannel.writeAndFlush(nettyProxyMsg);
|
||||||
|
|
||||||
|
ChannelAttributeKeyUtils.buildNextChannel(transferChannel, realChannel);
|
||||||
|
ChannelAttributeKeyUtils.buildNextChannel(realChannel, transferChannel);
|
||||||
|
|
||||||
|
// 绑定客户端真实通信通道
|
||||||
|
ChannelAttributeKeyUtils.buildVisitorId(transferChannel, visitorId);
|
||||||
|
ChannelAttributeKeyUtils.buildClientId(transferChannel, clientId);
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
log.info("无法连接到服务端....");
|
||||||
|
eventLoopGroup.schedule(() -> {
|
||||||
|
try {
|
||||||
|
newVisitorConnect2Server(clientId,
|
||||||
|
targetIp,
|
||||||
|
targetPort,
|
||||||
|
visitorId, realChannel, nettyClientProperties, handleChannelTypeAdvancedList);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}, 2, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.client;
|
||||||
|
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.AbstractHandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
||||||
|
|
||||||
|
public abstract class AbstractHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced <MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否支持当前类型
|
||||||
|
*
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @return 布尔类型 是、否
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean doSupport(NettyProxyMsg nettyProxyMsg) {
|
||||||
|
return ProxyMessageTypeEnums.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_.getTypeByte() == nettyProxyMsg.getType();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.client;
|
||||||
|
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.AbstractHandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
||||||
|
|
||||||
|
public abstract class AbstractHandleSocksDistributeServerProxyClientRequestTypeAdvanced<MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否支持当前类型
|
||||||
|
*
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @return 布尔类型 是、否
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean doSupport(NettyProxyMsg nettyProxyMsg) {
|
||||||
|
return ProxyMessageTypeEnums.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_.getTypeByte() == nettyProxyMsg.getType();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.client;
|
||||||
|
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.AbstractHandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
||||||
|
|
||||||
|
public abstract class AbstractHandleSocksDistributeServerProxyClientTransferCloseAdvanced<MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否支持当前类型
|
||||||
|
*
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @return 布尔类型 是、否
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean doSupport(NettyProxyMsg nettyProxyMsg) {
|
||||||
|
return ProxyMessageTypeEnums.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_.getTypeByte() == nettyProxyMsg.getType();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server;
|
||||||
|
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.AbstractHandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
||||||
|
|
||||||
|
public abstract class AbstractHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced <MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否支持当前类型
|
||||||
|
*
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @return 布尔类型 是、否
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean doSupport(NettyProxyMsg nettyProxyMsg) {
|
||||||
|
return ProxyMessageTypeEnums.SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_.getTypeByte() == nettyProxyMsg.getType();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server;
|
||||||
|
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.AbstractHandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
||||||
|
|
||||||
|
public abstract class AbstractHandleSocksReportServerProxyClientResponseTypeAdvanced<MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否支持当前类型
|
||||||
|
*
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @return 布尔类型 是、否
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean doSupport(NettyProxyMsg nettyProxyMsg) {
|
||||||
|
return ProxyMessageTypeEnums.SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_.getTypeByte() == nettyProxyMsg.getType();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server;
|
||||||
|
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.AbstractHandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
||||||
|
|
||||||
|
public abstract class AbstractHandleSocksReportServerProxyClientTransferCloseTypeAdvanced<MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否支持当前类型
|
||||||
|
*
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @return 布尔类型 是、否
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean doSupport(NettyProxyMsg nettyProxyMsg) {
|
||||||
|
return ProxyMessageTypeEnums.SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_.getTypeByte() == nettyProxyMsg.getType();
|
||||||
|
}
|
||||||
|
}
|
@ -5,7 +5,7 @@ import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelT
|
|||||||
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProxyMessageTypeEnums;
|
||||||
|
|
||||||
public abstract class AbstractHandleSocksServerProxyClientTypeAdvanced<MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
public abstract class AbstractHandleSocksReportServerProxyClientTypeAdvanced<MSG> extends AbstractHandleChannelTypeAdvanced<NettyProxyMsg> implements HandleChannelTypeAdvanced {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
@ -239,10 +239,54 @@ public class ProxyMessageType {
|
|||||||
* socket 服务端代理客户端
|
* socket 服务端代理客户端
|
||||||
*
|
*
|
||||||
* @see ProxyMessageTypeEnums#SOCKS_SERVER_PROXY_CLIENT_
|
* @see ProxyMessageTypeEnums#SOCKS_SERVER_PROXY_CLIENT_
|
||||||
* @see AbstractHandleSocksServerProxyClientTypeAdvanced
|
* @see AbstractHandleSocksReportServerProxyClientTypeAdvanced
|
||||||
*/
|
*/
|
||||||
public static final byte SOCKS_SERVER_PROXY_CLIENT_ = SOCKS_REPORT_CLIENT_PROXY_CLIENT_TRANSFER_CLOSE_ + 1;
|
public static final byte SOCKS_SERVER_PROXY_CLIENT_ = SOCKS_REPORT_CLIENT_PROXY_CLIENT_TRANSFER_CLOSE_ + 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* socket 下发客户端代理服务端连接初始化
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_
|
||||||
|
* @see AbstractHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced
|
||||||
|
*/
|
||||||
|
public static final byte SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_ = SOCKS_SERVER_PROXY_CLIENT_ - 1;
|
||||||
|
/**
|
||||||
|
* socket 上报客户端代理服务端连接初始化成功
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_
|
||||||
|
* @see AbstractHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced
|
||||||
|
*/
|
||||||
|
public static final byte SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_ = SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_ - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* socket 下发客户端代理服务端 请求数据
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_
|
||||||
|
* @see AbstractHandleSocksDistributeServerProxyClientRequestTypeAdvanced
|
||||||
|
*/
|
||||||
|
public static final byte SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_ = SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_ - 1;
|
||||||
|
/**
|
||||||
|
* socket 上报客户端代理服务端 结果返回
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_
|
||||||
|
* @see AbstractHandleSocksReportServerProxyClientResponseTypeAdvanced
|
||||||
|
*/
|
||||||
|
public static final byte SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_ = SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_ - 1;
|
||||||
|
/**
|
||||||
|
* socket 下发客户端代理服务端 传输通道关闭
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_
|
||||||
|
* @see AbstractHandleSocksDistributeServerProxyClientTransferCloseAdvanced
|
||||||
|
*/
|
||||||
|
public static final byte SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_ = SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_ - 1;
|
||||||
|
/**
|
||||||
|
* socket 上报客户端代理服务端 传输通道关闭
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_
|
||||||
|
* @see AbstractHandleSocksReportServerProxyClientTransferCloseTypeAdvanced
|
||||||
|
*/
|
||||||
|
public static final byte SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_ = SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_ - 1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -320,9 +320,51 @@ public enum ProxyMessageTypeEnums {
|
|||||||
* socket 服务端代理客户端
|
* socket 服务端代理客户端
|
||||||
*
|
*
|
||||||
* @see ProxyMessageTypeEnums#SOCKS_SERVER_PROXY_CLIENT_
|
* @see ProxyMessageTypeEnums#SOCKS_SERVER_PROXY_CLIENT_
|
||||||
* @see AbstractHandleSocksServerProxyClientTypeAdvanced
|
* @see AbstractHandleSocksReportServerProxyClientTypeAdvanced
|
||||||
*/
|
*/
|
||||||
SOCKS_SERVER_PROXY_CLIENT_(ProxyMessageType.SOCKS_SERVER_PROXY_CLIENT_, "socket 服务端代理客户端"),
|
SOCKS_SERVER_PROXY_CLIENT_(ProxyMessageType.SOCKS_SERVER_PROXY_CLIENT_, "socket 服务端代理客户端"),
|
||||||
|
/**
|
||||||
|
* socket 下发客户端代理服务端连接初始化
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_
|
||||||
|
* @see AbstractHandleSocksDistributeServerProxyClientConnectionInitTypeAdvanced
|
||||||
|
*/
|
||||||
|
SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_(ProxyMessageType.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_, "socket 下发客户端代理服务端连接初始化"),
|
||||||
|
/**
|
||||||
|
* socket 上报客户端代理服务端连接初始化成功
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_
|
||||||
|
* @see AbstractHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced
|
||||||
|
*/
|
||||||
|
SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_(ProxyMessageType.SOCKS_REPORT_SERVER_PROXY_CLIENT_CONNECTION_SUCCESS_, "socket 上报客户端代理服务端连接初始化成功"),
|
||||||
|
/**
|
||||||
|
* socket 下发客户端代理服务端 请求数据
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_
|
||||||
|
* @see AbstractHandleSocksDistributeServerProxyClientRequestTypeAdvanced
|
||||||
|
*/
|
||||||
|
SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_(ProxyMessageType.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_REQUEST_, "socket 下发客户端代理服务端 请求数据"),
|
||||||
|
/**
|
||||||
|
* socket 上报客户端代理服务端 结果返回
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_
|
||||||
|
* @see AbstractHandleSocksReportServerProxyClientResponseTypeAdvanced
|
||||||
|
*/
|
||||||
|
SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_(ProxyMessageType.SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_RESPONSE_, "socket 上报客户端代理服务端 结果返回"),
|
||||||
|
/**
|
||||||
|
* socket 下发客户端代理服务端 传输通道关闭
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_
|
||||||
|
* @see AbstractHandleSocksDistributeServerProxyClientTransferCloseAdvanced
|
||||||
|
*/
|
||||||
|
SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_(ProxyMessageType.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_, "socket 下发客户端代理服务端 传输通道关闭"),
|
||||||
|
/**
|
||||||
|
* socket 上报客户端代理服务端 传输通道关闭
|
||||||
|
*
|
||||||
|
* @see ProxyMessageTypeEnums#SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_
|
||||||
|
* @see AbstractHandleSocksReportServerProxyClientTransferCloseTypeAdvanced
|
||||||
|
*/
|
||||||
|
SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_(ProxyMessageType.SOCKS_REPORT_SERVER_PROXY_CLIENT_TRANSFER_CLOSE_, "socket 上报客户端代理服务端 传输通道关闭"),
|
||||||
|
|
||||||
|
|
||||||
;
|
;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.framework.lazy.cloud.network.heartbeat.common.utils;
|
package org.framework.lazy.cloud.network.heartbeat.common.utils;
|
||||||
|
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.handler.codec.socksx.v5.Socks5AddressType;
|
||||||
import io.netty.util.AttributeKey;
|
import io.netty.util.AttributeKey;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.NettyByteBuf;
|
import org.framework.lazy.cloud.network.heartbeat.common.NettyByteBuf;
|
||||||
|
|
||||||
@ -262,10 +263,11 @@ public class ChannelAttributeKeyUtils {
|
|||||||
* 为通道绑定 请求地址类型
|
* 为通道绑定 请求地址类型
|
||||||
*
|
*
|
||||||
* @param channel 通道
|
* @param channel 通道
|
||||||
* @param socks5AddressType 地址类型
|
* @param socks5AddressTypeByte 地址类型
|
||||||
|
* @see Socks5AddressType#valueOf(byte)
|
||||||
*/
|
*/
|
||||||
public static void buildSocks5AddressType(Channel channel, Byte socks5AddressType) {
|
public static void buildSocks5AddressType(Channel channel, Byte socks5AddressTypeByte) {
|
||||||
channel.attr(NETTY_SOCKS5_ADDRESS_TYPE).set(socks5AddressType);
|
channel.attr(NETTY_SOCKS5_ADDRESS_TYPE).set(socks5AddressTypeByte);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -290,9 +290,22 @@ public class ServerAutoConfiguration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ServerHandleSocksServerProxyClientTypeAdvanced serverHandleSocksServerProxyClientTypeAdvanced() {
|
public ServerHandleSocksReportServerProxyClientTypeAdvanced serverHandleSocksServerProxyClientTypeAdvanced() {
|
||||||
return new ServerHandleSocksServerProxyClientTypeAdvanced();
|
return new ServerHandleSocksReportServerProxyClientTypeAdvanced();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ServerHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced serverHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced(){
|
||||||
|
return new ServerHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced();
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public ServerHandleSocksReportServerProxyClientResponseTypeAdvanced serverHandleSocksReportServerProxyClientResponseTypeAdvanced(){
|
||||||
|
return new ServerHandleSocksReportServerProxyClientResponseTypeAdvanced();
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public ServerHandleSocksReportServerProxyClientTransferCloseTypeAdvanced serverHandleSocksReportServerProxyClientTransferCloseTypeAdvanced(){
|
||||||
|
return new ServerHandleSocksReportServerProxyClientTransferCloseTypeAdvanced();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,51 +73,6 @@ public class ServerHandleSocksReportClientProxyClientConnectTransferTypeAdvanced
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Socks5AddressType socks5AddressType = Socks5AddressType.valueOf(data[0]);
|
|
||||||
|
|
||||||
// 创建真实代理链接
|
|
||||||
EventLoopGroup group = EventLoopGroupFactory.createClientWorkGroup();
|
|
||||||
Bootstrap b = new Bootstrap();
|
|
||||||
b.group(group)
|
|
||||||
.channel(NioSocketChannel.class)
|
|
||||||
.option(ChannelOption.TCP_NODELAY, true)
|
|
||||||
.handler(new ChannelInitializer<SocketChannel>() {
|
|
||||||
@Override
|
|
||||||
protected void initChannel(SocketChannel ch) {
|
|
||||||
ch.pipeline().addLast(new TransferDecoder(Integer.MAX_VALUE, 1024 * 1024 * 10));
|
|
||||||
ch.pipeline().addLast(new NettySocksClientProxyServerRealHandler());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
log.info("准备连接目标服务器,ip = {},port = {}", host, port);
|
|
||||||
ChannelFuture f = b.connect(new InetSocketAddress(host, port));
|
|
||||||
f.addListener((ChannelFutureListener) future -> {
|
|
||||||
Channel realChannel = future.channel();
|
|
||||||
if (future.isSuccess()) {
|
|
||||||
|
|
||||||
log.info("目标服务器连接成功");
|
|
||||||
// 通道相互绑定
|
|
||||||
ChannelAttributeKeyUtils.buildNextChannel(transferChannel, realChannel);
|
|
||||||
ChannelAttributeKeyUtils.buildNextChannel(realChannel, transferChannel);
|
|
||||||
|
|
||||||
// 传输通道连接成功下发
|
|
||||||
NettyProxyMsg transferNettyProxyMsg = new NettyProxyMsg();
|
|
||||||
|
|
||||||
transferNettyProxyMsg.setType(ProxyMessageType.SOCKS_DISTRIBUTE_CLIENT_PROXY_CLIENT_TRANSFER_CONNECTION_SUCCESS_);
|
|
||||||
transferChannel.writeAndFlush(transferNettyProxyMsg);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
log.error("连接目标服务器失败,address={},port={}", host, port);
|
|
||||||
DefaultSocks5CommandResponse commandResponse = new DefaultSocks5CommandResponse(Socks5CommandStatus.FAILURE, socks5AddressType);
|
|
||||||
transferChannel.writeAndFlush(commandResponse);
|
|
||||||
realChannel.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO 下发 连接真实服务成功、客户端可以采集数据了
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.advanced;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.handler.codec.socksx.v5.DefaultSocks5CommandResponse;
|
||||||
|
import io.netty.handler.codec.socksx.v5.Socks5AddressType;
|
||||||
|
import io.netty.handler.codec.socksx.v5.Socks5CommandRequestDecoder;
|
||||||
|
import io.netty.handler.codec.socksx.v5.Socks5CommandStatus;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler.NettyClientProxyClientVisitorInboundHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.socks.handler.NettyServerProxyClientVisitorInboundHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.NettyTransferChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server.AbstractHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.decoder.TransferDecoder;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.protocol.handler.NettySocks5CommandRequestHandler;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.handler.NettySocksClientProxyServerRealHandler;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Role;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
|
||||||
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class ServerHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced
|
||||||
|
extends AbstractHandleSocksReportServerProxyClientConnectionSuccessTypeAdvanced<NettyProxyMsg> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理当前数据
|
||||||
|
*
|
||||||
|
* @param nettyChannelContext 当前通道
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @see NettySocksClientProxyServerRealHandler
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
||||||
|
// 打开访客通道获取访问数据
|
||||||
|
byte[] visitorId = nettyProxyMsg.getVisitorId();
|
||||||
|
Channel visitorChannel = NettyTransferChannelContext.getVisitor(visitorId);
|
||||||
|
// 传输通道
|
||||||
|
Channel transferChannel = nettyChannelContext.channel();
|
||||||
|
ChannelAttributeKeyUtils.buildNextChannel(transferChannel,visitorChannel);
|
||||||
|
ChannelAttributeKeyUtils.buildNextChannel(visitorChannel,transferChannel);
|
||||||
|
|
||||||
|
|
||||||
|
// 根据传输通道获取代理通道
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(transferChannel);
|
||||||
|
|
||||||
|
Byte socks5AddressTypeByte = ChannelAttributeKeyUtils.getSocks5AddressType(nextChannel);
|
||||||
|
Socks5AddressType socks5AddressType = Socks5AddressType.valueOf(socks5AddressTypeByte);
|
||||||
|
//添加客户端转发请求到服务端的Handler
|
||||||
|
// TODO bug fix
|
||||||
|
nextChannel.pipeline().addLast(new TransferDecoder(Integer.MAX_VALUE, 1024 * 1024*10));
|
||||||
|
// 请求数据开始上报
|
||||||
|
nextChannel.pipeline().addLast(new NettyServerProxyClientVisitorInboundHandler());
|
||||||
|
DefaultSocks5CommandResponse commandResponse =
|
||||||
|
new DefaultSocks5CommandResponse(Socks5CommandStatus.SUCCESS, socks5AddressType);
|
||||||
|
nextChannel.writeAndFlush(commandResponse);
|
||||||
|
nextChannel.pipeline().remove(NettySocks5CommandRequestHandler.class);
|
||||||
|
nextChannel.pipeline().remove(Socks5CommandRequestDecoder.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.advanced;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server.AbstractHandleSocksReportServerProxyClientResponseTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.handler.NettySocksClientProxyServerRealHandler;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Role;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.wu.framework.core.utils.ObjectUtils;
|
||||||
|
|
||||||
|
|
||||||
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class ServerHandleSocksReportServerProxyClientResponseTypeAdvanced
|
||||||
|
extends AbstractHandleSocksReportServerProxyClientResponseTypeAdvanced<NettyProxyMsg> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理当前数据
|
||||||
|
*
|
||||||
|
* @param nettyChannelContext 当前通道
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @see NettySocksClientProxyServerRealHandler
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
||||||
|
|
||||||
|
Channel channel = nettyChannelContext.channel();
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(channel);
|
||||||
|
if(ObjectUtils.isNotEmpty(nextChannel)&&nextChannel.isActive()){
|
||||||
|
ByteBuf buf = nextChannel.config().getAllocator().buffer(nettyProxyMsg.getData().length);
|
||||||
|
buf.writeBytes(nettyProxyMsg.getData());
|
||||||
|
nextChannel.writeAndFlush(buf);
|
||||||
|
}else {
|
||||||
|
log.error("服务端代理客户端socks,本地通道已关闭!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.advanced;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.channel.Channel;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server.AbstractHandleSocksReportServerProxyClientTransferCloseTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.handler.NettySocksClientProxyServerRealHandler;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Role;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
|
||||||
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class ServerHandleSocksReportServerProxyClientTransferCloseTypeAdvanced
|
||||||
|
extends AbstractHandleSocksReportServerProxyClientTransferCloseTypeAdvanced<NettyProxyMsg> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理当前数据
|
||||||
|
*
|
||||||
|
* @param nettyChannelContext 当前通道
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
* @see NettySocksClientProxyServerRealHandler
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
||||||
|
Channel channel = nettyChannelContext.channel();
|
||||||
|
Channel nextChannel = ChannelAttributeKeyUtils.getNextChannel(channel);
|
||||||
|
channel.close();
|
||||||
|
nextChannel.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
package org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.advanced;
|
||||||
|
|
||||||
|
|
||||||
|
import io.netty.channel.*;
|
||||||
|
import io.netty.handler.codec.socksx.v5.Socks5AddressType;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.NettyTransferChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server.AbstractHandleSocksReportServerProxyClientTypeAdvanced;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Role;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.wu.framework.core.utils.ObjectUtils;
|
||||||
|
|
||||||
|
|
||||||
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class ServerHandleSocksReportServerProxyClientTypeAdvanced
|
||||||
|
extends AbstractHandleSocksReportServerProxyClientTypeAdvanced<NettyProxyMsg> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理当前数据
|
||||||
|
*
|
||||||
|
* @param nettyChannelContext 当前通道
|
||||||
|
* @param nettyProxyMsg 通道数据
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
||||||
|
Channel visitorrChannel = nettyChannelContext.channel();
|
||||||
|
|
||||||
|
String host = nettyProxyMsg.getTargetIpString();
|
||||||
|
Integer port = Integer.parseInt(nettyProxyMsg.getTargetPortString());
|
||||||
|
byte[] data = nettyProxyMsg.getData();
|
||||||
|
byte[] visitorId = nettyProxyMsg.getVisitorId();
|
||||||
|
byte[] targetClientId = nettyProxyMsg.getClientId();
|
||||||
|
|
||||||
|
byte socks5AddressTypeByte = data[0];
|
||||||
|
|
||||||
|
|
||||||
|
String msgVisitorId = new String(visitorId);
|
||||||
|
ChannelAttributeKeyUtils.buildVisitorId(visitorrChannel, msgVisitorId);
|
||||||
|
NettyTransferChannelContext.pushVisitor(visitorrChannel, msgVisitorId);
|
||||||
|
ChannelAttributeKeyUtils.buildSocks5AddressType(visitorrChannel,socks5AddressTypeByte);
|
||||||
|
|
||||||
|
// 客户端连接客户端传输通道
|
||||||
|
Channel loadBalance = ChannelContext.getLoadBalance(targetClientId);
|
||||||
|
if(ObjectUtils.isNotEmpty(loadBalance)) {
|
||||||
|
// 下发创建新链接指令
|
||||||
|
NettyProxyMsg otherClientConnectServer = new NettyProxyMsg();
|
||||||
|
// data ---》Socks5AddressType
|
||||||
|
otherClientConnectServer.setData(data);
|
||||||
|
otherClientConnectServer.setClientTargetIp(host);
|
||||||
|
otherClientConnectServer.setClientTargetPort(port);
|
||||||
|
otherClientConnectServer.setVisitorId(visitorId);
|
||||||
|
otherClientConnectServer.setClientId(targetClientId);
|
||||||
|
otherClientConnectServer.setType(ProxyMessageType.SOCKS_DISTRIBUTE_SERVER_PROXY_CLIENT_CONNECTION_INIT_);
|
||||||
|
loadBalance.writeAndFlush(otherClientConnectServer);
|
||||||
|
|
||||||
|
}else {
|
||||||
|
log.error("无法通过客户端ID获取当前客户端通道");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,123 +0,0 @@
|
|||||||
package org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.advanced;
|
|
||||||
|
|
||||||
|
|
||||||
import io.netty.bootstrap.Bootstrap;
|
|
||||||
import io.netty.channel.*;
|
|
||||||
import io.netty.channel.socket.SocketChannel;
|
|
||||||
import io.netty.channel.socket.nio.NioSocketChannel;
|
|
||||||
import io.netty.handler.codec.socksx.v5.DefaultSocks5CommandResponse;
|
|
||||||
import io.netty.handler.codec.socksx.v5.Socks5AddressType;
|
|
||||||
import io.netty.handler.codec.socksx.v5.Socks5CommandStatus;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.NettyTransferChannelContext;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyChannelContext;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.advanced.proxy.socks.server.AbstractHandleSocksServerProxyClientTypeAdvanced;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.decoder.TransferDecoder;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.factory.EventLoopGroupFactory;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
|
||||||
import org.framework.lazy.cloud.network.heartbeat.server.netty.proxy.socks.handler.NettySocksClientProxyServerRealHandler;
|
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
|
||||||
import org.springframework.context.annotation.Role;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.wu.framework.core.utils.ObjectUtils;
|
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
|
||||||
|
|
||||||
|
|
||||||
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
public class ServerHandleSocksServerProxyClientTypeAdvanced
|
|
||||||
extends AbstractHandleSocksServerProxyClientTypeAdvanced<NettyProxyMsg> {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理当前数据
|
|
||||||
*
|
|
||||||
* @param nettyChannelContext 当前通道
|
|
||||||
* @param nettyProxyMsg 通道数据
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doHandler(NettyChannelContext nettyChannelContext, NettyProxyMsg nettyProxyMsg) {
|
|
||||||
Channel transferChannel = nettyChannelContext.channel();
|
|
||||||
|
|
||||||
String host = nettyProxyMsg.getTargetIpString();
|
|
||||||
Integer port = Integer.parseInt(nettyProxyMsg.getTargetPortString());
|
|
||||||
byte[] data = nettyProxyMsg.getData();
|
|
||||||
byte[] visitorId = nettyProxyMsg.getVisitorId();
|
|
||||||
byte[] targetClientId = nettyProxyMsg.getClientId();
|
|
||||||
String msgVisitorId = new String(visitorId);
|
|
||||||
ChannelAttributeKeyUtils.buildClientId(transferChannel, targetClientId);
|
|
||||||
ChannelAttributeKeyUtils.buildVisitorId(transferChannel, msgVisitorId);
|
|
||||||
|
|
||||||
NettyTransferChannelContext.pushVisitor(transferChannel, msgVisitorId);
|
|
||||||
|
|
||||||
// 客户端连接客户端传输通道
|
|
||||||
Channel loadBalance = ChannelContext.getLoadBalance(targetClientId);
|
|
||||||
if(ObjectUtils.isNotEmpty(loadBalance)) {
|
|
||||||
// 下发创建新链接指令
|
|
||||||
NettyProxyMsg otherClientConnectServer = new NettyProxyMsg();
|
|
||||||
otherClientConnectServer.setData(data);
|
|
||||||
otherClientConnectServer.setClientTargetIp(host);
|
|
||||||
otherClientConnectServer.setClientTargetPort(port);
|
|
||||||
otherClientConnectServer.setVisitorId(visitorId);
|
|
||||||
otherClientConnectServer.setClientId(targetClientId);
|
|
||||||
otherClientConnectServer.setType(ProxyMessageType.SOCKS_DISTRIBUTE_CLIENT_PROXY_CLIENT_OTHER_TRANSFER_CONNECTION_);
|
|
||||||
loadBalance.writeAndFlush(otherClientConnectServer);
|
|
||||||
|
|
||||||
}else {
|
|
||||||
log.error("无法通过客户端ID获取当前客户端通道");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Socks5AddressType socks5AddressType = Socks5AddressType.valueOf(data[0]);
|
|
||||||
|
|
||||||
// 创建真实代理链接
|
|
||||||
EventLoopGroup group = EventLoopGroupFactory.createClientWorkGroup();
|
|
||||||
Bootstrap b = new Bootstrap();
|
|
||||||
b.group(group)
|
|
||||||
.channel(NioSocketChannel.class)
|
|
||||||
.option(ChannelOption.TCP_NODELAY, true)
|
|
||||||
.handler(new ChannelInitializer<SocketChannel>() {
|
|
||||||
@Override
|
|
||||||
protected void initChannel(SocketChannel ch) {
|
|
||||||
ch.pipeline().addLast(new TransferDecoder(Integer.MAX_VALUE, 1024 * 1024 * 10));
|
|
||||||
ch.pipeline().addLast(new NettySocksClientProxyServerRealHandler());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
log.info("准备连接目标服务器,ip = {},port = {}", host, port);
|
|
||||||
ChannelFuture f = b.connect(new InetSocketAddress(host, port));
|
|
||||||
f.addListener((ChannelFutureListener) future -> {
|
|
||||||
Channel realChannel = future.channel();
|
|
||||||
if (future.isSuccess()) {
|
|
||||||
|
|
||||||
log.info("目标服务器连接成功");
|
|
||||||
// 通道相互绑定
|
|
||||||
ChannelAttributeKeyUtils.buildNextChannel(transferChannel, realChannel);
|
|
||||||
ChannelAttributeKeyUtils.buildNextChannel(realChannel, transferChannel);
|
|
||||||
|
|
||||||
// 传输通道连接成功下发
|
|
||||||
NettyProxyMsg transferNettyProxyMsg = new NettyProxyMsg();
|
|
||||||
|
|
||||||
transferNettyProxyMsg.setType(ProxyMessageType.SOCKS_DISTRIBUTE_CLIENT_PROXY_CLIENT_TRANSFER_CONNECTION_SUCCESS_);
|
|
||||||
transferChannel.writeAndFlush(transferNettyProxyMsg);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
log.error("连接目标服务器失败,address={},port={}", host, port);
|
|
||||||
DefaultSocks5CommandResponse commandResponse = new DefaultSocks5CommandResponse(Socks5CommandStatus.FAILURE, socks5AddressType);
|
|
||||||
transferChannel.writeAndFlush(commandResponse);
|
|
||||||
realChannel.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO 下发 连接真实服务成功、客户端可以采集数据了
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user