内网穿透工具
因为疫情原因,居家办公,公司又不开放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版权协议,转载请附上原文出处链接和本声明。