Pytanie w sprawie network-programming, udp, port-scanning, c++, port – Sprawdzanie otwartego portu UDP w C ++

5

Jak mogę sprawdzić, czy zdalny port UDP jest otwarty przy użyciu natywnego C ++? Ponieważ UDP jest bez połączenia, wywoływanieconnect() nie jest pomocne. Nie mogę spróbować powiązać go, ponieważ nie jest on lokalny.nmap nie może również wskazać. (jednaknetstat może się dowiedzieć, ale myślę, że wygląda na wewnętrzne informacje o otwartych portach / plikach). Czy i tak go wykryć? Jeśli przejdę na niższą warstwę na poziomie sieci, czy można wysłać wiadomość ICMP przez C ++, aby sprawdzić status nieosiągalnego portu? To znaczy, czy dostarczy to wystarczającej ilości informacji o statusie portu?

Platforma to Linux.

netstat -lptun wskazuje, że na porcie 1060 jest otwarty port UDP, jednak wydaje się, że zapomniałem -sU dla nmap. Wymaga dostępu do roota, aby dowiedzieć się (i dowiaduje się poprawnie), dlaczego? Mustafa
@EJP: oh? Proszę mi wyjaśnić, dlaczego niektóre operacje na gniazdach są dozwolone tylko dla uprzywilejowanych użytkowników?traceroute na przykład jest ograniczony w niektórych systemach z tego powodu. Jestem naprawdę ciekawa. 0xC0000022L
@STATUS_ACCESS_DENIED To pytanie jest również nieistotne. Mówi o statusie zdalnego portu. Przywileje w systemie lokalnym nie mają z tym nic wspólnego. Musi komunikować się ze zdalnym systemem i nie potrzebuje do tego przywilejów. user207421
@STATUS_ACCESS_DENIED Żadne z nich nie ma nic wspólnego ze zdalnym portem. user207421

Twoja odpowiedź

2   odpowiedź
0

czy zdalny port jest gotowy do odbierania datagramów UDP. Ponieważ UDP jest bezpołączeniowy, możesz po prostu stwierdzić, czy zdalny host odpowiada na coś znaczącego. Mogą istnieć sposoby na uzyskanie podpowiedzi (tak jak robią to skanery portowe), ale to nic, na czym polegałbym w kodzie produkcyjnym.

5

że próbujesz ustalić, czy port UDP na zdalnym komputerze jest przekazywany przez zaporę i / lub czy działa na nim aplikacja.

Nie możesz tego wiarygodnie określić. Najbliżej, jak możesz, spróbuj wysłać serię małych datagramów do tego adresu i portu, oddalonych o około 1 sekundę na około 10 sekund.

Jeśli nie ma żadnych zapór blokujących port i nie działa żadna aplikacja, system zdalny może odesłaćICMP_UNREACH_PORT (port nieosiągalny). Jeśli nie ma blokujących zapór ogniowych, a system zdalny jest wyłączony, router może odesłaćICMP_UNREACH_HOST lubICMP_UNREACH_NET. Jeśli zapora sieciowa Cię blokuje, może ją odesłaćICMP_UNREACH_FILTER_PROHIB, ale większość zapór nie wysyła niczego.

Szanse na uzyskanie któregokolwiek z nich są niewielkie, ponieważ większość zapór ogniowych blokuje tego rodzaju opinie ICMP. Nawet jeśli komunikat ICMP wróci, linux zazwyczaj nie pozwala go zobaczyć, chyba że używasz go jako root. Niektóre systemy operacyjne będą zgłaszać błędy ICMP jako awarię następnegosendto() na ten sam adres / port, dlatego musisz powtórzyć wiadomość kilka razy. Ale niektóre nie, w takim przypadku należy otworzyć określony port ICMP i przeanalizować wszystkie komunikaty zwrotne.

Nawet jeśli w jakiś sposób otrzymasz wiadomość ICMP, zrozum, że nie są one wiarygodne. Na przykład możesz dostaćICMP_UNREACH_PORT nawet jeśli aplikacja nie tylko nasłuchuje, ale aktywnie wysyła dane. (To rzadkie, ale widziałem, że tak się stało.)

Jeśli aplikacja działa na danym porcie i wiesz, czym jest ta aplikacja oraz jeśli wiesz, jak utworzyć wiadomość, która spowoduje, że aplikacja odpowie na ciebie, to wykonanie tego i uzyskanie odpowiedzi jest najlepszym wskazaniem, że jest otwarte. Ale brak odpowiedzi oznacza nic: może port jest zablokowany, może aplikacja nie jest uruchomiona lub może po prostu nie podobała się jej wiadomość.

Konkluzja: nie, nie do końca.

Powiązane pytania