Java通过socket进行内网穿透简单实现(附源码)


1.需求背景1

  1. ##背景1,如图,需要实现家里电脑能访问公司的Git代码服务器,实现从家里就能提交git代码的目的。
    在这里插入图片描述

1.1需求背景1分析

对于背景1的需求,属于较常用的内网穿透功能,网上有开源的方案如go语言实现的frp,本次为了学习,通过Java的socket编程,进行简单的实现与学习

  1. ##阿里云上的服务器程序与公司某台服务器上的客户端程序启动,首先公司某台服务器与阿里云建立常连接,保持,形成控制用Socket连接,保持连接,建立连接1
    在这里插入图片描述
  2. ##1)家里电脑发起访问,过程如下:
    在这里插入图片描述

2).访问时,主动建立一条与阿里云服务器的Socket连接2
3).阿里云服务器收到请求后,通过连接1转发请求给公司服务器
4).公司服务器收到3转发的请求后,主动发起连接4,建立与Git服务器的连接3
5).步骤4完成后,公司服务器主动再建一条连接4连接阿里云服务器
6).最后在阿里云服务器进行socket连接的绑定关系,连接成功,数据传输时,由连接2->4>3->4>2进行请求与返回

  1. ##通讯完成后关闭连接

7).通信完成后断开所有的数据连接,最后只剩下控制用连接,等待下一次的访问请求。
在这里插入图片描述

1.2需求背景1的java实现部署使用步骤

  1. ##拉取代码
git clone https://github.com/jxlhljh/remotestcpserver_single_sock5.git
或
git clone https://gitee.com/jxlhljh/remotestcpserver_single_sock5.git
  1. ##编绎
maven clean package

编绎成功后在maven项目的target下面会生成lib目录和remotestcpserver_single_sock5.jar,如图
在这里插入图片描述
3. ##启动示例
将lib文件夹和remotestcpserver_single_sock5.jar放在remotestcpserver_single_sock5目录下

3.1 ####场景1:如家里电脑(192.168.0.101)需要访问公司的Git代码服务器(172.168.201.88的8899端口)
注意:以下的均为linux下的部署,命令中采用的是冒号,如果是windows下,改成分号即可
在这里插入图片描述

##服务端,在阿里云服务器103.212.12.74上部署,开启端7000监听
cd remotestcpserver_single_sock5
java -cp "./lib/*:./remotestcpserver_single.jar" cn.gzsendi.stcp.server.StcpServerStart -ssl false -serverPort 7000 -token 123456

##控制端,在公司服务器(172.168.201.148上部署)
cd remotestcpserver_single_sock5
java -cp "./lib/*:./remotestcpserver_single.jar" cn.gzsendi.stcp.control.ControlClientStart -ssl false -token 123456 -trunnelHost 103.212.12.74 -trunnelPort 7000 -groups stcp1 -types tcp -serverFrontPorts 18899 -remoteHosts 172.168.201.88 -remotePorts 8899

##服务端
ssl:是否使用ssl加密码,true是,false否
serverPort: 7000,阿里云服务器的服务监听端口
token:简单的socket通信密码,socket连接上来需要发送这个密码,校验不通过将断开连接

##控制端
ssl:是否使用ssl加密码,true是,false否,需要与服务端的配置保持一致
token:简单的socket通信密码,需要与server的配置一致
trunnelHost:阿里云服务器的Ip,隧道Ip
trunnelPort:阿里云服务器的开放的隧道端口
types:穿透的类型,目前支持取持tcp,sock5两种
serverFrontPorts:这个是阿里云开放的端口,提供给外部网络连接进来使用的,比如18899,这样通过家里电话连接阿里云服务器的Ip和18899端口,就相当于访问内网的git服务器的ip和端口,达到穿透的效果
remoteHosts:远程真实的IP,这里指的就是git服务器的ip
remotePorts:远程真实的port,这里指的就是git代码服务器的端口
groups: 群组名称,进行配置的区分,多个端口转发时,设置多个,用逗号分隔

程序启动后,从家里的电脑通过103.212.12.74的18899端口进行访问,能内网穿透到公司Git代码服务器172.168.201.88的8899。

3.2 ####场景2:sock5透传代理。

##服务端,在阿里云服务器103.212.12.74上部署,开启端7000监听
cd remotestcpserver_single_sock5
java -cp "./lib/*:./remotestcpserver_single.jar" cn.gzsendi.stcp.server.StcpServerStart -ssl false -serverPort 7000 -token 123456

##控制端,在公司服务器(172.168.201.148上部署)
cd remotestcpserver_single_sock5
java -cp "./lib/*:./remotestcpserver_single.jar" cn.gzsendi.stcp.control.ControlClientStart -ssl false -token 123456 -trunnelHost 103.212.12.74 -trunnelPort 7000 -groups stcp1 -types sock5 -serverFrontPorts 1080

控制端:
types:sock5 ,表示使用sock5代理,此时不需要配置remoteHosts和remotePorts

程序启动后,将在103.212.12.74的1080端口开启sock5代理,通过sock5客户端配置后,能访问公司内部的所有机器,相当于在172.168.201.148上访问一样。

3.3 ####场景3:同时开放多端口映射透传

##服务端,在阿里云服务器103.212.12.74上部署,开启端7000监听
cd remotestcpserver_single_sock5
java -cp "./lib/*:./remotestcpserver_single.jar" cn.gzsendi.stcp.server.StcpServerStart -ssl false -serverPort 7000 -token 123456

