Linux – Why are UDP messages from outside the network received but not delivered

linuxudp

I have an Ubuntu Server 10.04 application I've developed that receives messages over a UDP port. The ultimate purpose of this application is to receive messages sent from workers' 3G modems out in the field.

If use netcat on either another ubuntu Server or my Vista laptop (both on the same LAN as my test machine) to send a message, the message arrives correctly and appears in my application. However, if I go out to my car and use its 3G modem to send a message from the same Vista laptop, it doesn't work. If I run tcpdump -A, I see the message arrive correctly, but it's never delivered to my application. Clearly, the OS is the one making the choice not to deliver the messages (else they wouldn't appear in tcpdump nor would my app receive them when coming from local machines). I have not installed any firewall software on this machine, nor am I aware of anything installed by default that would block the traffic.

sudo iptables –list returns

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     

I'm not too familiar with iptables, but it looks to me like that's telling it to not do anything.

What could be going on that's preventing my messages from being delivered?

Edit with requested information:

My local address is 10.222.110.79/24.

My tcpdump command is

sudo  tcpdump -i eth0 udp port 6203 -A -f -n

For the messages sent internally, tcpdump is showing

IP 10.222.110.75.60856 > 10.222.110.79.6203: UDP

The ones sent externally show

IP 108.116.172.0.3072 > 10.222.110.79.6203: UDP

(I assume the second message is reflecting the corporate firewall rerouting the message. I'm sending it to our public IP, and the firewall has a (temporary) rule that sends all UDP 6203 traffic to my dev box.)

This is my netcat command

nc -u 10.222.110.79 6203

And then I just type stuff in and hit enter to send. From outside, I replace the IP with our public IP, but don't make any other changes.

Best Answer

I would start by removing 3G from the equation. It sounds like you have already done this, and have found it to work. If so, the 3G service may be blocking the UDP traffic. Alternatively, the UDP packets may simply not be surviving, UDP is designed for high-throughput, low-availability. The volatile 3G network is precisely the environment that TCP was designed for and is sub-optimal for UDP applications.