diff --git a/.gitignore b/.gitignore index 90b22a5..fae3afa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ yuchat-proxy-server +go.sum *.exe \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 2720647..fde4dd6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,20 @@ from docker.yuchat.top/golang:1.21-alpine AS builder workdir /app COPY . . -RUN go mod tidy && go build -o yuchat-proxy-server server/main.go +RUN echo "nameserver 114.114.114.114" > /etc/resolv.conf +RUN apk add --no-cache \ + libpcap-dev \ + build-base + +RUN go mod tidy +RUN go build -o yuchat-proxy-server server/main.go from docker.yuchat.top/alpine:3.11 workdir /app expose 8080 - +RUN echo "nameserver 114.114.114.114" > /etc/resolv.conf +RUN apk add --no-cache libpcap copy --from=builder /app/yuchat-proxy-server /app/yuchat-proxy-server entrypoint ["./yuchat-proxy-server"] \ No newline at end of file diff --git a/eth/eth.go b/eth/eth.go new file mode 100644 index 0000000..a533497 --- /dev/null +++ b/eth/eth.go @@ -0,0 +1,54 @@ +package eth + +import ( + "log" + + "github.com/google/gopacket" + "github.com/google/gopacket/pcap" + "github.com/gorilla/websocket" +) + +const ( + interfaceName = "eth0" +) + +type Eth struct { + Handle *pcap.Handle +} + +func Init() *Eth { + handle, err := pcap.OpenLive(interfaceName, 1600, true, pcap.BlockForever) + if err != nil { + log.Fatal("打开驱动器失败: ", err) + return nil + } + return &Eth{Handle: handle} +} + +/** + * 抓取网卡的数据,并写入WebSocket + */ +func (eth *Eth) EthernetPacketsToWs(wsConn *websocket.Conn) error { + + packetSource := gopacket.NewPacketSource(eth.Handle, eth.Handle.LinkType()) + for packet := range packetSource.Packets() { + wsConn.WriteMessage(websocket.BinaryMessage, packet.Data()) + } + return nil +} + +/** + * 将ws的数据写入网卡 + */ +func (eth *Eth) WsToEthernet(wsConn *websocket.Conn) { + for { + _, p, err := wsConn.ReadMessage() + if err != nil { + return + } + err = eth.Handle.WritePacketData(p) + if err != nil { + log.Fatal(err) + } + } +} diff --git a/go.mod b/go.mod index b54a69f..2a25f65 100644 --- a/go.mod +++ b/go.mod @@ -3,3 +3,8 @@ module yuchat-proxy go 1.21.0 require github.com/gorilla/websocket v1.5.3 + +require ( + github.com/google/gopacket v1.1.19 + golang.org/x/sys v0.0.0-20190412213103-97732733099d // indirect +) diff --git a/go.sum b/go.sum deleted file mode 100644 index 25a9fc4..0000000 --- a/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/server/main.go b/server/main.go index 24e4cf6..4cec20a 100644 --- a/server/main.go +++ b/server/main.go @@ -4,17 +4,18 @@ import ( "crypto/tls" "fmt" "log" - "net" "net/http" - "yuchat-proxy/common" "github.com/gorilla/websocket" + + "yuchat-proxy/eth" ) const ( tcpAddress = "172.20.0.1:1080" ) +var e = eth.Init() var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许来自任何来源的连接 @@ -28,25 +29,17 @@ func wsHandler(w http.ResponseWriter, r *http.Request) { fmt.Println("websocket连接失败:", err) return } - remoteConn, err := net.Dial("tcp", tcpAddress) - if err != nil { - log.Printf("本地服务连接失败 %s: %v", tcpAddress, err) - return - } + + // remoteConn, err := net.Dial("tcp", tcpAddress) + // if err != nil { + // log.Printf("本地服务连接失败 %s: %v", tcpAddress, err) + // return + // } fmt.Println("本地服务启动成功", tcpAddress) - - go common.WsToTcpHandler(remoteConn, conn) - go common.TcpToWsHandler(remoteConn, conn) -} - -// HTTP GET 接口,返回 "Hello, World!" -func helloHandler(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) // 设置状态码为 200 OK - w.Header().Set("Content-Type", "text/plain") // 设置响应内容类型 - _, err := w.Write([]byte("Hello, World!")) - if err != nil { - log.Println("Write failed:", err) - } + go e.WsToEthernet(conn) + go e.EthernetPacketsToWs(conn) + // go common.WsToTcpHandler(remoteConn, conn) + // go common.TcpToWsHandler(remoteConn, conn) } func main() { @@ -57,10 +50,8 @@ func main() { }, } http.HandleFunc("/ws", wsHandler) - http.HandleFunc("/hello", helloHandler) fmt.Println("WebSocket服务已启动,地址:ws://localhost:8080/ws") if err := server.ListenAndServe(); err != nil { log.Fatalf("Server failed: %s", err) } - }