##控制端,在公司服务器(172.168.201.148上部署)
cd remotestcpserver_single_sock5
java -cp "./lib/*:./remotestcpserver_single.jar" cn.gzsendi.stcp.control.ControlClientStart -ssl false -token 123456 -trunnelHost 103.212.12.74 -trunnelPort 7000 -groups stcp1,stcp2 -types tcp -serverFrontPorts 18899,18080 -remoteHosts 172.168.201.88,172.168.201.10 -remotePorts 8899,8080

groups:这里因为配了2个端口透传因此配置了stcp1,stcp2

程序启动后,将在103.212.12.74上开放2个端口透传

103.212.12.74:18899 ----> 172.168.201.88:8899
103.212.12.74:18080 ----> 172.168.201.88:8080

2.需求背景2

  1. ##背景2,如图,有内网1和内网2,2个内网里面的2台机器如192.168.56.101,172.168.201.20两台,都不能上网,需要实现能互相通信。
    在这里插入图片描述

2.1需求背景2分析

  1. ##阿里云服务器启动服务端程序,内网1和内网2具有上网权限的2台机器启动客户端程序,主动建立连接1,2,并保持,如图
    在这里插入图片描述
  2. ##内网1机器1主动发起访问内网2机器2的访问请求时,过程如下

1).建立连接3,数据由内网1机器1发送请求给内网1机器2
2).内网2机器2建立与阿里云的连接4,并通过连接2转发绑定请求给阿里云
3).阿里云机器通过连接1将步骤2的转发请求转给内网2机器2
4).内网2机器1建立与内网2机器2的连接5
5).连接5建立成功后,内网2机器2主动建立连接6,作为数据传输用通道
6).最后在阿里云服务器进行 3->4>6>5的连接通道绑定,进行数据传输
在这里插入图片描述

  1. ##通信结束后,关闭所有的资源,留下2条控制连接1连接2
    在这里插入图片描述

2.2需求背景2的java实现部署使用步骤

  1. ##拉取代码
git clone https://github.com/jxlhljh/remotestcpserver_sock5.git
或
git clone https://gitee.com/jxlhljh/remotestcpserver_sock5.git
  1. ##编绎
maven clean package
  1. ##启动示例

3.1 ####场景1:通过内网192.168.56.1的18899端口穿透访问172.168.201.20的8899端口如下
在这里插入图片描述

##服务端,在阿里云服务器103.212.12.74上部署,开启端7000监听
cd remotestcpserver_sock5
java -cp "./lib/*:./remotestcpserver_sock5.jar" cn.gzsendi.stcp.server.StcpServerStart -ssl false -serverPort 7000 -token 123456

##控制端,在内网2机器1172.168.201.11)上部署
cd remotestcpserver_sock5
java -server -Xmx256m -Xms256m -Xmn128m -cp "./lib/*:./remotestcpserver_sock5.jar" cn.gzsendi.stcp.control.ControlClientStart -ssl false -token 123456 -trunnelHost 103.212.12.74 -trunnelPort 7000 -groups stcp1 -types tcp -remoteHosts 172.168.201.20 -remotePorts 8899

##访问端,在内网1机器2192.168.56.1)上部署
cd remotestcpserver_sock5
java -server -Xmx128m -Xms64m -Xmn64m -cp "./lib/*;./remotestcpserver_sock5.jar" cn.gzsendi.stcp.visitor.VisitorCliStart -ssl false -token 123456 -trunnelHost 103.212.12.74 -trunnelPort 7000 -groups stcp1 -frontPorts 18899

程序启动后,在内网1访问192.168.56.1的18899相当于访问内网2的172.168.201.20的8899端口

3.源码下载(v1.0版本)

场景1源码:
github:https://github.com/jxlhljh/remotestcpserver_single_sock5.git
gitee:https://gitee.com/jxlhljh/remotestcpserver_single_sock5.git

场景2源码:
github:https://github.com/jxlhljh/remotestcpserver_sock5.git
gitee:https://gitee.com/jxlhljh/remotestcpserver_sock5.git

4.新增:配置调整支持yml改造(v1.1版本,最新的master)

v1.0版本的代码由于只能通过命令行进行设置,有时觉得也不太方便,因此
现在将配置同步调整成同时支持在yml中配置(默认使用yml配置,也可以通过命令行参数修改)

yml配置启动的话就简单的了,直接通过Main主类启动即可,会自动读取yml中的配置,详细配置见源码

4.1需求背景1启动

##Server端:
java -cp ".:./lib/*:./remotestcpserver_single_sock5.jar" cn.gzsendi.stcp.server.StcpServerStart

##ControlClient端:
java -cp ".:./lib/*:./remotestcpserver_single_sock5.jar" cn.gzsendi.stcp.control.ControlClientStart

4.2需求背景2启动

##Server端:
java -cp ".:./lib/*:./remotestcpserver_sock5.jar" cn.gzsendi.stcp.server.StcpServerStart

##ControlClient端:
java -cp ".:./lib/*:./remotestcpserver_sock5.jar" cn.gzsendi.stcp.control.ControlClientStart

##VisitorCli端:
java -cp ".:./lib/*:./remotestcpserver_sock5.jar" cn.gzsendi.stcp.visitor.VisitorCliStart


  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值