利用Golang强大的net库,可以轻松实现一个简单的TCP端口转发程序(TCP反向代理)。
package main
import (
"fmt"
"io"
"net"
)
var (
serverAddr = "127.0.0.1:80" // 目标服务器地址
proxyAddr = ":8081" // 本地代理监听地址
)
func main() {
go ListenRemoteClient()
shutdown := make(chan struct{})
<-shutdown
}
func ListenRemoteClient() {
ln, err := net.Listen("tcp", proxyAddr)
if err != nil {
fmt.Println("本地监听端口时异常", err)
}
for {
clientConn, err := ln.Accept()
if err != nil {
fmt.Println("建立与客户端连接时异常", err)
return
}
go connectPipe(clientConn)
}
}
func connectPipe(clientConn net.Conn) {
serverConn, err := net.Dial("tcp", serverAddr)
if err != nil {
fmt.Println("建立与服务端连接时异常", err)
_ = clientConn.Close()
return
}
pipe(clientConn, serverConn)
}
func pipe(src net.Conn, dest net.Conn) {
errChan := make(chan error, 1)
onClose := func(err error) {
_ = dest.Close()
_ = src.Close()
}
go func() {
_, err := io.Copy(src, dest)
errChan <- err
onClose(err)
}()
go func() {
_, err := io.Copy(dest, src)
errChan <- err
onClose(err)
}()
<-errChan
}
参考资料
- <frp源码> https://github.com/fatedier/frp/blob/dev/pkg/util/vhost/reverseproxy.go
- <100行代码实现一个高性能网络转发小工具> https://segmentfault.com/a/1190000039665863
本文固定链接
https://www.ywlib.com/archives/a-simple-tcp-reverse-proxy-in-golang.html