在Go中使用原始套接字

在Go中使用原始套接字,go,raw-sockets,Go,Raw Sockets,我试图编写一个程序,接收DHCP发现(UDP),并根据DHCP数据包中特定字段(GIADDR)的内容,使用不同的源IP地址将它们转发到给定的IP地址。 我可以开始处理接收和发送位,但我在使用任何未在本地计算机上配置的IP地址作为IP源地址时遇到问题。 我相信这只能通过使用原始套接字来实现;这是真的吗? 有没有关于如何在围棋中做到这一点的例子? 我花了几天时间四处看看,但没找到什么 干杯, Sal你的建议有许多障碍需要跨越: 安全 一般来说,能够为数据包设置源IP地址在安全方面可能是一件非常危险的

我试图编写一个程序,接收DHCP发现(UDP),并根据DHCP数据包中特定字段(GIADDR)的内容,使用不同的源IP地址将它们转发到给定的IP地址。 我可以开始处理接收和发送位,但我在使用任何未在本地计算机上配置的IP地址作为IP源地址时遇到问题。 我相信这只能通过使用原始套接字来实现;这是真的吗? 有没有关于如何在围棋中做到这一点的例子? 我花了几天时间四处看看,但没找到什么

干杯,
Sal

你的建议有许多障碍需要跨越:

安全 一般来说,能够为数据包设置源IP地址在安全方面可能是一件非常危险的事情。在linux下,为了使用自定义头构建自己的应用程序,您需要以root用户身份运行应用程序,或者从具有的应用程序运行应用程序(请参阅)

Go中的原始套接字 标准网络库不提供原始套接字功能,因为它非常专业化,而且随着人们开始愤怒地使用它,API可能会发生变化

子存储库提供ipv4和ipv6包,前者应满足您的需要:

报头欺骗 您需要使用的方法来读取源数据包。然后,您应该能够使用这些字段中的大部分以及GIADDR逻辑来设置调用的头。它可能看起来像:

for {
  hdr, payload, _, err := conn.ReadFrom(buf)
  if err != nil { ... }
  hdr.ID = 0
  hdr.Checksum = 0
  hdr.Src = ...
  hdr.Dst = ...
  if err := conn.WriteTo(hdr, payload, nil); err != nil { ... }
}

所谓原始套接字,就是指在套接字之间进行写操作,对吗?为什么不呢?你在这几天的努力和结果是什么?