使用 gopacket 发送 UDP 数据包到 127.0.0.1

2023-12-19

我正在尝试使用 gopacket 将 UDP 数据包发送到 127.0.0.1。这是我的代码:

package main

import (
    "fmt"
    "net"

    "github.com/google/gopacket"
    "github.com/google/gopacket/layers"
    "github.com/google/gopacket/pcap"
)

func main() {
    handle, err := pcap.OpenLive("lo", 1500, false, pcap.BlockForever)
    if err != nil {
        fmt.Printf("%s\n", err.Error())
        return
    }

    eth := layers.Ethernet{
        EthernetType: layers.EthernetTypeIPv4,
        SrcMAC:       net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
        DstMAC:       net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    }

    ip := layers.IPv4{
        Version:  4,
        TTL:      64,
        SrcIP:    net.IP{127, 0, 0, 1},
        DstIP:    net.IP{127, 0, 0, 1},
        Protocol: layers.IPProtocolUDP,
    }

    udp := layers.UDP{
        SrcPort: 62003,
        DstPort: 8080,
    }
    udp.SetNetworkLayerForChecksum(&ip)

    payload := []byte{'a', 'b', 'c', '\n'}

    options := gopacket.SerializeOptions{
        ComputeChecksums: true,
        FixLengths:       true,
    }

    buffer := gopacket.NewSerializeBuffer()

    err = gopacket.SerializeLayers(buffer, options,
        &eth,
        &ip,
        &udp,
        gopacket.Payload(payload),
    )
    if err != nil {
        fmt.Printf("[-] Serialize error: %s\n", err.Error())
        return
    }
    outgoingPacket := buffer.Bytes()

    err = handle.WritePacketData(outgoingPacket)
    if err != nil {
        fmt.Printf("[-] Error while sending: %s\n", err.Error())
        return
    }

}

在终端中,我使用 netcat 监听传入的数据包:

nc -ulp 8080 -s 127.0.0.1

当我运行代码时,我可以在环回接口上的wireshark中看到生成的数据包,具有正确的校验和,但数据包永远不会到达netcat。可能是什么问题?


如果你看这个diagram http://www.brendangregg.com/Perf/linux_perf_tools_full.png,你会注意到tcpdump作用于Ethernet层。然后来了,IP then TCP/UDP, then Sockets. nc运行于TCP/UDP layer.

In the IP级别,数据包可能会被丢弃。很多时候的情况是反向路径过滤 https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.rpf.html.

因此,您可以看到到达以太网层的数据包,可以通过以下方式看到tcpdump,但数据包未到达nc因为它们可能会被路由到其他地方,或者被丢弃。

所以,最好检查一下是否禁用RP filtering并检查iptable规则,有帮助!

Update:

当您在环回接口上操作时:

MAC 用于以太网流量的最低级别,并且仅在一个 LAN 内使用,并帮助引导 LAN 内的流量。本地网络接口上不需要它(lo)因为数据包正在内部处理。

环回地址直接在IP层连接到同一台计算机,无需使用任何物理硬件。因此,它可以让您绕过以太网、PPP 和其他驱动程序。

package main

import (
    "fmt"
    "net"

    "github.com/google/gopacket"
    "github.com/google/gopacket/layers"
    "github.com/google/gopacket/pcap"
)

func main() {
    handle, err := pcap.OpenLive("lo0", 1500, false, pcap.BlockForever)
    if err != nil {
        fmt.Printf("%s\n", err.Error())
        return
    }

    eth := layers.Ethernet{
        EthernetType: layers.EthernetTypeIPv4,
        SrcMAC:       net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
        DstMAC:       net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    }

    _ = eth // Ignore. Use where ethernet interface is used

    // Used for loopback interface
    lo := layers.Loopback{
        Family: layers.ProtocolFamilyIPv4,
    }

    ip := layers.IPv4{
        Version:  4,
        TTL:      64,
        SrcIP:    net.IP{127, 0, 0, 1},
        DstIP:    net.IP{127, 0, 0, 1},
        Protocol: layers.IPProtocolUDP,
    }

    udp := layers.UDP{
        SrcPort: 62003,
        DstPort: 9000,
    }
    udp.SetNetworkLayerForChecksum(&ip)

    payload := []byte{'a', 'b', 'c', '\n'}

    options := gopacket.SerializeOptions{
        ComputeChecksums: true,
        FixLengths:       true,
    }

    buffer := gopacket.NewSerializeBuffer()

    // if err = gopacket.SerializeLayers(buffer, options,
    //  &eth,
    //  &ip,
    //  &udp,
    //  gopacket.Payload(payload),
    // ); err != nil {
    //  fmt.Printf("[-] Serialize error: %s\n", err.Error())
    //  return
    // }
    if err = gopacket.SerializeLayers(buffer, options,
        &lo,
        &ip,
        &udp,
        gopacket.Payload(payload),
    ); err != nil {
        fmt.Printf("[-] Serialize error: %s\n", err.Error())
        return
    }
    outgoingPacket := buffer.Bytes()

    if err = handle.WritePacketData(outgoingPacket); err != nil {
        fmt.Printf("[-] Error while sending: %s\n", err.Error())
        return
    }

}

