如何使用go语言编写轻量级内网穿透工具

内网穿透工具

因为疫情原因,居家办公,公司又不开放vpn,只能自己搭建一个服务器来进行远程工作。
内网穿透原理其实很简单,难点主要是对于连接池的控制,具体实现代码放到了github中。

github地址:https://github.com/I-ask-Y/tcp-proxy.

一个本地端口转发(代理)的小例子

package main

import (
	"io"
	"log"
	"net"
)

// 进行数据交换
func proxyHandler(proxyConn, localConn net.Conn) {

	defer proxyConn.Close()
	defer localConn.Close()
	ch := make(chan bool)
	go func() {
		buffer := make([]byte, 4096)
		for {
			n, err := proxyConn.Read(buffer)

			if err != nil {
				ch <- true
				if err != io.EOF {
				}
				return
			}
			n, err = localConn.Write(buffer[0:n])
			if err != nil {
				ch <- true
				return
			}
		}
	}()

	go func() {
		buffer2 := make([]byte, 4096)
		for {
			n, err := localConn.Read(buffer2)

			if err != nil {
				ch <- true
				return
			}
			n, err = proxyConn.Write(buffer2[0:n])
			if err != nil {
				ch <- true
				return
			}
		}
	}()

	<-ch
}

func main() {

	// 把本机的3389 端口转发到 33899端口
	proxyListen, err := net.Listen("tcp", "0.0.0.0:33899")
	if err != nil {
		log.Fatalln(err.Error())
	}
	defer proxyListen.Close()

	for {
		proxyConn, err := proxyListen.Accept()
		if err != nil {
			log.Fatalln(err.Error())
		}

		localConn, err := net.Dial("tcp", "127.0.0.1:3389")  // 也可以为其他能访问到的地址端口
		if err != nil {
			log.Fatalln(err.Error())
		}
		go proxyHandler(proxyConn, localConn)
	}
}


版权声明:本文为du159539原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。