Πως ελευθερώνω την θύρα 80 από μία υπηρεσία που θέλω να διακόψω;


title: Πως ελευθερώνω την θύρα 80 από μία υπηρεσία που θέλω να διακόψω;
alternative title: How to free port 80 from a service I want to terminate?
contributors: @nikaskonstantinos
language: el
date: 12/05/2021
resolved by: @Asfodelus, @GNUTechie
category: Αντιμετώπιση προβλημάτων
tags: network, howto, linux


Χριστός Ανέστη
Καλησπέρα linux users.

Πως μπορώ να ελευθερώσω την θύρα 80 από μία υπηρεσία που θέλω να διακόψω;
Για παράδειγμα την υπηρεσία εξυπηρετητή http.
Το αποτέλεσμα της

nmap 192.168.xxx.xxx

από άλλη συσκευή στο τοπικό δίκτυο
είναι το παρακάτω:

PORT STATE SERVICE 80/tcp open http

Το αποτέλεσμα της

sudo fuser 80/tcp

είναι το παρακάτω:

80/tcp: 904

IANA Ports List

Διευκρίνηση: πρόκειται για μια υπηρεσία http στη θύρα 80/tcp μετά από απεγκατάσταση του Pi-hole από έναν “home-server” σε raspberrypi 4.
Άνοιξα ένα νέο νήμα για τη διαδικασία της απεγκατάστασης του Pi-hole.

1 «Μου αρέσει»

κατα πασα πιθανοτητα με την εντολη:

sudo kill -9 904

μιας και το αποτελεσμα της παραπανω fuser εντολης θα σου δωσει το process id (PID για συντομια) του προγραμματος που δεσμευει την θυρα 80/tcp

O “σωστός” τρόπος για να βρεις την διεργασία που χρησιμοποιεί μια πόρτα είναι με την βοήθεια της εντολής ss (socket statistics ). H εντολή netstat είναι προς απόσυρση (depracated).

Η εντολή ss -tulpn (tcp,udp,listening,process,numeric) θα μας δείξει ποιες πόρτες είναι ανοικτές, και για να βρούμε ποιο πρόγραμμα παρέχει μια συγκεκριμένη υπηρεσία ss -tulp | grep http:

tcp    LISTEN   0        1024             0.0.0.0:http            0.0.0.0:*      users:(("lighttpd",pid=814,fd=4))    
tcp    LISTEN   0        1024             0.0.0.0:https           0.0.0.0:*      users:(("lighttpd",pid=814,fd=6))    
tcp    LISTEN   0        1024                [::]:http               [::]:*      users:(("lighttpd",pid=814,fd=5))    
tcp    LISTEN   0        1024                [::]:https              [::]:*      users:(("lighttpd",pid=814,fd=7))

Είναι το πρόγραμμα "lighttpd" που έχει pid=814. Δεν αρκεί να τερματίσω το 814 όμως γιατί κάτι το ξεκίνησε. Πιθανά κάτι να παρακολουθεί αν έχει τερματιστεί και να το τρέξει ξανά και μάλλον θα ξεκινήσει ξανά στην επανεκκίνηση του υπολογιστή. Θα πρέπει να βρεις και να τερματίσεις την υπηρεσία.

Εδώ δεν υπάρχει κάποιος γενικός τρόπος. Η εντολή pstree ίσως βοηθήσει, όπως και τα logs (πες πως δεν ξέρεις τι είναι το lighttpd). Μια καλή αρχή είναι να δεις αν υπάρχει κάποια υπηρεσία με αυτό το όνομα

