【问题标题】:Use raw sockets in Go在 Go 中使用原始套接字
【发布时间】:2013-08-25 09:39:53
【问题描述】:

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

干杯, 萨尔

【问题讨论】:

  • 通过原始套接字,您只是指写入和从套接字写入,对吗?为什么不golang.org/pkg/net
  • 这几天你的尝试和结果是什么?

标签: go raw-sockets


【解决方案1】:

您的建议有很多障碍:

安全

一般来说,能够为数据包设置源 IP 地址可能是一件非常危险的事情。在 linux 下,为了使用自定义标头伪造您自己的 raw DHCP packets,您需要以 root 身份或从带有 CAP_NET_RAW capability 的应用程序运行您的应用程序(请参阅setcap)。

Go 中的原始套接字

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

go.net 子库提供了一个 ipv4 和一个 ipv6 包,前者应该适合您的需要:

http://godoc.org/code.google.com/p/go.net/ipv4#NewRawConn

标题欺骗

您需要使用ipv4.RawConnReadFrom 方法来读取您的源数据包。然后,您应该能够使用这些字段中的大部分以及您的 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 { ... }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2010-09-16
    相关资源
    最近更新 更多