为什么 tcpdump 能看到回复,而 netcat 却看不到

为什么 tcpdump 能看到回复,而 netcat 却看不到

我正在 netcat 中使用 UDP 调试 OpenVPN 站点到站点连接。

我可以让数据包朝一个方向流动(主机 A->主机 B),但不能朝相反方向流动。

root@hosta:~# nc 10.0.3.2 1234 -u

root@hostb:~# nc -l 1234 -u

奇怪的是,当tcpdump在主机 A 中运行时,我实际上看到来自主机 B 的 UDP 数据包:

root@hosta:~# tcpdump port 1234
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:36:04.695423 IP hosta.46603 > 10.0.3.2.1234: UDP, length 4
17:36:06.484233 IP 10.0.3.2.1234 > hosta.46603: UDP, length 4

但是,netcat 什么都没输出。我试过了stracenc但套接字什么也没收到。

我还能做什么来诊断这个问题?

答案1

仅使用给定的命令,这本来很容易!Netcat 默认使用 TCP,不-u使用 UDP。在nc -lp 1234 -u侦听端口 1234 上的 UDP 连接时,nc 10.0.3.2 1234尝试打开 TCP 连接。

我建议-v -v在两端都添加 Netcat,因为它最终会为您提供发送/接收统计信息。请添加此信息并更正您使用的命令,以便我们知道您的调试条件正确。

还可以用tcpdump port 1234 -XX十六进制和 ASCII 格式查看这些数据包里面的内容。


但是,根据输出,tcpdump port 1234您可能仍然正确执行了命令,但让我们稍微处理一下这个错误,看看我们如何知道:

由于你得到了 UDP 数据包

IP hosta.46603 > 10.0.3.2.1234: UDP, length 4
IP 10.0.3.2.1234 > hosta.46603: UDP, length 4

而不是像 TCP 数据包

IP hosta.46603 > 10.0.3.2.1234: Flags [S], seq 1384271454, win 14600, options [mss 1460,sackOK,TS val 1969077197 ecr 0,nop,wscale 3], length 0
IP 10.0.3.2.1234 > hosta.46603: Flags [R.], seq 0, ack 1384271455, win 0, length 0

让我们假设你的情况正好相反:

root@hosta:~# nc 10.0.3.2 1234 -u
root@hostb:~# nc -lp 1234 

但在这种情况下你只会看到第一个

IP hosta.46603 > 10.0.3.2.1234: UDP, length 4

并且不会有任何发往另一个方向的 UDP 数据包!

然后,如果您不小心nc <IP> 1234 -u在两端使用了相同的内容,那么您将拥有两条线,但端口不会相同,而是类似于:

IP hosta.46603 > 10.0.3.2.1234: UDP, length 4
IP 10.0.3.2.73644 > hosta.1234: UDP, length 4

答案2

答案可能和这个问题的回答类似: 转发的数据包可通过 tcpdump 看到,但应用程序无法收到

hostA 和 hostB 是否位于不同的网络中?hostB 是否返回到 hostA(它是否有到 hostA 的路由?如果没有,是否net.ipv4.conf.*.rp_filter已禁用?

如果主机 B 没有到主机 A 的路由,解决方案是添加路由或禁用rp_filter(反向路径过滤器)。

答案3

此外,在我的硬编码 IPv4 标头中,我的校验和是错误的,因此在接收端,netcat 忽略了 UDP 数据包,尽管 tpcdump 和 wireshark 报告了这一点。tcpdump 标记了错误的校验和,wireshark 忽略了它

相关内容