Springboot2(27)集成netty实现反向代理(内网穿透)

源码地址

springboot2教程系列

其它netty文件有博客

Springboot2(24)集成netty实现http服务(类似SpingMvc的contoller层实现)

Springboot2(25)集成netty实现文件传输

Springboot2(26)集成netty实现websocket通讯

netty实现反向代理(内网穿透)

这里就不贴源码了,主要讲讲如何使用。需要源码可以到码云下载。

一共需要两个服务(proxy-server[服务端],proxy-client[客户端])

proxy-server

配置
---application.yml(文件)
spring.profiles.active: proxyserver

---application-proxyserver.yml(文件)
netty:
   proxy-server:
     enabled: true
     port: 9562
     client-server:
              - port: 8110
                bind: 47.126.126.53:22
                keys: 123
              - port: 8220
                bind: 127.0.0.1:1999
                keys: 123
              - port: 8230
                bind: 47.126.126.53:9050
                keys: 123

netty.proxy-server.port:用来提供给客户端建立连接

netty.proxy-server.client-server: 端口和服务器映射(以8110为例,用户访问8110端口时,会把请求转发给客户端,告诉客户端请求47.126.126.53的22,达到内网穿透的效果)

proxy-client

配置
---application.yml(文件)
spring.profiles.active: proxyclient

---application-proxyclient.yml(文件)
netty:
   proxy-client:
      enabled: true
      proxy-server: 127.0.0.1:9562
      proxy-keys: 123

netty.proxy-client. proxy-server : 为服务端的IP地址和端口(netty.proxy-server.port)

### 使用 DotNetty 实现内网穿透 为了实现内网穿透,通常会采用反向代理或隧道服务的方式。DotNetty 是 .NET 平台上基于 Netty 的异步事件驱动网络应用框架,可以用于构建高性能的 TCP/UDP 客户端和服务端应用程序[^1]。 #### 方法一:通过 WebSocket 隧道实现内网穿透 WebSocket 协议允许客户端与服务器之间建立持久连接并进行双向通信。利用这一特性,可以通过公共互联网上的 WebSocket 服务器作为中介来转发数据包给位于私有网络中的目标设备。 ##### 步骤说明: - 创建一个外部可访问的 WebSocket Server。 - 私有网络内的 Client 连接到此 Websocket server 上注册自己。 - 当外界想要访问内部资源时,则先连到 websocket server 请求转接至指定 client。 ```csharp // WebSocketServer.cs using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; public class WebSocketServer : IDisposable { private TcpListener _listener; public async Task StartAsync(int port) { _listener = new TcpListener(System.Net.IPAddress.Any, port); _listener.Start(); while (true){ var client = await _listener.AcceptTcpClientAsync().ConfigureAwait(false); // Handle each connection on a separate task. _ = Task.Run(() => HandleConnection(client)); } } private void HandleConnection(TcpClient tcpClient) { ... } public void Dispose() { if (_listener != null && _listener.Server.IsBound) _listener.Stop(); } } ``` #### 方法二:使用 STUN/TURN 协议配合 NAT Traversal 技术 STUN 和 TURN 是两种常用的NAT穿越协议。其中 STUN 主要用来获取公网 IP 地址以及检测 NAT 类型;而 TURN 则提供了更可靠的中继机制,在无法直接打洞的情况下也能完成通讯。 对于 C# 开发者来说,可以直接调用第三方库如 `RestSharp` 或 RESTful API 来集成这些功能。 #### 示例代码片段展示如何初始化 DotNetty SocketChannel 及其处理器链路配置: ```csharp var bootstrap = new Bootstrap() .Group(group) .Channel<TcpSocketChannel>() .Option(ChannelOption.TcpNodelay, true) .Handler(new ActionChannelInitializer<ISocketChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; // Add handlers to the pipeline here... pipeline.AddLast("handler", new SimpleChannelInboundHandler<object>()); })); await bootstrap.ConnectAsync(endpoint).ConfigureAwait(false); ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值