У меня есть разработанное мной приложение Ubuntu Server 10.04, которое принимает сообщения через порт UDP. Конечная цель этого приложения - получать сообщения, отправленные с рабочих 3G-модемов в полевых условиях.
Если использовать netcat на другом сервере ubuntu или на моем ноутбуке Vista (оба находятся в той же локальной сети, что и моя тестовая машина) для отправки сообщения, сообщение поступит правильно и появится в моем приложении. Однако, если я выхожу к машине и использую его 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
А затем я просто набираю текст и нажимаю Enter, чтобы отправить. Извне я заменяю IP нашим публичным IP, но не вношу никаких других изменений.
Похоже, проблема была вызвана самим Netcat. Изначально модем 3G был неправильно настроен, поэтому я в первую очередь запустил Netcat. Я обнаружил, что, несмотря на то, что UDP не поддерживает соединение, Netcat делает некоторые забавные вещи для имитации соединения по UDP. Я не буду утверждать, что полностью понимаю это, но почему-то это привело к тому, что данные не были доставлены. В конце концов, я просто позволил модему 3G делать свое дело без запуска netcat, и это сработало. Данные были доставлены правильно. Как только я снова запустил netcat для отправки тестовых данных, данные перестали доставляться. Убейте netcat, и он снова начнет доставляться. Странно.
Спасибо всем за помощь.
Я бы начал с удаления 3G из уравнения. Похоже, вы уже это сделали и обнаружили, что это работает. Если да, то служба 3G может блокировать трафик UDP. В качестве альтернативы, пакеты UDP могут просто не выжить, протокол UDP разработан для обеспечения высокой пропускной способности и низкой доступности. Неустойчивая сеть 3G - это именно та среда, для которой был разработан протокол TCP, и она не является оптимальной для приложений UDP.