我正在尝试编写一个程序,该程序接收 DHCP 发现 (UDP),并根据 DHCP 数据包中特定字段 (GIADDR) 的内容,使用不同的源 IP 地址将它们转发到给定的 IP 地址。
我可以开始处理接收和发送位,但在使用本地计算机上未配置的 IP 地址的任何内容作为 IP 源地址时遇到问题。
我相信这只能使用原始套接字来完成;真的吗 ?
有没有关于如何在 Go 中做到这一点的示例?
我花了几天时间环顾四周,但找不到太多东西。
干杯,
萨尔
您的提议有许多障碍需要克服:
Security
一般来说,从安全角度来说,为数据包设置源 IP 地址可能是一件非常危险的事情。 linux下,为了打造自己的raw DHCP packets使用自定义标头,您将需要以 root 身份运行您的应用程序,或者从具有以下命令的应用程序运行您的应用程序:CAP_NET_RAW 能力 (see setcap).
Go 中的原始套接字
标准网络库不提供原始套接字功能,因为它非常专业,并且随着人们开始愤怒地使用它,API 可能会发生变化。
The go.netsubrepository 提供了 ipv4 和 ipv6 包,前者应该适合您的需求:
http://godoc.org/code.google.com/p/go.net/ipv4#NewRawConn
标头欺骗
您将需要使用ipv4.RawConn's ReadFrom读取源数据包的方法。然后,您应该能够使用其中的大部分字段以及 GIADDR 逻辑来设置WriteTo称呼。它可能看起来像这样:
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 { ... }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)