文档章节

使用JAVA实现TCP数据转发

BLUE-魏晓峰
 BLUE-魏晓峰
发布于 2013/05/27 16:12
字数 756
阅读 2966
收藏 4

你是否有过这样的使用场景,比如有一个数据库或主机,因为安全、网络的关系,在你的电脑上无法直接访问。但是此时你有一个中间的机子,中间机子可以访问上述的数据库或主机,同时你的电脑可以访问该中间机子。

开动歪脑筋,能否在中间的机子上装一个什么软件,可以在你的电脑上直接访问你之前所不能访问的数据库或主机?

答案是肯定的,在中间机子上装一个TCP数据转发软件就可以了。这种现成的软件很多,linux自带的iptable也可以实现该功能。不过因为原理简单、还是自己动手、丰衣足食吧,上代码:

package com.ai.police.portmap;

import java.net.ServerSocket;
import java.net.Socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class TranslatePort {
 private transient static Log log = LogFactory.getLog(TranslatePort.class);
 
 public static void main(String[] args) {
  try {
   if(args == null || args.length<3){
    log.error("输出参数不能为空,分别是 本地监听端口、远程IP、远程端口");
    return;
   }
   
   
   
   //获取本地监听端口、远程IP和远程端口
   int localPort = Integer.parseInt(args[0].trim());
   String remoteIp = args[1].trim();
   int remotePort = Integer.parseInt(args[2].trim());
   
   //启动本地监听端口
   ServerSocket serverSocket = new ServerSocket(localPort);
   log.error("localPort="+localPort + ";remoteIp=" + remoteIp +
     ";remotePort="+remotePort+";启动本地监听端口" + localPort + "成功!");
   
   while(true){
    Socket clientSocket = null;
    Socket remoteServerSocket = null;
    try {
     //获取客户端连接
     clientSocket = serverSocket.accept();

     log.error("accept one client");
     //建立远程连接
     remoteServerSocket = new Socket(remoteIp ,remotePort);

     log.error("create remoteip and port success");
     //启动数据转换接口
     (new TransPortData(clientSocket ,remoteServerSocket ,"1")).start();
     (new TransPortData(remoteServerSocket ,clientSocket,"2")).start();
    } catch (Exception ex) {
     log.error("",ex);
    }
    //建立连接远程
   }
  } catch (Exception e) {
   log.error("",e);
  }
 }
}

 

 

package com.ai.police.portmap;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 用于转发数据
 * @author Administrator
 *
 */
public class TransPortData extends Thread {

 private transient static Log log = LogFactory.getLog(TranslatePort.class);
 
 Socket getDataSocket;
 Socket putDataSocket;
 
 String type;
 
 public TransPortData(Socket getDataSocket , Socket putDataSocket ,String type){
  this.getDataSocket = getDataSocket;
  this.putDataSocket = putDataSocket;
  this.type = type;
 }
 
 public void run(){
  try {
   while(true){

    InputStream in = getDataSocket.getInputStream() ;
    OutputStream out = putDataSocket.getOutputStream() ;
    //读入数据
    byte[] data = new byte[1024];
    int readlen = in.read(data);
    
    //如果没有数据,则暂停
    if(readlen<=0){
     Thread.sleep(300);
     continue;
    }
    
    
    out.write(data ,0,readlen);
    out.flush();
   }
  } catch (Exception e) {
   log.error("type:"+type,e);
  }
  finally{
   //关闭socket
   try {
    if(putDataSocket != null){
     putDataSocket.close();
    }
   } catch (Exception exx) {
   }
   
   try {
    if(getDataSocket != null){
     getDataSocket.close();
    }
   } catch (Exception exx) {
   }
  }
 }
 
}

测试结果:

1、可以实现对oracle数据库、ssh 、telnet等转发,客户端只要连到中间机子对应的端口上,实现了直接操作后台数据库或主机的功能;

2、上述代码不支持HTTP转发,不能实现的原因并不是因为数据没有转发过去,HTTP是基于TCP上的一种高层协议,tcp数据肯定是转发给对应的web服务器了。不能实现的原因是http协议本身的原因,http请求报文中的host参数包含了目的web服务器的ip和端口,直接转发因为host数据不正确导致真正的web服务器会丢弃该请求;另外,还有其它http协议本身的原因,回头我会专门撰写一篇HTTP数据转发来描述解决方案

© 著作权归作者所有

共有 人打赏支持
BLUE-魏晓峰
粉丝 69
博文 30
码字总数 15160
作品 0
福州
高级程序员
私信 提问
加载中

评论(3)

dxdingdu
dxdingdu
楼主有没有关于HTTP转发的解决方案呢
BLUE-魏晓峰
BLUE-魏晓峰

引用来自“kof97”的评论

代码呢?!32
晕,不知道代码怎么没了,我补下
k
kof97
代码呢?!32
使用drozer.bat console connect 时报错的解决方法

1、首先在真实机或者模拟器中启动drozer agent; 2、端口转发:adb forward tcp:31415 tcp:31415; 3、启动drozer:drozer console connect; eg:使用命令:drozer.bat console connect 启动...

carlos
2015/10/27
0
0
Holer 一个可以从外网访问内网的反向代理工具

Holer exposes local servers behind NATs and firewalls to the public internet over secure tunnels. Support forwarding message based on TCP protocol. Holer是一个将局域网服务器代理......

码翼
11/05
0
0
Rserve与Java的跨平台通信

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。 R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言...

zh119893
2014/04/20
0
2
Holer 一个可以从外网访问内网的反向代理工具

Holer是一个将局域网服务器代理到公网的内网穿透工具,支持转发基于TCP协议的报文。可以将本地的HTTP Server、WEB应用、SSH、Telnet、数据库…… 映射到外网,实现从外网访问。 关于holer的使...

码翼
11/05
0
0
深入理解JVM——JVM性能调优实战 原

如何在高性能服务器上进行JVM调优? 为了充分利用高性能服务器的硬件资源,有两种JVM调优方案,它们都有各自的优缺点,需要根据具体的情况进行选择。 1、采用64位操作系统,并为JVM分配大内存...

Theriseof
11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

盘点愚人节各大网站彩蛋,谁最爱恶搞?

如今的愚人节俨然已是各品牌宣传了一个重要节日,同时,也成为了各大互联网科技企业凑热闹,比拼创意和策划的节日。跟小编一起看看有哪些有趣的策划吧! Google地图变成吃豆人游戏 每年愚人节...

临江仙卜算子
11分钟前
0
0
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS、ReentrantLock、UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍。Java8 用到了红黑树...

java菜分享
12分钟前
0
0
玩手机与做实验

看过这样一个故事:说的是在二十世纪二十年代初的一个深夜,担任英国剑桥大学卡文迪许实验室主任的卢瑟福来实验室检查,发现一位学生还在做实验。卢瑟福就问他:“你上午做什么了?”学生回答...

Bob2100
45分钟前
4
0
Kafka流式处理

Kafka Streams 初识流式处理 什么是数据流 数据流(也叫事件流)是无边界数据集的抽象表示。无边界意味着无限和持续增长。无边界数据集之所以是无限的,是因为随着时间的推移,新记录会不断加...

东都大狼狗
54分钟前
5
0
Mysql主从复制(拓展博客文章扩充知识面)

#不停库不锁表在线主从配置 使用 Xtrabackup 在线对MySQL做主从复制 1.数据量大的话还是建议使用工具例如xtrabackup,mysqldump比较适合操作10G以下的数据备份复制。 2.做业务之前考虑清楚具...

robertt15
59分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部