Тестирование соединения с портом UDP


37

Я пытаюсь проверить, могу ли я получить доступ к определенному порту на удаленном сервере (оба из которых у меня есть доступ) через UDP.

Оба сервера подключены к интернету. Я использую netcat для прослушивания определенного порта.

Затем я использую nmap для проверки того, открыт ли этот порт, но не кажется, что он открыт.

Iptables выключен.

Любые предложения, почему это может быть? В конце концов я собираюсь настроить VPN-туннель, но, поскольку я очень плохо знаком с туннелями, я хочу убедиться, что у меня есть подключение к порту UDP 1194 перед продвижением.


Я отвечаю на вопрос «Проверка соединения через порт UDP». Но я предлагаю сконцентрироваться на более конкретной части «убедитесь, что OpenVPN получает мои UDP-пакеты» - этого легко достичь, просматривая журналы OpenVPN.
Luke404,

Ответы:


46

Не существует такого понятия, как «открытый» порт UDP, по крайней мере, в том смысле, в котором большинство людей привыкли думать (что отвечает на что-то вроде «ОК, я принял ваше соединение»). UDP не использует сессии, поэтому «порт» (читай: протокол UDP в стеке IP операционной системы) никогда не будет отвечать «успех» сам по себе.

Порты UDP имеют только два состояния: прослушивание или нет. Обычно это означает «иметь открытый сокет процесса» или «не иметь никакого открытого сокета». Последний случай должен легко обнаруживаться, поскольку система должна ответить пакетом ICMP Destination Unreachable с кодом = 3 (Порт недоступен). К сожалению, многие брандмауэры могут отбрасывать эти пакеты, поэтому, если вы ничего не получите обратно, вы точно не знаете, находится порт в этом состоянии или нет. И давайте не будем забывать, что ICMP тоже не требует сессий и не выполняет повторные передачи: пакет «Недоступный порт» вполне может быть потерян где-то в сети.

Порт UDP в состоянии «прослушивания» может вообще не отвечать (прослушивающий его процесс просто получает пакет и ничего не передает) или может отправлять что-либо обратно (если процесс действует после приема и если он действует посредством ответ через UDP на исходный IP-адрес отправителя). Опять же, вы никогда не знаете наверняка, в каком состоянии, если ничего не получите.

Вы говорите, что можете управлять принимающим хостом: это позволяет вам создать собственный протокол для проверки достижимости UDP-порта: просто установите процесс на принимающем хосте, который будет прослушивать данный UDP-порт и отвечать обратно (или отправлять вам сообщение). электронная почта, или просто сумасшедший, и unlink()все в файловой системе хоста ... все, что привлечет ваше внимание, сделает).


Думаю, я понимаю это сейчас. Таким образом, netstat на сервере с прослушивающим портом udp никогда не будет показывать удаленный хост ... Только tcpdump должен показывать удаленные запросы?
Блокировка

Как netstat, так и tcpdump имеют возможность выгружать данные о вас, последние в более удобочитаемой форме. Проверьте их справочные страницы для деталей.
Luke404

56

Чтобы проверить, отвечает ли порт udp, используйте netcat.

Пример из справочной страницы :

nc -v -u -z -w 3 example.host 20-30
    Send UDP packets to ports 20-30 of example.host, and report which ones
    did not respond with an ICMP packet after three seconds.

Конечно, если используется брандмауэр DROP, который обычно имеет место при работе с интернет-шлюзами, вы не получите ответ ICMP.


1
Этот ответ дал мне ложноположительный ответ, где, напротив, ответ Саши показывает, что я ожидаю.
Техас-бронус

@ texas-bronius Если у вас есть доступ к другому серверу, то, вероятно, лучше поступить с Сашей
motobói

27
  1. как на клиенте, так и на сервере установите nc: yum install nc(для centos)
  2. на сервере слушайте UDP порт: nc -ul 6111
  3. на клиенте nc -u <server> 6111
  4. наберите что-нибудь на клиенте и нажмите Enter - вы должны увидеть этот текст на сервере

Примечание. Когда вы запускаете nc -ulкоманду на сервере, она будет подключаться только при первом подключении к нему. Как я выяснил, вы не можете переключаться между серверами ping без остановки и перезапуска nc -ul. Фактически, если вы ^ C остановите client ( nc -u ...), вы также не сможете перезапустить клиент, не перезапустив прослушиватель сервера.


1
Мне нравится этот умный ответ, потому что он учитывает мое собственное понимание (и недопонимание!) Того, как UDP «посылает и забывает», и все подтверждения могут быть получены только из правильной конфигурации. Слишком много факторов. Этот ответ дает действительно простой, точный вызов и ответ, который либо работает, либо не работает, изменяет конфигурацию, промывает и повторяет.
Техас-бронус

10

Тестирование открытых UDP-портов с помощью nmap чревато опасностями - нет трехстороннего рукопожатия, указывающего на открытость. Если процесс прослушивания не отвечает на все, что отправляет nmap, у nmap нет способа различить открытый порт, который не отвечает, и отфильтрованный порт.

Гораздо проще просто слушать на одном конце с netcat и использовать netcat на другом конце для отправки пакетов, и видеть, что они приходят на другом конце. Делайте это в обоих направлениях, просто будьте уверены. Вы также tcpdumpможете увидеть, как пакеты попадают туда, куда им нужно идти.


Я вижу .. Так как же Nmap точно знает открытый порт? Отправляет ли он данные на этот порт, и если он получает ответ, он считается открытым? Я буду использовать комбинацию tcpdump и netcat. Спасибо за ваш хорошо объясненный ответ.
Блокировка

9

У меня была похожая проблема, и я нашел хорошее решение, используя netcat здесь: http://en.wikipedia.org/wiki/Netcat#Test_if_UDP_port_is_open:_simple_UDP_server_and_client

nc -vzu <host> <port>

Я был в состоянии подтвердить, что мой порт UDP был открыт, и затем мог приступить к тестированию моего фактического кода.



1

Вы можете сделать это с помощью netcat(nc) или iperf, если у вас есть другая машина для тестирования вне сети. Мой выбор - nmapсканирование UDP из системы вне вашей среды. Какой была ваша командная строка nmap? Есть ли какие-либо аппаратные брандмауэры или другие устройства в миксе?


1

У меня простой подход. Если UDP-сервер не возвращает ожидаемые данные, я просто прекращаю собирать дграммы, предполагая, что они вышли из строя:

LINE: while(1)
{
    my $line;
    my $flags;

    local $SIG{ALRM} = sub {die "exceeded timeout for recv"};
    alarm 5;
    eval {
        $socket->recv($line,2024,$flags);
    };

    unless($line =~ /\{.*\}/){
        if($verbose){
            print STDERR "Invalid or empty dgram:\n",'"', $line, '"',"\n";
        }

        last LINE;
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.