在 Go 中使用原始套接字

2023-11-25

我正在尝试编写一个程序,该程序接收 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(使用前将#替换为@)

在 Go 中使用原始套接字 的相关文章

  • 模板中的 bson.ObjectId

    我有一个具有 bson ObjectId 类型的结构 例如如下所示 type Test struct Id bson ObjectId Name string Foo string 我想在 html 模板中呈现它 Name Food a h
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 为什么 Go 禁止取 (&) 映射成员的地址,却允许取 (&) 切片元素?

    Go 不允许获取地图成员的地址 if I do this p mm abc Syntax Error cannot take the address of mm abc 理由是 如果 Go 允许使用此地址 那么当地图后台存储增长或缩小时 该
  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 如何在golang中创建一个充满“000000...”数据的10MB文件?

    我打算在日志或磁盘队列等系统中使用 fdatasync 首先是在 ext4 等文件系统中创建一个带有 000000 的 10MB 文件 但我不知道如何正确地做到这一点 jnml fsc r630 src tmp SO 16797380 ls
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • 在 Gorilla Mux 中嵌套子路由器

    我一直在使用gorilla mux https github com gorilla mux满足我的路由需求 但我注意到一个问题 当我嵌套多个子路由器时它不起作用 这是示例 func main r mux NewRouter StrictS
  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • 与通道相比,sync.WaitGroup 的优势是什么?

    我正在开发一个并发 Go 库 我偶然发现了 goroutine 之间两种不同的同步模式 其结果相似 等待组 https play golang org p ZYPLlcp16TZ package main import fmt sync t
  • golang无法启动调试,显示未找到框架CoreFoundation

    我使用的是 Macbook pro m1 在数据迁移或更新到 monterey 后 不确定是什么原因导致的 golang 似乎无法调试或 go list 编译 我尝试重新安装 更新 golang 结果是一样的 Go版本 1 17 3 dar
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • 指针上定义的方法仍然可以用值调用

    Effective Go 文档说明如下 关于接收者的指针与值的规则是 可以在指针和值上调用值方法 但只能在指针上调用指针方法 http tip golang org doc effective go html pointers vs val
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • json.Unmarshal json字符串到对象是空结果[重复]

    这个问题在这里已经有答案了 我有一个非常简单的程序 如下所示 package main import encoding json fmt type RunCommand struct level string json level call
  • 如何将长 Go 模板函数拆分为多行?

    我有一个很长的printf调用 Go 模板 例子 printf mongodb s s s s authSource admin replicaSet s readPreference nearest w majority Values r

随机推荐

  • 将“物品”平均分配到桶中(尽最大努力)

    说我要分发y项目到x桶均匀 如果x是的倍数y这个分布将是均匀的 如果不是 我最终会得到0每个桶中的物品 例如 例如 我有3桶 我想分配2每个项目 自从做了分工 2 3 将导致0每个桶的物品 我怎样才能实现 分布1 1 0 这种思维方式应该有
  • 如何判断一个方法中调用了哪些方法?

    我想列出从特定方法调用的所有方法 例如 如果我有以下代码 public void test1 test2 test3 该列表应包含 test2 和 test3 如果可以列出同一类的方法以及另一个类的方法 那就太好了 另外 我想找到一种方法来
  • C#/Excel:解决图表上的最大系列大小

    我需要帮助以编程方式绘制比单个 Excel 系列所能容纳的更多点 根据http office microsoft com en us excel HP100738491033 aspxExcel 2007 图表上可显示的最大点数为 2560
  • Android 中的多级 ExpandableListView

    我正在尝试从给定的未知大小或级别的类别列表创建类别树 所以我试图创建一个通用的可扩展列表 其中可以包含 2 个以上的级别 总体思路是在其布局中向每个有子级的子级添加另一个 ExpandableListView 问题是第二个级别无法打开 看起
  • 在 @PostConstruct 期间使用 @Cacheable 的 Spring 缓存不起作用

    与spring框架中的commit相关https github com spring projects spring framework commit 5aefcc802ef05abc51bbfbeb4a78b3032ff9eee3 初始化
  • Spring Security 3.0.2 的 OpenId 身份验证和自动注册

    我正在使用 spring security 3 0 2 和 OpenId 登录和注册来实现一个应用程序 我可以成功登录 但如果用户未注册 我想要执行以下操作 1 获取一些 OpenId 属性 例如电子邮件和姓名 2 向用户显示仅包含这两个字
  • 如何列出 MySQL 中缓存的查询? (Qcache_queries_in_cache)

    显示 Qcache queries in cache 等状态返回 Variable name Value Qcache queries in cache 327 如何打印这些 327 查询 为了优化 mysql 缓存 我想尝试切换到 按需
  • 如何在 Scala 2.9.0 中实现 Hadoop Mapper?

    当我从 2 8 1 迁移到 Scala 2 9 0 时 除了 Hadoop 映射器之外 所有代码都可以正常运行 因为我有一些包装对象 所以我总结为以下示例 import org apache hadoop mapreduce Mapper
  • 如何在 Java 中对二维数组进行深层复制?

    我刚刚使用了一点 clone 在我的第二天booleanarray 认为这是一个深拷贝 我怎样才能执行我的深度复制boolean array 我应该循环它并做一系列System arraycopy s 是的 您应该迭代二维布尔数组才能深度复
  • 扩展方法如何工作?

    我想在 Unity3d 中为 Vector3 类创建一个扩展方法 但我似乎不太明白 这就是我所拥有的 public static class ExtensionMethods public static Vector3 MaxValue t
  • 如何检查是否安装了特定的 MSI?

    我正在编写一个 powershell 脚本 它将为我的 web 应用程序安装一些依赖项 在我的脚本中 我遇到了一个反复出现的问题 即检查是否安装了特定应用程序 似乎有一种独特的方法来检查每个应用程序是否存在应用程序 即 通过检查 c 上此文
  • 使用 gettext 翻译 R 脚本

    是否可以使用 gettext 之类的东西来翻译 R 脚本 如果是这样 怎么办 如果没有 我还有什么其他选择 您可以使用base gettext ngettext base bindtextdomain 和tools xgettext2pot
  • 编辑开始时更改 UITextField 背景

    我想在 UITextField 成为第一个响应者时更改其背景图像 以向用户显示它具有焦点 类似于 CSS 中的 active 或 focus 伪类 我猜我可能需要以编程方式执行此操作 因此 非常感谢任何帮助 Giles 恕我直言 最干净的方
  • 在函数中操作多维数组

    我在这里读了很多东西并尝试了很多 但我找不到一种方法将多维数组传递给 C 中的函数 更改一些值并以某种方式返回新数组 找到一种方法将该数组进一步传递给另一个函数并执行相同的操作非常重要 我想找到一种将数组传递给函数的方法 然后将其从第一个函
  • 为什么我不能改变自我价值?

    为什么我可以这样改变 自我 self map x x 2 或者这样 self replace self map x x 2 但不是这样 self self map x x 2 为什么 Ruby 不允许我更改 self 变量指向的对象 但允许
  • 最小起订量 你如何测试内部方法?

    我的老板告诉我使用起订量 就是这样 我喜欢它 但似乎与 MSTest 或 mbunit 等不同 你无法测试内部方法 所以我被迫在我的界面中公开一些内部实现 以便我可以测试它 我错过了什么吗 您可以使用 Moq 测试内部方法吗 多谢 您可以使
  • Yii2 QueryBuilder 更新与连接

    我有以下原始 SQL 查询 UPDATE pay audit JOIN invoice items ON invoice items mdn pay audit account id AND invoice items unitprice
  • 登录时未从 Facebook API 获取电子邮件

    我在登录时遇到问题 即使将电子邮件添加到用户和朋友权限 对于某些 Facebook 帐户 我也无法收到电子邮件 我正在使用 facebook php sdk 这是我使用的代码 facebook user profile facebook g
  • 插件 ID 包含无效的字符“:”(仅 ASCII 字母数字字符、“.”、“_”和“-”字符是有效的 JETPACK COMPOSE

    我想在我的 android 项目中安装 jetpack compose 我正在遵循这个指南 https developer android com jetpack compose interop adding 但是当我尝试同步项目时 我的
  • 在 Go 中使用原始套接字

    我正在尝试编写一个程序 该程序接收 DHCP 发现 UDP 并根据 DHCP 数据包中特定字段 GIADDR 的内容 使用不同的源 IP 地址将它们转发到给定的 IP 地址 我可以开始处理接收和发送位 但在使用本地计算机上未配置的 IP 地