我正在 macOS Catalina 上运行该程序,如果您看到屏幕截图,它正在运行。nc可以接收自定义生成的数据包。如果校验和不正确,那么它将被丢弃。

我希望它有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gopacket 发送 UDP 数据包到 127.0.0.1 的相关文章

  • Golang delve,如何启动调试器并启动正在调试的应用程序?

    我正在尝试设置一个可以远程连接的无头深度调试器 我无法找到一种方法来启动调试服务器 而该服务器不会暂停我正在调试的应用程序 我一直在使用dlv attach headless true listen 2345 attach 32但这会暂停该
  • 使用 Golang 通道处理 HTTP 请求

    我正在尝试构建一个简单的 Golang Appengine 应用程序 它使用通道来处理每个 http 请求 原因是我希望每个请求执行合理的大型内存计算 并且每个请求都以线程安全的方式执行 即来自并发请求的计算不会混合 这一点很重要 本质上
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • formatFloat :将浮点数转换为字符串[重复]

    这个问题在这里已经有答案了 http golang org pkg strconv http golang org pkg strconv http play golang org p 4VNRgW8WoB http play golang
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • 在 Go 中修改导入的库

    我的问题 弹性节拍 https www elastic co products beats是一个用 Go 编写的日志传送程序的开源项目 它具有多种日志输出功能 包括控制台 Elasticsearch 和 Redis 我想将我自己的输出添加到
  • 具有多个等待组的管道中通道范围内的死锁

    我正在练习通过同时将计算分为 100 组来计算阶乘的挑战 我解决了 WaitGroups 上的很多问题 但仍然处于calculateFactorial函数我在通道部分的范围上陷入了僵局 希望有人能指出这个问题 谢谢 package main
  • 使用 MongoDB Atlas 时 mongo-go-driver 因服务器选择超时而失败

    去版本 1 12 5 我有这个使用 node js mongo 驱动程序的代码 const MongoClient require mongodb MongoClient const uri process env MONGO HOST d
  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i
  • 使用Java查找无线网络的SSID

    我们正在做一个用 Java 编码的项目 为 JRE 1 6 编译 需要一些帮助 一个有点但明显复杂的功能 我们希望在连接特定无线网络时执行特定操作 例如当连接的 SSID myNetworkAtHome 或类似名称时 在浏览了这个网站 谷歌
  • 如何使用 iPhone 将照片上传到服务器?

    我正在编写一个 iPhone 应用程序 它可以拍摄照片然后将其上传到服务器 如何使用 Cocoa 将照片上传到服务器 我想我在某处使用 NSUrl Thanks Header interface EPUploader NSObject NS
  • 如何在Windows Phone 7中获取Wi-Fi和移动网络参数?

    我的应用程序需要以下移动网络参数 MCC 移动国家代码 MNC 移动网络代码 LAC 位置区域代码 CID 小区标识符 细胞信号强度 对于 Wi Fi MAC地址 信号强度 我还需要两个变体的设备 IP 地址 Windows Phone 7
  • Golang标志:忽略丢失的标志并解析多个重复的标志

    我是 Golang 新手 一直无法使用 flag 找到这个问题的解决方案 如何使用 flag 以便我的程序可以处理此类调用 其中 term 标志可能出现可变次数 包括 0 次 myprogram f flag1 myprogram f fl
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • 构建链代码时 ltdl.h 未找到错误

    我正在尝试使用构建链码go build 当我运行 Go build 命令时它的报告 hyperledger fabric vendor github com miekg pkcs11 pkcs11 g o 29 18 fatal error
  • 如何以编程方式找出哪台计算机是 Windows 中的域控制器?

    我正在寻找一种方法来确定客户端计算机连接到的给定域的域控制器的名称 IP 地址 在我们公司 我们有很多用于测试的小型网络 其中大多数都有自己的小域 作为示例 其中一个域被命名为 TESTLAB 我有一个 Windows XP 工作站 它是
  • 在 Python 中通过网络发送对象的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要通过网络发送对象 我将使用 Twisted 并且我刚刚开始查看它的文档 据我所知 python实现套接字的唯一方式是通过文本 那么我如何使
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s

