go安全开发(二)实现tcp代理

2年前 (2022) 程序员胖胖胖虎阿
190 0 0

git地址

假设 用户和dst不通,但是部署这个服务的设备和dst通,将这台设备收到的内容发送给dst,将dst返回的内容,返回给客户

  1. 用到的go基础库

    • net.Listen 和listener.Accept 建立本地的tcp连接
    • net.Dail() 向远端发起tcp请求
package main

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

const dst_host = "www.baidu.com:80"

// 假设 用户和dst不通,但是部署这个服务的设备和dst通,将这台设备收到的内容发送给dst,将dst返回的内容,返回给客户

func main() {
    listener, err := net.Listen("tcp", ":80")
    if err != nil {
        log.Fatal("错误", err)
    }

    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Fatalln("accept出错", err)
        }
        handler(conn)
    }
}

func handler(src net.Conn) {
    dst, err := net.Dial("tcp", dst_host)
    if err != nil {
        log.Fatalln("连接出错", err)
    }
    defer dst.Close()

    // 防止阻塞,使用协程
    go func() {
        // 将源的内容发送给dst
        _, err := io.Copy(dst, src)
        if err != nil {
            log.Fatalln("源到目的copy出错", err)
        }
    }()

    _, err = io.Copy(src, dst)

    if err != nil {
        log.Fatalln("目的到源copy出错", err)
    }
}
版权声明:程序员胖胖胖虎阿 发表于 2022年10月10日 下午12:56。
转载请注明:go安全开发(二)实现tcp代理 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...