当我执行以下 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 应该有这方面的文档。
否则,各种工具(例如socat
、nc
或netcat
,或通过 shell 中极其相似的功能,例如ksh93
或bash
)可以从标准输入中获取字节并将它们转储到成为 UDP 数据包的位置。这是否“正确”取决于协议;理论上,人们可以通过这种方式构建和发送 DNS 或 DHCP 数据包,尽管人们更经常使用库或专用软件来(希望)正确地实现相关协议,因为通常比设置几个位要复杂得多。数据包的主体并通过网络发送出去,特别是处理响应、超时或错误后重试、数据包标头字段等。这些协议通常在 RFC 中有详细记录,或者参见“TCP/IP 图解”系列丛书史蒂文斯提供更多文档。
特定的工具,例如nmap
通过数据包构建执行非常自定义的操作。否则,对于手动数据包构建,通常会使用编程语言,尽管大多数软件将使用现有的库或系统服务来发送 DNS 或 DHCP 或其他 UDP 数据包,因为与手动制作原始数据包相比,这些工作量要少得多,并且不容易出错。数据包从头开始。