我在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/