Golang:使用 ipv4.NewRawConn 创建 TCP 3 路握手

mir*_*tod 10 sockets network-programming tcp go

我正在尝试成功建立 TCP 3 向握手。
\n我希望能够控制 IP 层,最好使用github.com/google/gopacket

\n

这是我的 Go 程序:

\n
package main\n\nimport (\n    "fmt"\n    "log"\n    "net"\n\n    "github.com/google/gopacket"\n    "github.com/google/gopacket/layers"\n    "golang.org/x/net/ipv4"\n)\n\nfunc main() {\n    proto := layers.IPProtocolTCP\n\n    c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", proto), "127.0.0.1")\n    if err != nil {\n        log.Fatal(err)\n    }\n    defer c.Close()\n\n    iprawconn, err := ipv4.NewRawConn(c)\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    tcp := layers.TCP{\n        SrcPort: 43124,\n        DstPort: 2222,\n        SYN:     true,\n        ACK:     false,\n        Window:  65535,\n        Seq:     231,\n    }\n    // payload := []byte{\'a\', \'b\', \'c\', \'\\n\'}\n    options := gopacket.SerializeOptions{\n        // ComputeChecksums: true,\n        FixLengths: true,\n    }\n    buffer := gopacket.NewSerializeBuffer()\n    err = gopacket.SerializeLayers(buffer, options,\n        &tcp,\n        // gopacket.Payload(payload),\n    )\n    if err != nil {\n        fmt.Printf("[-] Serialize error: %s\\n", err.Error())\n        return\n    }\n    b := buffer.Bytes()\n    fmt.Println(b)\n\n    h := &ipv4.Header{\n        Version:  ipv4.Version,\n        Len:      ipv4.HeaderLen,\n        TotalLen: ipv4.HeaderLen + len(b),\n        // ID:       12345,\n        Protocol: int(proto),\n        // Src:      net.ParseIP("192.168.25.1").To4(),\n        Dst: net.ParseIP("127.0.0.1").To4(),\n        TTL: 64,\n    }\n\n    if err := iprawconn.WriteTo(h, b, nil); err != nil {\n        log.Println(err)\n    }\n\n    buf := make([]byte, 1024)\n    for {\n        _, p, _, err := iprawconn.ReadFrom(buf)\n        if err != nil {\n            fmt.Printf("Error reading: %#v\\n", err)\n            return\n        }\n        fmt.Printf("Message received: %s\\n", string(p))\n        fmt.Printf("Message received: %s\\n", string(buf))\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在用着nc -vvln 2222听。

\n

运行我的程序看起来像iprawconn.ReadFrom(buf)从未从服务器读取回复(SYN+ACK)。

\n
\xe2\x9e\x9c  send_packet sudo go run main.go\nPassword:\n[168 116 8 174 0 0 0 231 0 0 0 0 80 2 255 255 0 0 0 0]\n\n\n
Run Code Online (Sandbox Code Playgroud)\n

使用 Wireshark,我看到我的客户端使用 RST 进行回复:\n在此输入图像描述

\n

我究竟做错了什么?
\n谢谢!

\n