Golang: как воспроизвести данные net.Dial (Перехват данных прокси TCP)? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать TCP-прокси / маршрутизатор, мне нужно перехватить некоторые данные запроса, чтобы шаблон соответствовал правилу маршрутизации.

Но я немного новичок в Голанге. Теперь переадресация портов работает, но когда я пытаюсь прочитать входящий запрос, я не могу воспроизвести входящие данные на удаленный порт.

Блок с комментариями находится там, где он выходит из строя.

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)
}

Может кто-нибудь указать мне направление?

...