Golang实现一个简单的TCP端口转发程序(TCP反向代理)

发布时间:2022年05月04日 // 分类:代码 // 暂无评论

利用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
}

参考资料

本文固定链接
https://www.ywlib.com/archives/a-simple-tcp-reverse-proxy-in-golang.html

标签
golang, tcp端口转发, tcp反向代理

添加新评论 »