使用 gopacket 在 Go 中编写原始 TCP 数据包
您的目标是使用 gopacket 制作自定义 TCP 数据包并通过原始套接字发送它们。但是,您在提供的代码中遇到问题,导致出现以下恐慌:“src IP 127.0.0.1 无效。”
制作自定义 IPv4 数据包
示例您提供的代码还旨在制作自定义 IP 第 3 层标头,这与单独处理 TCP 层不同。这里有一个深入的解释:
在 Go 中创建原始套接字
与某些假设相反,在 Go 中创建原始套接字可以使用 net.ListenPacket、net.DialIP , 或 net.ListenIP:
conn, err := net.ListenIP("ip4:tcp", netaddr)
设置IP 套接字选项
要设置您自己的 IPv4 第 3 层标头,您需要启用名为 IP_HDRINCL 的套接字选项。 Core Go 包不支持此功能,但 ipv4 等第三方库可以提供此功能:
conn, err := ipv4.NewRawConn(network, addr)
此函数建立原始连接并为 IPv4 启用 IP_HDRINCL。
替代方案
对于涉及 TCP 标头的更简单的任务操作时,延迟代码可能适合:
// Create a raw socket fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_TCP)
但是,此方法不允许修改 IPv4 标头。
建议
要使用提供的代码解决您的问题,您需要使用类似的库ipv4 启用 IP_HDRINCL 并设置自定义 IP 标头。或者,您可以探索 latency 包,以获取 TCP 标头操作的简化方法。
以上是如何在 Go 中制作自定义 TCP 数据包并避免'无效的 src IP 127.0.0.1”恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!