Golang:如何重播net.Dial数据(拦截TCP代理数据)?

时间:2019-01-09 10:20:05

标签: tcp proxy portforwarding

我正在尝试制作一个TCP代理/路由器,我需要拦截一些请求数据以便与路由规则进行模式匹配。

但是我对Golang有点陌生。现在,端口转发可以了,但是当我尝试读取传入的请求时,无法将传入的数据重播到远程端口。

注释的块是它失败的地方。

package main

import (
    "fmt"
    "io"
    "net"
    "os"
)

func main() {
    fmt.Println(os.Args)
    if len(os.Args) != 4 {
        fmt.Println("prog listen_port remote_host, remote_port")
        os.Exit(3)

        }
    listen_port := os.Args[1]
    rmt_host := os.Args[2]
    rmt_port := os.Args[3]
    fmt.Println("localhost:" +  listen_port + "  -> " + rmt_host+":"+rmt_port)
    ln, err := net.Listen("tcp", ":"+listen_port)
    if err != nil {
        panic(err)
    }

    for {
        conn, err := ln.Accept()
        if err != nil {
            panic(err)
        }

        go handleRequest(conn, rmt_host, rmt_port)
    }
}

func handleRequest(conn net.Conn, rmt_host string, rmt_port string) {

    proxy, err := net.Dial("tcp", rmt_host+":"+rmt_port)
    if err != nil {
        panic(err)
    }

/* //enable this part = fails, able to read the request, but not replay it.
    buffer := make([]byte, 60000)
    conn.Read(buffer)
    s := string(buffer)
    fmt.Println(s)
*/

    go copyIO(conn, proxy) 
    go copyIO(proxy, conn)
}

func copyIO(src, dest net.Conn) {
    defer src.Close()
    defer dest.Close()
    io.Copy(src, dest)
}

有人可以给我指明方向吗?

0 个答案:

没有答案