Тестування підключення порту UDP


37

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

Обидва сервери мають Інтернет. Я використовую netcat для прослуховування певного порту.

Потім я використовую nmap, щоб перевірити наявність цього порту, щоб побачити, чи він відкритий, але, здається, це не так.

Iptables вимкнено.

Будь-які пропозиції, чому це може бути? Зрештою, я збираюся налаштувати тунель VPN, але, оскільки я дуже новачок у тунелях, я хочу переконатися, що я маю підключення до порту UDP 1194 перед тим, як просуватися.


Я відповідаю на питання "Тестування підключення до UDP-порту". Але я пропоную сконцентруватися на більш конкретній частині "переконайтеся, що OpenVPN отримує мої пакети UDP" - цього можна легко досягти, переглядаючи журнали OpenVPN.
Лука404

Відповіді:


46

Немає такого поняття, як "відкритий" порт UDP, принаймні, не в тому сенсі, як більшість людей звикли думати (що відповідає щось на кшталт "ОК, я прийняв ваше з'єднання"). UDP не потребує сеансу, тому "порт" (читайте: протокол UDP в стеку IP операційної системи) ніколи не відповість "успіхом" самостійно.

Порти UDP мають лише два стани: прослуховування чи ні. Зазвичай це означає "відкрити на ньому розетку процесом" або "не відкрити сокет". Останній випадок повинен бути легко виявити, оскільки система повинна відповідати пакетом ICMP Destination Unreachable з кодом = 3 (Порт недоступний). На жаль, багато брандмауери можуть скинути ці пакети, тому якщо ви нічого не отримаєте, ви точно не знаєте, чи знаходиться порт у такому стані чи ні. І не будемо забувати, що ICMP також без сеансу і не робить повторних передач: пакет недоступних портів дуже добре може бути загублений десь у мережі.

Порт UDP у стані "прослуховування" може взагалі не реагувати (процес, який слухає на ньому, просто отримує пакет і нічого не передає), або він може щось відправити назад (якщо процес діє після отримання та якщо він діє відповідь через UDP на вихідний IP-порт відправника: порт). Отже, знову ж таки, ви ніколи не знаєте напевно, який стан, якщо нічого не отримаєте назад.

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


Подумайте, я зараз це розумію. Отже, netstat на сервері з прослуховуючим udp портом ніколи не показуватиме віддалений хост ... Тільки tcpdump повинен показувати віддалені запити?
Блокування

І netstat, і tcpdump мають можливість скидати дані про вас, останні в більш читаному для людини вигляді. Перегляньте їхні чоловічі сторінки для отримання детальної інформації.
Лука404

56

Щоб перевірити, чи відповідає порт udp, скористайтеся netcat.

Приклад зі сторінки man :

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

@ texas-bronius Якщо у вас є доступ до іншого сервера, мабуть, краще зробити шлях Саші
motobói

27
  1. обидва на клієнт-сервері встановити nc: yum install nc(для центів)
  2. на сервері прослуховування порту UDP: nc -ul 6111
  3. на клієнта nc -u <server> 6111
  4. введіть що-небудь на клієнті та натисніть клавішу Enter - ви повинні побачити цей текст на сервері

Примітка. Коли ви запустите nc -ulкоманду на сервері, вона підключиться лише для першого підключення до неї. Ви не можете, як я з'ясував, перемикатися між серверами, що надсилають пінг, без зупинки та перезавантаження nc -ul. Насправді, якщо ви ^ C зупиняєте клієнт ( nc -u ...), ви також не можете перезапустити клієнта без попереднього перезапуску слухача сервера.


1
Мені подобається ця розумна відповідь, тому що вона подає мої власні уявлення (і непорозуміння!) Про те, як UDP "надсилати і забувати", і все підтвердження можна отримати лише з належної конфігурації. Занадто багато факторів. Ця відповідь дає дійсно простий, остаточний виклик та відповідь, який або працює, або не працює, змінює конфігурацію, промиває та повторює.
texas-bronius

10

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

Набагато простіше просто слухати на одному кінці з Netcat і використовувати netcat на іншому кінці для надсилання пакетів і бачити, як вони надходять на інший кінець. Зробіть це обома способами просто будьте впевнені. Ви також tcpdumpможете бачити, як пакети дістаються туди, куди їм потрібно йти.


Я бачу .. Тож як nmap точно знає відкритий порт? Чи надсилає він дані на цей порт, і якщо він отримує відповідь, це вважається відкритим? Я буду використовувати комбінацію tcpdump і netcat. Дякую за вашу добре пояснену відповідь.
Блокування


2

Ви можете сканувати порти udp, використовуючи наступну команду

nmap -sU -v <hostname or ip>

1

Це можна зробити за допомогою netcat(nc) або iperf, якщо у вас є інша машина для тестування поза мережею. Моїм вибором було б nmapсканування UDP з системи за межами вашого оточення. Яким був ваш командний рядок nmap? Чи є апаратні брандмауери чи інші пристрої в суміші?


1

У мене простодушний підхід. Якщо сервер UDP не повертає очікуваних даних, я просто припиняю збирати dgrams, припускаючи, що він знизився:

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.