Tôi muốn thực hiện một số thử nghiệm với các gói TCP. Do đó, tôi đang sử dụng gopacket (v1.1.19) để tạo các gói và gửi chúng lên một giao diện.
Tôi có mã này để tạo gói SYN và đặt nó vào vòng lặp lại và gửi tới 127.0.0.1:8888 nơi tôi có máy chủ ncat đang lắng nghe (ncat -v -l 127.0.0.1 8888
).
Tôi có thể thấy gói của mình trên Wireshark như mong đợi nhưng không có gói SYN/ACK nào được gửi bởi máy chủ. Gọi localhost:8888 từ trình duyệt hoạt động hoàn toàn tốt. Và tôi đã tạo gói của mình giống với gói do trình duyệt gửi (tổng kiểm tra, dấu thời gian và cổng có nguyên nhân khác nhau).
Có ai đó biết vấn đề của tôi là gì hoặc tôi có thể xem xét điều gì không?
gói chính
nhập khẩu (
"mã hóa/nhị phân"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
"nhật ký"
"toán/rand"
"bọc lưới"
"thời gian"
)
biến (
chuỗi thiết bị = "lo"
snapshotLen int32 = 1024
lăng nhăng bool = sai
lỗi sai
timeout time.Duration = 30 * time.Second
xử lý *pcap.Handle
bộ đệm gopacket.SerializeBuffer
tùy chọn gopacket.SerializeOptions= gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}
ethernetLayer layer.Ethernet = layer.Ethernet{
SrcMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
DstMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
Loại Ethernet: lớp.EthernetTypeIPv4,
}
lớp ipLayer.IPv4 = lớp.IPv4{
Phiên bản: 4,
SrcIP: net.IP{127, 0, 0, 1},
DstIP: net.IP{127,0,0,1},
Giao thức: layer.IPProtocolTCP,
TTL: 64,
FragOffset: 0,
Cờ: layer.IPv4DontFragment,
}
)
func syn() []byte {
Rand.Seed(time.Now().UnixMilli())
bộ đệm = gopacket.NewSerializeBuffer()
tùy chọn1 := layer.TCPOption{layers.TCPOptionKindWindowScale, 3,[]byte{7} }
bs := make([]byte, 2)
nhị phân.BigEndian.PutUint16(bs,56495)
tùy chọn2 := layer.TCPOption{layers.TCPOptionKindMSS, 0, bs }
bsTsval := make([]byte,4)
bsTsecr := make([]byte,4)
binary.BigEndian.PutUint32(bsTsval,uint32(time.Now().UnixMilli()))
bsTime := append(bsTsval, bsTsecr...)
tùy chọn3 := layer.TCPOption{layers.TCPOptionKindTimestamps,0, bsTime}
tcpLayerSYN := &layers.TCP{
SrcPort: layer.TCPPort(rand.Intn(0xffff-1)+1 ),
DstPort: lớp.TCPPort(8888),
TỔNG HỢP: đúng,
Thứ tự: rand.Uint32(),
Cửa sổ: 65495,
Tùy chọn: []layers.TCPOption{option1, option2, option3},
}
tcpLayerSYN.SetNetworkLayerForChecksum(&ipLayer)
// Và tạo gói với các lớp
bộ đệm = gopacket.NewSerializeBuffer()
gopacket.SerializeLayers(bộ đệm, tùy chọn,
&lớp ethernet,
&ipLayer,
tcpLayerSYN,
)
gói gửi đi := buffer.Bytes()
trả lại gói gửi đi
}
hàm chính () {
// Mở thiết bị
xử lý, err = pcap.OpenLive(thiết bị, snapshotLen, lăng nhăng, hết thời gian)
if err != nil {log.Fatal(err) }
trì hoãn xử lý.Close()
err = handle.WritePacketData(syn())
}