![为什么可以接收到来自网络外部的 UDP 报文但无法传送该报文?](https://linux22.com/image/535537/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8F%AF%E4%BB%A5%E6%8E%A5%E6%94%B6%E5%88%B0%E6%9D%A5%E8%87%AA%E7%BD%91%E7%BB%9C%E5%A4%96%E9%83%A8%E7%9A%84%20UDP%20%E6%8A%A5%E6%96%87%E4%BD%86%E6%97%A0%E6%B3%95%E4%BC%A0%E9%80%81%E8%AF%A5%E6%8A%A5%E6%96%87%EF%BC%9F.png)
我开发了一个 Ubuntu Server 10.04 应用程序,它通过 UDP 端口接收消息。该应用程序的最终目的是接收现场工作人员的 3G 调制解调器发送的消息。
如果在另一个 ubuntu 服务器或我的 Vista 笔记本电脑上使用 netcat(两者都与我的测试机器在同一个 LAN 上)发送消息,消息会正确到达并显示在我的应用程序中。但是,如果我走到我的车上并使用其 3G 调制解调器从同一台 Vista 笔记本电脑发送消息,它不起作用。如果我运行 tcpdump -A,我会看到消息正确到达,但它从未传递到我的应用程序。显然,操作系统是选择不传递消息的人(否则它们不会出现在 tcpdump 中,我的应用程序也不会在来自本地机器时收到它们)。我没有在这台机器上安装任何防火墙软件,也不知道默认安装的任何会阻止流量的东西。
sudo iptables --list 返回
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我不太熟悉 iptables,但在我看来,这就像告诉它不要做任何事情。
发生了什么事,导致我的邮件无法送达?
根据所需信息进行编辑:
我的本地地址是 10.222.110.79/24。
我的 tcpdump 命令是
sudo tcpdump -i eth0 udp port 6203 -A -f -n
对于内部发送的消息,tcpdump 显示
IP 10.222.110.75.60856 > 10.222.110.79.6203: UDP
外部发送的显示
IP 108.116.172.0.3072 > 10.222.110.79.6203: UDP
(我假设第二条消息反映了公司防火墙重新路由了该消息。我将其发送到我们的公共 IP,防火墙有一个(临时)规则,将所有 UDP 6203 流量发送到我的开发箱。)
这是我的 netcat 命令
nc -u 10.222.110.79 6203
然后我只需输入内容并按回车键即可发送。从外部,我用我们的公共 IP 替换 IP,但不做任何其他更改。
答案1
我首先要从方程式中去掉 3G。听起来你已经这样做了,而且发现它有效。如果是这样,3G 服务可能阻止了 UDP 流量。或者,UDP 数据包可能根本无法存活,UDP 是为高吞吐量、低可用性而设计的。易变的 3G 网络正是 TCP 为之设计的环境,对于 UDP 应用程序来说并不是最优的。
答案2
看起来问题实际上是由 Netcat 本身引起的。最初,3G 调制解调器配置错误,这就是我首先启动 Netcat 的原因。我发现,尽管 UDP 是无连接的,但 Netcat 会做一些奇怪的事情来模拟通过 UDP 连接。我不会声称完全理解它,但不知何故这导致数据无法传送。最后,我最终让 3G 调制解调器在没有运行 netcat 的情况下自行运行,结果成功了。数据正确传送。当我再次启动 netcat 发送测试数据时,数据停止传送。关闭 netcat,数据又开始传送。很奇怪。
谢谢大家的帮助。