我想知道,是否可以通过 websockets 协议传输/隧道 TCP 连接?
有一个websockets 包,似乎我可以将 TCP 连接 io.copy 到 websockets 连接中,但我不知道如何在另一端将其重新组装为 TCPConn。
例如,我想在一端创建一个 socks5 ServerN(在 NAT 后面),在另一端创建一个 ServerIE。互联网用户会向 ServerIE 发出socks5 请求(通过socks5 协议),ServerIE 会通过websocket 连接将socks5 请求发送到ServerNAT。ServerNAT 然后将处理socks5 请求(即它是socks5 服务器)。
编辑: 我写了一些代码,但不幸的是它在从 TCP 连接读取到 WS 时卡住了。运行它:go run main.go -logtostderr
package main
import (
"flag"
log "github.com/golang/glog"
"golang.org/x/net/websocket"
"bufio"
"net"
"net/http"
"time"
// "io"
)
func main() {
flag.Parse()
defer log.Flush()
log.Infof("wsServer()")
wsCh := wsServer()
log.Infof("wsNAT()")
natWS, err := wsNAT()
if err != nil {
log.Error(err)
return
}
done := make(chan struct{}, 1)
log.Infof("listenTCP()")
conn := listenTCP()
buf := bufio.NewReader(conn)
go func() {
log.Infof("Write TCP to WS")
n, err := buf.WriteTo(natWS)
if err != nil {
log.Fatal(err)
return
}
log.Infof("newConn.ws.ReadFrom(conn) %v", n)
close(done)
}()
wsToTCP(<- wsCh)
<-done
}
// wsNAT dials /ws endpoint and returns a websocket connection.
func wsNAT() (*websocket.Conn, error) {
time.Sleep(1 * time.Second)
origin := "http://localhost/"
url := "ws://localhost:12345/ws"
return websocket.Dial(url, "", origin)
}
// wsServer returns the websocket
// connections received on /ws endpoint
func wsServer() chan *websocket.Conn {
wsCh := make(chan *websocket.Conn, 1)
http.Handle("/ws", websocket.Handler(func(ws *websocket.Conn) {
wsCh <- ws
time.Sleep(1 *time.Hour)
}))
go func() {
err := http.ListenAndServe(":12345", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}()
return wsCh
}
要触发 TCP 侦听器,您可以在端口 8080 上发出请求(例如curl --socks5 localhost:8080 google.com -v或curl localhost:8080 -v)
相关分类