如何创建 UDP 数据包?

如何创建 UDP 数据包?

当我执行以下 Netcat 命令并查看数据包时Wireshark,它表示 UDP 数据包格式错误。

$ echo "this is a test" | nc -u 127.0.0.1 53

同样,$ echo "this is a test" > /dev/udp/127.0.0.1/53在 Wireshark 中使用诸如产生“格式错误的数据包”错误之类的命令。

在此输入图像描述

echo 命令无错误地发送/传递到 Netcat 服务器。但这让我想知道:是否可以使用 echo 或其他本地 Unix 工具手动构建正确的 UDP 数据包?

我正在使用 Debian 和 macOS。

答案1

从 IP 和 UDP 的角度来看,您的数据包是完全有效的。如果您在 Wireshark 的下部窗格中展开以太网/IP/UDP 的协议详细信息,您将看到数据包已成功解析。

然而,由于它的目的地是端口 53,Wireshark 尝试将其解析为 DNS 数据包,但它无法执行此操作(因为字符串“this is a test”不是有效的 DNS 请求)RFC 1035规格)。

如果您遵循该链接中的规范,您将能够构造一个在解析为 DNS 请求时有效的数据包。如果您将数据包发送到另一个端口,您会注意到 Wireshark 将不再将其解析为 DNS 请求,因此不会显示该警告。

答案2

您可以通过重定向将它们发送到 Bash 特殊别名。

来自 Bash 联机帮助页:

/dev/tcp/host/port 如果 host 是有效的主机名或 Internet 地址,并且 port 是整数端口号或服务名称,则 bash 会尝试打开相应的 TCP 套接字。

/dev/udp/host/port 如果 host 是有效的主机名或 Internet 地址,并且 port 是整数端口号或服务名称,则 bash 会尝试打开相应的 UDP 套接字。

这将向端口 8080 发送 UDP 数据包到 192.168.2.11:

echo "This is a test" > /dev/udp/192.168.2.11/8080

答案3

这里有多个问题; “格式错误的数据包”的说法可能是由于校验和卸载造成的,如果是这样,则这是一个虚假错误,因为它反映了数据包捕获没有完整的视图——一些工作是在网络硬件上完成的。 WireShark 应该有这方面的文档。

否则,各种工具(例如socatncnetcat,或通过 shell 中极其相似的功能,例如ksh93bash)可以从标准输入中获取字节并将它们转储到成为 UDP 数据包的位置。这是否“正确”取决于协议;理论上,人们可以通过这种方式构建和发送 DNS 或 DHCP 数据包,尽管人们更经常使用库或专用软件来(希望)正确地实现相关协议,因为通常比设置几个位要复杂得多。数据包的主体并通过网络发送出去,特别是处理响应、超时或错误后重试、数据包标头字段等。这些协议通常在 RFC 中有详细记录,或者参见“TCP/IP 图解”系列丛书史蒂文斯提供更多文档。

特定的工具,例如nmap通过数据包构建执行非常自定义的操作。否则,对于手动数据包构建,通常会使用编程语言,尽管大多数软件将使用现有的库或系统服务来发送 DNS 或 DHCP 或其他 UDP 数据包,因为与手动制作原始数据包相比,这些工作量要少得多,并且不容易出错。数据包从头开始。

相关内容