Dengan pembangunan berterusan Internet dan promosi berterusan aplikasi, masalah keselamatan rangkaian menjadi semakin serius. Untuk memastikan keselamatan rangkaian, penghantaran data semasa komunikasi rangkaian mesti dilindungi dan disulitkan dengan berkesan. Proses ini melibatkan penghantaran dan pengubahsuaian mesej. Artikel ini akan memperkenalkan cara menukar IP mesej dalam golang.
Golang ialah bahasa pengaturcaraan yang agak baharu yang dialu-alukan secara meluas oleh pembangun kerana kecekapan dan kemudahan penyelenggaraannya. Ia mempunyai sintaks yang serupa dengan bahasa C dan beberapa ciri pengaturcaraan moden, seperti mekanisme pengumpulan sampah, pengaturcaraan serentak dan potongan jenis automatik. Ia telah menjadi lebih mudah dan cekap untuk memproses data rangkaian dan menukar mesej melalui program yang ditulis dalam Golang. Apabila membuat perubahan mesej, kita boleh menggunakan pakej bersih dan pakej os Golang.
Di bawah, kami akan memperkenalkan cara menggunakan Golang untuk menukar IP mesej melalui satu siri demonstrasi kod, yang terutamanya termasuk langkah berikut:
Buat soket Mendengar dan soket penyambung
Sebelum menukar mesej, kita perlu mencipta soket mendengar dan soket penyambung untuk menerima dan menghantar data. Mencipta soket mendengar adalah sangat mudah Anda hanya perlu memanggil fungsi ListenPacket dalam pakej bersih. nombor port dan jenis protokol ke dalam objek alamat UDP, dan kemudian panggil fungsi ListenUDP untuk membuat sambungan soket protokol UDP. Mencipta soket sambungan adalah sama mudah, hanya gunakan fungsi DialUDP dalam kod.
serverAddr, err := net.ResolveUDPAddr("udp", ":" + port) if err != nil { fmt.Printf("ResolveUDPAddr 失败,%v\n", err) return } conn, err := net.ListenUDP("udp", serverAddr) if err != nil { fmt.Printf("ListenUDP 失败,%v\n", err) return } defer conn.Close()
Proses menghuraikan paket data agak rumit. Kita perlu terlebih dahulu menukar paket data yang diterima menjadi paket data IP Ini boleh dicapai dengan memanggil fungsi ParseIPv4Header dan ParseIPv6Header dalam pakej bersih yang mana satu untuk dipilih bergantung pada protokol yang digunakan oleh paket data. Selepas itu, kita perlu menghuraikan port destinasi dan alamat IP dalam paket asal dan menyimpannya dalam struktur baharu. Kodnya adalah seperti berikut:
buffer := make([]byte, 1024) n, addr, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Printf("ReadFromUDP 失败,%v\n", err) return } fmt.Printf("从 %s 接收到 %d 字节的数据\n", addr.String(), n)
Tukar port sasaran dan alamat IP sasaran
ipPacket := &net.IPv4{} if err := ipPacket.Unmarshal(buffer[:n]); err != nil { return } // 解析出源IP地址和目标IP地址 srcIP := ipPacket.SrcIP dstIP := ipPacket.DstIP // 解析出源端口号和目标端口号 srcPort := binary.BigEndian.Uint16(buffer[n-4:n-2]) dstPort := binary.BigEndian.Uint16(buffer[n-2:n]) fmt.Printf("srcIP: %s, srcPort: %d, dstIP: %s, dstPort: %d\n", srcIP, srcPort, dstIP, dstPort)
Enkapsulasi semula paket dan hantar ke hos asal
dstIP = net.ParseIP("127.0.0.1").To4() // 目标IP地址更改为127.0.0.1 dstPort = 8080 // 目标端口号更改为8080
Dalam contoh ini, kami menggunakan pakej gopacket pihak ketiga untuk merangkum semula paket data, yang boleh menjadikan pembinaan dan penghuraian paket data lebih mudah dan cekap. Pada masa yang sama, memandangkan gopacket menyokong kedua-dua protokol IPv4 dan IPv6, kami tidak perlu risau tentang keserasian jenis protokol.
// 构造一个新的IP数据包 newIPPacket := &net.IPv4{ Version: 4, Protocol: ipPacket.Protocol, Src: srcIP, Dst: dstIP, TTL: ipPacket.TTL, } // 构造一个新的UDP数据包 newUDPPacket := &net.UDP{ Src: int(srcPort), Dst: int(dstPort), } // 将UDP数据包和IP数据包合并 payload := gopacket.Payload(buffer[ipPacket.HeaderLen:]) newPacket := gopacket.NewPacket(payload, layers.LayerTypeUDP, gopacket.Default) newPacket.TransportLayer().SetNetworkLayerForChecksum(newIPPacket) newPacket.TransportLayer().SetTransportLayerForChecksum(newUDPPacket) // 构建新的字节切片 newBytes := make([]byte, 0) buf := gopacket.NewSerializeBuffer() err = gopacket.SerializeLayers(buf, gopacket.SerializeOptions{ FixLengths: true, ComputeChecksums: true, }, newPacket.Layer(layers.LayerTypeUDP), gopacket.Payload(buf.Bytes())) if err != nil { fmt.Println(err) return } newBytes = buf.Bytes() // 发送新的数据包 if _, err := conn.WriteToUDP(newBytes, addr); err != nil { return }
Atas ialah kandungan terperinci Bagaimana untuk menukar IP mesej dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!