root@PiGizmo:~# systemctl status lighttpd
 lighttpd.service - Lighttpd Daemon
   Loaded: loaded (/lib/systemd/system/lighttpd.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-05-10 17:45:15 EEST; 2 days ago
  Process: 801 ExecStartPre=/usr/sbin/lighttpd -tt -f /etc/lighttpd/lighttpd.conf (code=exite
d, status=0/SUCCESS)
 Main PID: 814 (lighttpd)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/lighttpd.service
           └─814 /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf

Ναι το pid ταιριάζει οπότε το πετύχαμε. Σταματάμε και απενεργοποιούμε την υπηρεσία και δεν ασχολούμαστε ξανά με αυτό.

Και μετά που το έγραψα αυτό, βρήκα πως είναι το θέμα (περίπου) του σημερινού Linux Upskill Challenge, το σχετικό βίντεο

1 «Μου αρέσει»
pi@raspberrypi:~ $
nmap localhost
Starting Nmap 7.70 ( https://nmap.org ) at 2021-05-13 13:34 EEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00055s latency).
rDNS record for 127.0.0.1: localhost.localdomain
Not shown: 992 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http

<και κάποιες άλλες υπηρεσίες που δεν εμφανίζω>

Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
pi@raspberrypi:~ $
ss -tulp | grep http 
tcp     LISTEN   0        1024                                          0.0.0.0:http                                               0.0.0.0:*                    
tcp     LISTEN   0        1024                                             [::]:http                                                  [::]:*                    
pi@raspberrypi:~ $
systemctl status lighttpd
● lighttpd.service - Lighttpd Daemon
   Loaded: loaded (/lib/systemd/system/lighttpd.service; enabled;
   Active: active (running) since Wed 2021-05-12 20:26:09 EEST; 1
 Main PID: 904 (lighttpd)
    Tasks: 6 (limit: 4915)
   CGroup: /system.slice/lighttpd.service
           ├─904 /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.
           ├─911 /usr/bin/php-cgi
           ├─993 /usr/bin/php-cgi
           ├─994 /usr/bin/php-cgi
           ├─995 /usr/bin/php-cgi
           └─998 /usr/bin/php-cgi

May 12 20:26:08 raspberrypi systemd[1]: Starting Lighttpd Daemon.
May 12 20:26:09 raspberrypi systemd[1]: Started Lighttpd Daemon.
lines 1-15/15 (END)

Πράγματι στη συγκεκριμένη περίπτωση η υπηρεσία με PID 904 είναι ή lighttpd.

Τι πρέπει να επιλέξω;

systemctl stop lighttpd
systemctl disable lighttpd

αν δεν επιλέξω:

sudo kill -9 904

σύμφωνα με τον @GNUTechie ,

ή

sudo fuser -k 80/tcp

:ballot_box_with_check:Τελικά λύθηκε με τις εντολές:

pi@raspberrypi:~ $ sudo systemctl stop lighttpd
pi@raspberrypi:~ $ systemctl status lighttpd
● lighttpd.service - Lighttpd Daemon
  Loaded: loaded (/lib/systemd/system/lighttpd.service; enabled; vendor preset: enabled)
  Active: inactive (dead) since Thu 2021-05-13 16:03:26 EEST; 18s ago
 Process: 904 ExecStart=/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf (code=exited, status=0/SUCCESS)
Main PID: 904 (code=exited, status=0/SUCCESS)

May 12 20:26:08 raspberrypi systemd[1]: Starting Lighttpd Daemon...
May 12 20:26:09 raspberrypi systemd[1]: Started Lighttpd Daemon.
May 13 16:03:26 raspberrypi systemd[1]: Stopping Lighttpd Daemon...
May 13 16:03:26 raspberrypi systemd[1]: lighttpd.service: Succeeded.
May 13 16:03:26 raspberrypi systemd[1]: Stopped Lighttpd Daemon.
pi@raspberrypi:~ $ sudo systemctl disable lighttpd
Synchronizing state of lighttpd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable lighttpd
Removed /etc/systemd/system/multi-user.target.wants/lighttpd.service.

Σε αυτη την περιπτωση ο @Asfodelus ειναι σωστος. Οταν προκειται για services πας παντα μεσω του systemctl (ή της εντολης service, οταν προκειται για διανομες χωρις το systemd). Η δικια μου προταση ειναι σωστη οταν εχεις καποιο ξωφαλτσο προγραμμα που μπλοκαρει TCP θυρες που θες να χρησιμοποιησεις με services ή αλλα προγραμματα.

2 «Μου αρέσει»

Αυτό το νήμα έκλεισε αυτόματα 2 ημέρες μετά την τελευταία απάντηση. Δεν επιτρέπονται πλέον νέες απαντήσεις.