UDP bağlantı noktası bağlantısını sınama


37

UDP üzerinden uzaktaki bir sunucudaki belirli bir bağlantı noktasına (her ikisine de erişebiliyorum) ulaşıp ulaşamayacağımı test etmeye çalışıyorum.

Her iki sunucu da internete bakmaktadır. Netcat'ı belirli bir port dinlemesi için kullanıyorum.

Daha sonra açık olup olmadığını görmek için bu bağlantı noktasını kontrol etmek için nmap kullanıyorum, ancak görünmüyor.

Iptables kapatıldı.

Bunun neden olabileceğine dair bir önerin var mı? Sonunda bir VPN tüneli kuracağım, ancak tünellerde çok yeni olduğum için ilerlemeden önce UDP 1194 numaralı bağlantı noktasındaki bağlantım olduğundan emin olmak istiyorum.


"Test UDP bağlantı noktası bağlantısını" sorusuna yanıt verdim. Ancak, OpenVPN günlüklerine bakarak kolayca elde edilebilecek "OpenVPN'in UDP paketlerimi aldığından emin ol" kısmına odaklanmayı öneriyorum.
Luke404

Yanıtlar:


46

"Açık" bir UDP limanı diye bir şey yoktur, en azından çoğu insanın düşünmeye alıştığı anlamında değildir (ki bu "Tamam, bağlantınızı kabul ettim" gibi bir şeye cevap verir). UDP oturumsuzdur, bu nedenle "bir bağlantı noktası" (okuma: işletim sisteminin IP yığınındaki UDP protokolü) hiçbir zaman kendi başına "başarıya" yanıt vermez.

UDP bağlantı noktalarının yalnızca iki durumu vardır: dinleme veya dinleme. Bu genellikle "bir işlem tarafından üzerinde bir soketin açılması" veya "açık bir soketin olmaması" anlamına gelir. İkinci durumun, sistemin kod = 3 (Bağlantı noktası erişilemez) koduyla bir ICMP Hedef Ulaşılamaz paketiyle yanıt vermesi gerektiğinden kolay anlaşılmalıdır . Maalesef birçok güvenlik duvarı bu paketleri düşürebilir, böylece bir şey alamazsanız, portun bu durumda olup olmadığından emin olamazsınız. Ve unutmayalım ki, ICMP de oturumsuz ve yeniden iletimler yapmıyor: Bağlantı Noktasına Ulaşılamaz paketi ağ üzerinde bir yerde çok iyi bir şekilde kaybedilebilir.

"Dinleme" durumundaki bir UDP limanı hiçbir şekilde yanıt vermeyebilir (onu dinleyen işlem yalnızca paketi alır ve hiçbir şey iletmez) ya da geri gönderebilir (işlem alım sırasında hareket ederse ve UDP ile orijinal gönderen IP'sine cevap: port). Yani bir daha geri alamazsan, devletin ne olduğunu kesin olarak bilemezsin.

Alıcı ana bilgisayarı kontrol edebileceğinizi söylersiniz: bu UDP bağlantı noktasının erişilebilirliğini kontrol etmek için kendi protokolünüzü oluşturabilmenizi sağlar: yalnızca alıcı ana makineye verilen UDP bağlantı noktasını dinleyecek ve geri yanıtlayacak (veya size gönderecek) bir işlem koyun Bir e-posta ya da sadece çıldırdı ve unlink()ana bilgisayar dosya sistemi üzerindeki her şey ... dikkatinizi tetikleyecek herhangi bir şey yapacaktır).


Sanırım şimdi anlıyorum. Yani dinleyici udp portu ile sunucudaki bir netstat uzaktaki ana bilgisayarı asla göstermez ... Uzaktaki istekleri yalnızca bir tcpdump göstermeli mi?
kilitle

Hem netstat hem de tcpdump, daha okunaklı bir formda, sizin üzerinize veri atabilmektedir. Ayrıntılar için kendi man sayfalarına göz atın.
Luke404

56

Udp portunun yanıt verip vermediğini test etmek için kullanın netcat.

Man sayfasından bir örnek :

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.

Elbette, DROPinternet yüzlü ağ geçitleriyle uğraşırken normalde olduğu gibi bir güvenlik duvarı kuruluyorsa, bir ICMP yanıtı alamazsınız.


1
Bu cevap bana yanlış-pozitif bir cevap verdi, aksine, Sasha'nın cevabı beklediğim şeyi gösteriyor.
texas-bronius

@ texas-bronius Diğer sunucuya erişiminiz varsa, Sasha'nın yolunu yapmak muhtemelen daha iyidir
motobói

27
  1. Her ikisi de istemci ve sunucu üzerinde nc: yum install nc(centos için)
  2. sunucuda UDP bağlantı noktasını dinle: nc -ul 6111
  3. müşteride nc -u <server> 6111
  4. istemcide bir şey yazın ve enter tuşuna basın - bu metni sunucuda görmelisiniz

Not:nc -ul Komutu sunucuda çalıştırdığınızda, yalnızca kendisine gelen ilk bağlantı için bağlanır. Öğrendiğim gibi, durdurmadan ve yeniden başlatmadan ping yapan sunucular arasında geçiş yapamazsınız nc -ul. Aslında, istemciyi ^ C) durdurursanız, nc -u ...ilk önce sunucu dinleyicisini yeniden başlatmadan istemciyi yeniden başlatamazsınız.


1
Bu zekice cevabı seviyorum, çünkü UDP'nin "gönderme ve unutma" konusundaki kendi anlayışlarımı (ve yanlış anlamaları!) Besliyor ve tüm onaylar ancak uygun yapılandırma ile elde edilebiliyor. Çok fazla faktör var. Bu yanıt işe yarayan ya da çalışmayan, yapılandırmayı değiştiren, durulayan ve tekrarlayan basit, kesin bir çağrı ve yanıt verir.
texas-bronius

10

Açık UDP bağlantı noktalarının nmap ile test edilmesi tehlikelerle doludur - açıklığı belirtmek için üç yönlü bir el sıkışma yoktur. Dinleme işlemi nmap'ın gönderdiği her şeye yanıt vermedikçe, nmap'ın yanıt vermeyen açık bir bağlantı noktası ile filtrelenmiş bir bağlantı noktası arasında ayrım yapması mümkün değildir.

Çok daha kolay, sadece bir ucunda netcat ile dinlemek ve diğer ucunda netcat'ı kullanarak paketleri göndermek ve diğer ucunda vardıklarını görmek. Her iki yönde de sadece emin olun. Ayrıca tcpdumppaketleri gitmeleri gereken yere ulaştıklarını da görebilirsiniz.


Anladım .. Peki nmap açık bir limanı tam olarak nasıl biliyor? Bu bağlantı noktasına veri gönderiyor mu ve bir yanıt alırsa açık olarak mı kabul edilir? Tcpdump ve netcat kombinasyonunu kullanacağım. İyi cevap verdiğiniz cevap için teşekkür ederim.
kilitlen


2

Aşağıdaki komutu kullanarak udp portlarını tarayabilirsiniz.

nmap -sU -v <hostname or ip>

1

Bunu netcat(nc) ile veya iperfağ dışında test etmek için başka bir makineniz olduğunu varsayarak yapabilirsiniz. Seçimim nmap, ortamınız dışındaki bir sistemden bir UDP taraması olabilir. Nmap komut satırınız neydi? Karışımda herhangi bir donanım güvenlik duvarı veya diğer cihazlar var mı?


1

Basit fikirli bir yaklaşımım var. UDP sunucusu beklenen verileri döndürmezse, aşağıya düştüğünü varsayarak dgram toplamayı bıraktım:

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.