java-proxy 内网穿透搭建使用

本文详细介绍了如何在Linux环境下搭建和配置proxy内网穿透服务,包括服务器端和客户端的安装、配置文件设置、端口开放以及启动步骤。通过此教程,你可以实现公网访问内网服务,并进行在线管理。

proxy 内网穿透搭建使用

安装教程

github源码位置

本次需要的安装包不包含jdk

链接:https://pan.baidu.com/s/1RDKIqhHHO5Augt5ethsGew
提取码:4545

1.安装代理服务端

  • 安装java1.7或以上环境
1.1proxy-server-0.1目录结构
\bin
    |_startup.bat
    |_startup.sh
    |_stop.sh
\conf
    |_config.properties
    |_log4j.properties
    |_test.jks
\lib
    |_gson-2.7.jar
    |_hamcrest-core-1.3.jar
    |_junit-4.12.jar
    |_log4j-1.2.17.jar
    |_netty-all-4.0.36.Final.jar
    |_proxy-common-0.1.jar
    |_proxy-protocol-0.1.jar
    |_proxy-server-0.1.jar
    |_slf4j-api-1.7.5.jar
    |_slf4j-log4j12-1.7.5.jar
\webpages
    |_pages
1.2将proxy-server-0.1上传到服务器任意目录
[root proxy-server-0.1]# ls
bin  conf  lib  logs  webpages
[root bin]# ls
startup.bat  startup.sh  stop.sh
[root bin]# chmod u+x *.sh
# 开启防火墙端口 没有使用nginx代理
firewall-cmd --zone=public --add-port=8090/tcp --permanent
firewall-cmd --zone=public --add-port=4900/tcp --permanent
firewall-cmd --reload
1.3server配置config.properties
server.bind=0.0.0.0
#与代理客户端通信端口
server.port=4900
#ssl相关配置
server.ssl.enable=true
server.ssl.bind=0.0.0.0
server.ssl.port=4993
server.ssl.jksPath=busl.jks
server.ssl.keyStorePassword=123456
server.ssl.keyManagerPassword=123456
#这个配置可以忽略
server.ssl.needsClientAuth=false
#WEB在线配置管理相关信息
config.server.bind=0.0.0.0
# 服务端访问端口
config.server.port=8090
# 服务端用户名
config.admin.username=admin
# 服务端密码
config.admin.password=admin
  • linux(mac)环境中运行bin目录下的 startup.sh
  • windows环境中运行bin目录下的 startup.bat
ps:要有jdk环境
[root bin]# ./startup.sh 
Starting the proxy server ...started
PID: 14126

访问ip:8090 登录到控制台

配置客户端

在这里插入图片描述

访问公网9000代理到客户端的8080端口

服务端配置完成

2.安装代理客户端

  • 安装java1.7或以上环境

proxy-client-0.1

配置文件在conf目录中, config.properties

#与在proxy-server配置后台创建客户端时填写的秘钥保持一致;
client.key=
ssl.enable=false
ssl.jksPath=test.jks
ssl.keyStorePassword=123456

#公网服务器ip或者域名
server.host=lp.thingsglobal.org

#proxy-server ssl默认端口4993,默认普通端口4900
#ssl.enable=true时这里填写ssl端口,ssl.enable=false时这里填写普通端口
server.port=4900
  • linux(mac)环境中运行bin目录下的 startup.sh
  • windows环境中运行bin目录下的 startup.bat
### Java 实现内网穿透的解决方案 #### 背景概述 内网穿透是一种技术手段,用于让外部网络能够访问位于局域网内部的服务。通过建立反向代理或其他通信机制,可以绕过防火墙或路由器的限制[^1]。 #### 技术选型 为了实现基于Java内网穿透解决方案,通常可以选择以下几种方式之一: 1. **自定义Socket通信**:利用TCP/IP协议栈手动创建连接并转发数据流。 2. **第三方库集成**:借助成熟的开源框架(如Netty)来简化开发过程。 3. **现有工具扩展**:结合现有的内网穿透工具(如Ngrok、FRP),并通过Java程序控制其行为。 --- #### 方案一:基于Netty的手动实现 以下是使用Netty框架的一个基本示例代码片段: ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; public class NettyTunnelServer { private final int port; public NettyTunnelServer(int port) { this.port = port; } public void start() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { // 添加处理器逻辑 } }); ChannelFuture f = b.bind(port).sync(); // 绑定端口 System.out.println("Netty Tunnel Server started on port " + port); f.channel().closeFuture().sync(); // 阻塞等待关闭 } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { new NettyTunnelServer(8080).start(); } } ``` 此代码展示了如何设置一个简单的服务器监听器,并可进一步扩展为支持双向隧道的功能。 --- #### 方案二:与Spring Boot结合的应用实例 如果希望快速搭建一个带有API接口的Web服务,则可以采用Spring Boot作为基础架构。下面展示了一个完整的项目结构以及核心组件设计方法[^3]。 ##### Maven依赖配置 首先,在`pom.xml`文件中引入必要的依赖项: ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Netty Integration (Optional) --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.79.Final</version> </dependency> </dependencies> ``` ##### 主类入口 启动应用程序时加载所有模块和服务资源: ```java @SpringBootApplication public class ApplicationStarter { public static void main(String[] args) { SpringApplication.run(ApplicationStarter.class, args); } } ``` ##### 数据传输控制器 提供对外暴露的数据交互路径: ```java @RestController @RequestMapping("/tunnel") public class TunnelController { @PostMapping("/connect") public ResponseEntity<String> connect(@RequestBody Map<String, Object> requestParams) { String targetHost = (String) requestParams.get("target_host"); Integer targetPort = ((Number) requestParams.get("target_port")).intValue(); // TODO: Implement tunnel establishment logic here. return ResponseEntity.ok("Connection established to " + targetHost + ":" + targetPort); } } ``` 以上代码允许客户端发送POST请求指定目标主机及其开放端口号,从而触发相应的处理流程[^3]。 --- #### XML配置案例解析 对于某些场景可能还需要额外定义一些静态参数或者描述信息,这时就可以考虑运用类似于如下所示形式的XML文档来进行管理[^2]: ```xml <configuration> <server> <address>localhost</address> <port>8080</port> </server> <proxy-settings> <enabled>true</enabled> <protocol>kcp</protocol> <timeout>5000ms</timeout> </proxy-settings> </configuration> ``` 这种做法特别适合于那些需要频繁调整环境变量而又不想每次都修改源码的情况之下。 --- ### 注意事项 - 安全性考量至关重要,务必实施身份验证措施防止未授权访问; - 对流量加密保护以防敏感资料泄露风险增加; - 测试阶段应充分考虑到不同操作系统平台之间的兼容差异问题;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值