我正在 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 什么都没输出。我试过了strace
,nc
但套接字什么也没收到。
我还能做什么来诊断这个问题?
答案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 忽略了它