Frage an port-scanning, udp, port, network-programming, c++ – Überprüfung des offenen UDP-Ports in C ++

5

Wie kann ich mithilfe von nativem C ++ überprüfen, ob ein Remote-UDP-Port geöffnet ist? Da UDP verbindungslos ist, wird angerufenconnect() ist nicht hilfreich. Ich kann nicht versuchen, es zu binden, da es nicht lokal ist.nmap kann auch nicht anzeigen. (jedochnetstat kann es herausfinden, aber ich denke, es geht um interne Informationen über offene Ports / Dateien). Gibt es sowieso, um es zu erkennen? Kann ich eine ICMP-Nachricht von C ++ senden, um den Status der nicht erreichbaren Ports zu überprüfen, wenn ich auf Netzwerkebene eine Schicht nach unten gehe? Würde das genug Informationen über den Hafenstatus geben?

Plattform ist Linux.

@EJP: oh? Erklären Sie mir bitte, warum bestimmte Socket-Vorgänge dann nur für privilegierte Benutzer zulässig sind.traceroute Beispielsweise sind einige Systeme aus diesem Grund eingeschränkt. Ich bin wirklich neugierig. 0xC0000022L
@STATUS_ACCESS_DENIED Nichts davon hat etwas mit einem Remote-Port zu tun. user207421
@STATUS_ACCESS_DENIED Diese Frage ist ebenfalls irrelevant. Er spricht über den Status eines Remote-Ports. Berechtigungen auf dem lokalen System haben nichts damit zu tun. Er muss mit dem Remote-System kommunizieren und benötigt dafür keine Berechtigungen. user207421
Es ist auf Linux-Plattform Mustafa

Deine Antwort

2   die antwort
5

dass Sie versuchen festzustellen, ob ein UDP-Port auf einem Remotecomputer durch eine Firewall geleitet wird und / oder eine Anwendung darauf ausgeführt wird.

Sie können dies nicht zuverlässig feststellen. Am ehesten können Sie versuchen, eine Reihe kleiner Datagramme an diese Adresse und diesen Port zu senden, die etwa 10 Sekunden lang einen Abstand von etwa 1 Sekunde haben.

Wenn keine Firewalls den Port blockieren und keine Anwendung ausgeführt wird, sendet das Remote-System möglicherweise eine Nachricht zurückICMP_UNREACH_PORT (Port nicht erreichbar). Wenn keine blockierenden Firewalls vorhanden sind und das Remote-System nicht funktioniert, sendet ein Router möglicherweise eine Nachricht zurückICMP_UNREACH_HOST oderICMP_UNREACH_NET. Wenn eine Firewall Sie blockiert, wird sie möglicherweise zurückgesendetICMP_UNREACH_FILTER_PROHIB, aber die meisten Firewalls senden nichts zurück.

Die Chancen, diese zu erhalten, sind gering, da die meisten Firewalls diese Art von ICMP-Feedback blockieren. Selbst wenn eine ICMP-Nachricht zurückkommt, können Sie sie unter Linux im Allgemeinen nur sehen, wenn Sie als Root ausgeführt werden. Einige Betriebssysteme melden ICMP-Fehler als Fehler des nächstensendto() an dieselbe Adresse / denselben Port, weshalb Sie die Nachricht mehrmals wiederholen müssen. Einige tun dies jedoch nicht. In diesem Fall müssen Sie einen bestimmten ICMP-Port öffnen und alle Rückmeldungen analysieren.

Selbst wenn Sie eine ICMP-Nachricht erhalten, sollten Sie sich dessen bewusst sein, dass diese nicht zuverlässig sind. Zum Beispiel könnte man bekommenICMP_UNREACH_PORT Auch wenn eine Anwendung nicht nur zuhört, sondern Ihnen aktiv Daten sendet. (Das ist selten, aber ich habe es gesehen.)

Wenn eine Anwendung auf dem angegebenen Port ausgeführt wird und Sie wissen, was diese Anwendung ist, und wenn Sie wissen, wie Sie eine Nachricht erstellen, die dazu führt, dass diese Anwendung auf Sie antwortet, ist dies der beste Hinweis darauf, dass der Port antwortet ist offen. Keine Antwort zu erhalten bedeutet jedoch nichts: Möglicherweise ist der Port blockiert, die Anwendung läuft nicht oder Ihre Nachricht hat ihr einfach nicht gefallen.

Fazit: Nein, nicht wirklich.

0

um zu überprüfen, ob ein Remote-Port für den Empfang Ihrer UDP-Datagramme bereit ist. Da UDP verbindungslos ist, können Sie einfach feststellen, ob der Remotehost etwas für Sie Bedeutendes beantwortet. Möglicherweise gibt es Möglichkeiten, einen Hinweis zu erhalten (wie dies bei Port-Scannern der Fall ist), aber das ist nichts, worauf ich mich im Produktionscode verlassen würde.

Verwandte Fragen