Wie schließe ich Ports unter Linux?

38

Ich habe eine Frage zum Schließen des Hafens. Ich glaube, ich habe einige seltsame Dinge.

Wenn ich Execute benutze

nmap --top-ports 10 192.168.1.1

Es zeigt, dass der 23 / TCP-Port offen ist.

Aber wenn ich ausführe

nmap --top-ports 10 localhost

es zeigt, dass der 23 / tcp-Port geschlossen ist.

Welcher von ihnen ist wahr? Ich möchte diesen Port auf meinem gesamten System schließen. Wie kann ich das tun?

user74080
quelle
10
sie sind beide wahr. TCP-Ports sind keinen Hosts zugeordnet. Sie sind mit Netzwerkschnittstellen verknüpft. Der Unterschied ist subtil, aber wichtig. Schnittstellen sind oft die gleichen wie Hosts, aber nicht immer. In diesem Fall wird (wie in den Antworten angegeben) localhostauf die lo(Loopback-) Schnittstelle zugegriffen. die IP - Adresse accesing Ihre reale Schnittstelle, wahrscheinlich eth0oder wlan0, etc. zu jagen.
Strugee
3
Die offensichtliche Naivität dieser Frage führte zu einigen großartigen Antworten. Danke für die Frage!
Dotancohen

Antworten:

47

Nmap ist ein großartiger Portscanner, aber manchmal möchten Sie etwas Authentischeres. Sie können den Kernel fragen, welche Prozesse welche Ports geöffnet haben, indem Sie das netstatDienstprogramm verwenden:

me @ myhost: ~ $ sudo netstat -tlnp
Aktive Internetverbindungen (nur Server)
Proto Recv-Q Send-Q Lokale Adresse Fremdadresse Status PID / Programmname
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 822 / cupsd       
tcp6 0 0 ::: 22 ::: * LISTEN 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * LISTEN 822 / cupsd       

Die Optionen, die ich gegeben habe, sind:

  • -t Nur TCP
  • -l Nur Listening-Ports
  • -n Suchen Sie nicht nach Dienst- und Hostnamen, sondern zeigen Sie nur die Nummern an
  • -p Prozessinformationen anzeigen (Root-Berechtigung erforderlich)

In diesem Fall können wir sehen, dass sshdauf jedem Interface ( 0.0.0.0) -Port 22 und cupsdauf Loopback ( 127.0.0.1) -Port 631 empfangsbereit ist. Ihre Ausgabe zeigt möglicherweise, dass telnetdeine lokale Adresse von vorhanden ist 192.168.1.1:23, was bedeutet, dass sie nicht auf Verbindungen auf dem Loopback-Adapter antwortet (zB kannst du nicht telnet 127.0.0.1).

Es gibt andere Tools, die ähnliche Informationen anzeigen (z. B. lsofoder /proc), aber netstat ist am weitesten verbreitet. Es funktioniert sogar unter Windows ( netstat -anb). BSD netstat ist etwas anders: Sie müssen stattdessen sockstat (1) verwenden , um die Prozessinformationen abzurufen .

Sobald Sie die Prozess-ID und den Programmnamen haben, können Sie den Prozess suchen und beenden, wenn Sie den Port schließen möchten. Für eine genauere Kontrolle können Sie eine Firewall (iptables unter Linux) verwenden, um den Zugriff nur auf bestimmte Adressen zu beschränken. Möglicherweise müssen Sie einen Dienststart deaktivieren. Wenn die PID unter Linux "-" ist, handelt es sich wahrscheinlich um einen Kernel-Prozess (dies ist beispielsweise bei NFS üblich).

Hinweis: Ich sagte "autorisierend", weil Sie nicht durch Netzwerkbedingungen und Firewalls behindert werden. Wenn Sie Ihrem Computer vertrauen, ist das großartig. Wenn Sie jedoch den Verdacht haben, dass Sie gehackt wurden, können Sie den Tools auf Ihrem Computer möglicherweise nicht vertrauen. Das Ersetzen von Standarddienstprogrammen (und manchmal sogar von Systemaufrufen) durch Dienstprogramme, die bestimmte Prozesse oder Ports (auch als Rootkits bezeichnet) verbergen, ist unter Angreifern Standard. Am besten ist es an dieser Stelle, eine forensische Kopie Ihrer Festplatte anzufertigen und diese von einem Backup wiederherzustellen. Verwenden Sie dann die Kopie, um festzustellen, wie sie eingegangen sind, und schließen Sie sie ab.

bonsaiviking
quelle
14

Ein Linux-System verfügt über eine sogenannte Loopback-Schnittstelle für die interne Kommunikation. Sein Hostname ist localhostund seine IP-Adresse ist 127.0.0.1.

Wenn Sie laufen nmapauf localhost, führen Sie tatsächlich die Portscan auf der virtuellen Loopback - Schnittstelle. 192.168.1.1ist die IP-Adresse Ihrer physischen (wahrscheinlichsten eth0) Schnittstelle.

