go - 如何使用过滤器进行websocket portforward或在golang中保存(以数组形式)转发的数据包?

标签 go

我在github上找到了准备好的源代码,用于golang中的portforwarding

这是代码

package main

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

var localServerHost = "localhost:1020"
var remoteServerHost = "192.168.10.1:1020"

func main() {

ln, err := net.Listen("tcp", localServerHost)
if err != nil {
    log.Fatal(err)
}

log.Println("Port forwarding server up and listening on ", 
localServerHost)

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

    go handleConnection(conn)
 }
}

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

func handleConnection(c net.Conn) {

log.Println("Connection from : ", c.RemoteAddr())

remote, err := net.Dial("tcp", remoteServerHost)
if err != nil {
    log.Fatal(err)
}

log.Println("Connected to ", remoteServerHost)
go forward(c, remote)
go forward(remote, c)
}

我现在不知道如何在用户连接上放置标志,因此我可以从用户连接中读取数据并根据连接标志保存或过滤某些数据包

这是错误的方式吗?

最佳答案

编辑:这是有关转发和过滤TCP的原始答案。此后,@ ermya更改了询问WebSockets的问题。这个答案与现在已经非常不同的问题无关。

您可以通过在io.Copy操作中插入读取器或写入器来过滤流。设置阅读器的方法如下:

type myFilter struct {
    r io.Reader
}

func (f myFilter) Read(p []byte) (int, error) {
    n, err := f.r.Read(p)

    // Do something with p[:n].  As an example, the following for loop shows how 
    // to uppercase ASCII letters.  Replace this for loop with the filtering of 
    // your choice.
    for i, b := range p[:n] {
        if 'a' <= b && b <= 'z' {
           p[i] = b - ('a' - 'A')
        }
    }

    return n, err
}

通过将对go forward(remote, c)的调用替换为:从net.Conn过滤数据:
go func() {
    defer remote.Close()
    defer c.Close()
    io.Copy(remote, myFilter{c})  // interpose the filter here
}()

顺便说一句,forward的命名令人困惑,因为src实际上是目的地,而dest是源。用这个:
func forward(dest, src net.Conn) {
  defer src.Close()
  defer dest.Close()
  io.Copy(dest, src)
}      

关于go - 如何使用过滤器进行websocket portforward或在golang中保存(以数组形式)转发的数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830341/

相关文章:

Golang SSH客户端错误 "unable to authenticate, attempted methods [none publickey], no supported methods remain"

go - 为什么 go 的编译器 "gc"使用与 C 不同的调用约定?

go - 我的 golang 代码有什么问题?

go - 为什么 go-jaeger-client 需要度量和日志的包装器?

Docker - Golang 找不到包

go - 使用 mgo 进行部分更新

go - 在 GoLang 中将 int64 的 Slice 转换为字节数组,反之亦然

sql - 为什么它需要在我的列名周围加上引号?

go - 为什么 map 不返回它的值?

go - 我如何使用 Go 的 os/exec 库将错误消息输入到我的 Go 程序中?