随机推荐

  • 如何为从方法返回的流启用“类型信息”?

    从几个版本开始 IntelliJ 有一个非常有用的功能 当你将一个单独的方法调用stream 语句在单独的行上 IntelliJ 在每一行上放置类型信息 但当你不打电话时stream 直接 就像从另一个方法返回时一样 该信息被省略 有没有办
  • Visual Studio Designer 总是试图改变我的控制

    我有一个有点复杂的 UserControl 而 Visual Studio 2008 在使用它时给我带来了相当无害的烦恼 每次我用设计器打开控件时 它都会决定立即更改设计器设置的一些无害值 即 Size 属性的初始化 如果我保存这些更改 关
  • 为什么在以下代码中 form.showdialog() 有效而 form.show() 无效

    在下面的代码中 我有一个观察程序 它查看文件是否已更改 如果已更改 我会在表单上显示更改后的信息 但如果我使用 form Show 它会冻结 但 form showDialog 工作正常 这两者有什么区别以及如何确定使用哪一个 privat
  • 在 C 中将 PPM 从 RGB 转换为 HSL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要有关 RGB 图像文件中的直方图均衡化的帮助来完成我的学术课程 我检查了之前有关直方图均衡的代码示例 但没有找到有关此问题的任何线索
  • 用ggplot填充R中两条黄土平滑线之间的区域

    我想知道如何填充 ggplot 中黄土平滑线之间的区域 以下数据框用于图片 x y ymin ymax grp ydiff 1 1 3 285614 3 285614 10 14177 min 6 8561586 2 1 10 141773
  • 使用 XAML 热重启部署 Xamarin.Forms iOS 应用程序时出错

    我尝试使用 Xamarin Forms 和热重启来开发 iOS 应用程序 但从 Visual Studio 运行该应用程序时不断出现以下错误 尝试部署应用程序 TestApp2 iOS app 时发生错误 详细信息 运行热重启时出错 将应用
  • 使用 python 将列表转换为字符串

    我有包含 int float 和 string 的列表 lists 10 test 10 5 如何将上面的列表转换为字符串 我努力了 val join lists print val 我收到这样的错误 sequence item 0 exp
  • C 职位面试 - 选角和比较

    我遇到了一个棘手的 IMO 问题 我需要比较两个MAC地址 http en wikipedia org wiki MAC address 以最有效的方式 那一刻我脑子里唯一的想法就是一个微不足道的解决方案 一个for循环 比较地点 我就这么
  • 如何在 iOS 应用程序中从蓝牙 LE 设备获取通知

    我正在开发 iOS 蓝牙 LE 应用程序 我能够正确且成功地遵循的功能如下 发现外围设备 连接到外围设备 获取服务和特征 单击读取按钮时能够从特性中读取数据 能够写入数据 在这里我面临一个问题 只有当 BLE 设备将传入数据传输到应用程序时
  • R - 使用 DT 按行格式化

    我有一个数据表 我想在闪亮的应用程序中显示 并按行显示不同的数字格式 我发现用户 NicE 之前提供了一个解决方案 该解决方案在所有列和行都是数字时有效 如下所示 R Shiny DataTables 不按列而是按行格式化数字 https
  • 在相同表名的插入查询中使用选择查询

    是否可以在 插入 查询中使用 选择 查询 但条件是我想对 选择 和 插入 查询使用相同的表名 例如mysql gt insert into sample elements name position ownerel values Names
  • 返回 Oracle 引用游标并附加多个结果

    我有这个问题 希望有人知道答案 我有一个 Oracle 存储过程 它接受客户 ID 并在 ref cursor 中返回所有客户的订单 过于简单化 这就是我所拥有的 Orders orderId siteID Customers siteID
  • 查找 Eclipse 项目中的错误数量

    如何以编程方式查找 Eclipse 项目中的错误数量 以红色标记 主要有两个步骤 您需要访问 Eclipse API 为 Eclipse 编写自己的插件或使用脚本插件 例如时髦的猴子 http groovy codehaus org Gro
  • 在 VIM 中重新打开上次会话缓冲区的替代方案?

    I know mksession 我也用它 但有时 它太多了 它保存了太多状态 这是一个问题 例如 当你更新一些插件 并且想要关闭 打开 VIM 以在新状态下启动它时 除非你只想保留当前打开文件的状态 有时什么 mksession保存与新更
  • 默认的 iPhone 相机应用程序如何能够如此快速地保存照片?

    到目前为止 我已经成功地为 iPhone 创建了一个应用程序 它可以拍摄多张图像 每张图像之间的间隔约为 3 秒 我正在一个单独的线程中异步处理每个图像 一切都很好 直到将图像保存到 iPhone 磁盘上 然后大约需要 12 秒才能使用 J
  • JavaScript 中变量的作用域是什么?

    javascript中变量的作用域是什么 它们在函数内部和外部具有相同的作用域吗 或者说这有什么关系吗 另外 如果全局定义变量 它们存储在哪里 TLDR JavaScript 具有词法 也称为静态 作用域和闭包 这意味着您可以通过查看源代码
  • WMQ Pub/Sub 主题到队列桥

    在其他队列管理器中 可以在队列和主题之间建立桥梁 以便发布者和订阅者不需要知道他们正在使用主题 示例中TIBCO EMS http www tibco com products soa messaging enterprise mesage
  • 如何设置每两周本地通知一次

    如何每两周触发一次本地通知 我所做的是 UILocalNotification localNotification UILocalNotification new localNotification repeatInterval 14 lo
  • 如何查看 Angular 2 应用程序的页面源

    我有网络应用程序 每当我使用浏览器查看页面源查看页面源时 我只能看到页面源中的index html内容 因为我能够看到检查元素中的所有html代码 但不能看到页面中的所有html代码来源 有谁如何查看页面源代码吗 下面是server ts
  • 使用 gopacket 发送 UDP 数据包到 127.0.0.1

    我正在尝试使用 gopacket 将 UDP 数据包发送到 127 0 0 1 这是我的代码 package main import fmt net github com google gopacket github com google