Sie haben also nmapzwei verschiedene Netzwerkschnittstellen verwendet. Aus diesem Grund unterscheiden sich die offenen Ports. Sie sind beide wahr.

Wenn Sie den TCP-Port 23 geöffnet haben, ist es wahrscheinlich, dass telnetauf Ihrem Computer ein Server ausgeführt wird (was aufgrund der fehlenden Verschlüsselung keine gute Sache ist) oder Sie haben eine Art Trojaner.

psimon
quelle
1
Wie kann ich es schließen?
user74080
4
@ user74080 Sie können eine iptablesRegel hinzufügen, wie eine Antwort in der Nähe nahelegt. Dadurch bleibt der Dienst jedoch ungenutzt, wodurch Ressourcen verbraucht werden. Also, wenn Sie telnetdgelaufen sind, fahren Sie es einfach herunter.
Psimon
12

Zum "Schließen" des Ports, den Sie verwenden können iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP
Bach
quelle
1
In dieser Antwort bedeutet "Schließen des Ports" "Ignorieren des Datenverkehrs". Der Hafen ist noch offen, aber nicht mehr erreichbar. Beachten DROPSie auch, dass es das Paket sieht und es dann ignoriert. Normalerweise (ohne aktivierte iptables) würde der Kernel ein nicht erreichbares ICMP-Port-Paket zurücksenden (das mit dem REJECTZiel simuliert werden kann DROP).
Lekensteyn
3
@Lekensteyn ICMP-Port nicht erreichbar ist für UDP. Das richtige Paket, mit dem geantwortet werden soll, ist ein TCP-RST-Paket, das auch mithilfe des REJECTZiels durch Schreiben generiert werden kann -j REJECT --reject-with tcp-reset.
Kasperd
Trotz der geringeren Punktzahl ist dies die allererste Antwort, um die Frage tatsächlich zu beantworten. Wer hier mehr Punkte hinzufügen kann, tut dies bitte.
EnzoR
2

Wenn Sie dies tun nmap localhost, werden Sie auf eine andere Situation hingewiesen: Einige Linux-Programme arbeiten als Server, obwohl sie nur lokal verwendet werden. Dies liegt daran, dass andere Programme sie wie einen Server verwenden, zu dem sie eine Verbindung herstellen. Beide Antworten sind also richtig, da Sie etwas anderes fragen.

Port 23 wird für Telnet verwendet. Wird normalerweise nicht mehr verwendet. Versuchen Sie nmap -sV 192.168.1.1herauszufinden, welches Programm den Port öffnet.

(192 ... ist eine lokale Netzwerk-IP, daher ergibt das Ergebnis von nmap <your outside world IP>aufgrund möglicher Firewall-Einstellungen usw. auch ein anderes Ergebnis.)

PythoNic
quelle
1

Wenn ein Dienst auf Port 23 ausgeführt und abgehört wird, ist es (wahrscheinlich ) besser, den Prozess zu beenden, der auf Port 23 lauscht, telnetals ihn weiter auszuführen und Port 23 zu schließen oder zu blockiereniptables .

Wenn an einem Port kein Prozess Zuhörens ist, auch in Abwesenheit eines Firewall - Block, jeder Versuch , eine Verbindung zu ihm in einer sofortigen führen sollte „Verbindung abgelehnt“ ( ECONNREFUSEDzu connect(2))

Ein Weg, um den Prozess (und seine PID) zu finden, der auf Port 23 lauscht, wenn es einen solchen Prozess gibt, ist:

sudo lsof -i -P | grep ':23 '

In den obigen -iListen sind offene Internet-Ports (sowohl UDP als auch TCP) aufgeführt, und -P sperrt die Übersetzung von Ports in Dienstnamen (über /etc/services).

Nachdem Sie festgestellt haben, dass der laufende Prozess an Port 23 empfangsbereit ist, können Sie anhand des Prozessbaums (mit say, pstree) herausfinden, wie er gestartet wurde . Wenn das übergeordnete Element init(sehr wahrscheinlich) ist, können Sie unter rekursiv nach dem Namen des Prozesses suchen /etc. z.B:

sudo grep -r telnet /etc

Dies sollte Sie zu der besten Möglichkeit führen, die Ausführung zu deaktivieren.

Arielf
quelle
Es ist nicht erforderlich, grep zu verwenden (und wenn dies der Fall wäre, wären keine Anführungszeichen erforderlich). Sie können verwenden sudo lsof -Pi :23.
Théophile
Die Zitate sind aus gutem Grund da. Um sicherzustellen, dass nur der Telnet-Port ( 23) übereinstimmt. Wenn Sie nach dem ein Leerzeichen :23:234:2345
einfügen,
Ah ich sehe. Das macht für grep Sinn. Übrigens scheint der Befehl ohne grep ( lsof -Pi :23) nach einer exakten Übereinstimmung zu suchen .
Théophile