Hogyan ellenőrizhetjük Debian vagy Ubuntu Linux operációs rendszerünk használatban lévő, illetve szabad TCP/UDP portjait?

botond küldte be 2022. 10. 23., v – 08:20 időpontban

Tartalom

 

Bevezető

Egy Linux operációs rendszeren több szolgáltatás is működhet, pláne egy összetettebb webszerver telepítésen. Ezek a szolgáltatások különböző TCP (Transmission Control Protocol) vagy UDP (User Datagram Protocol) portokon keresztül kommunikálnak a hálózati interfészen. A figyelő port egy hálózati port, amelyen egy alkalmazás vagy folyamat figyel, és kommunikációs végpontként működik.

A portok ellenőrzése több szempontból is fontos feladat. Egyrészt a biztonság érdekében figyelnünk kell a nyitott portokat, és az azokon történő kommunikációt, amik nagy részét a különböző szolgáltatások által generált naplófájlok áttekintésével is ellenőrizhetjük, de akár direktben is megvizsgálhatjuk a portokat, hogy zajlik-e rajtuk kommunikáció és az a normális működés keretein belül történik-e vagy éppen támadja valaki a szerverünket. Másrészt a hibalehetőségek számát is csökkenthetjük, amik abból erednek, hogy több hasonló szolgáltatás ugyanazt a portot használná. Ilyenkor egyedileg kell átállítani valamelyik szolgáltatást, hogy ne ugyanazt a portot használja. Továbbá szintén a biztonságot figyelembe véve megelőzés céljából szabad egyedi portokat is kereshetünk adott szolgáltatásoknak, hogy azok ne az alapértelmezett - egyben ismert - portokat használják, ezzel csökkentve a támadási kísérletek számát.

A portok ellenőrzése, vizsgálata bármelyik okból is történjen, ebben a leírásban átnézünk néhány parancsot és módszert amivel hatékonyan ellenőrizhetjük ezeknek a működését.

 

 

Portok áttekintése

Először tekintsünk bele a portok számozásába, hogy jobban átláthassuk ezek struktúráját.

Portszámok és tartományok

A portok száma egy 0 és 65535 közötti tartományba eső egész szám lehet, amely tartomány három fő részre oszlik:

  • 0-1023: A közismertebb portok, amik hozzá vannak rendelve valamilyen szolgáltatáshoz, és a rendszer vezérli ezeket a portokat.
    Ebben a tartományban tehát nem használhatunk fel saját, egyedi portokat. Ezekről lejjebb kicsit részletesebben...
  • 1024-49151: Regisztrált portok. Az ebbe a tartományba eső portok nincsenek hozzárendelve vagy vezérelve, de regisztrálhatók a többszörözés elkerülése érdekében.
    Ebben a tartományban használhatunk saját egyedi portokat, de minden esetben győződjünk meg róla, hogy azon a porton nem működik semmilyen szolgáltatás.
  • 49152-65535: Dinamikus portok. Az ebbe a tartományba eső portok nincsenek hozzárendelve, vezérelve vagy regisztrálva. Ideiglenes vagy privát portokhoz használják. Ezeket privát vagy nem fenntartott portoknak is nevezik. A kliensek átmeneti portszámokat választanak ebből a tartományból, de nem minden rendszer teszi ezt lehetővé.
    Ebből a tartományból is választhatunk magunknak portszámot, de itt is győződjünk meg róla, hogy nem működik alatta semmi.

Közismert portok és szolgáltatások

Íme néhány gyakran előforduló szolgáltatás az alsó (0-1023) címtartományból, és azoknak alapértelmezett portszámai (a teljesség igénye nélkül):

  • 20/21 (TCP): FTP
  • 22 (TCP): SSH
  • 23 (TCP): Telnet
  • 25 (TCP/UDP): SMTP
  • 53 (TCP/UDP): DNS
  • 67/68 (UDP): DHCP
  • 69 (UDP): TFTP
  • 80 (TCP): HTTP
  • 110 (TCP): POP3
  • 123 (UDP): NTP
  • 137/138/139 (TCP/UDP): NetBIOS
  • 143 (TCP): IMAP (SSL/TLS nélküli, vagy STARTTLS)
  • 161/162 (TCP/UDP): SNMP
  • 179 (TCP): BGP
  • 389 (TCP/UDP): LDAP
  • 443 (TCP): HTTPS
  • 465 (TCP/UDP): SMTP (TLS)
  • 587(TCP/UDP): SMTP (TLS)
  • 636 (TCP/UDP): LDAPS
  • 989/990 (TCP): FTPS
  • 993 (TCP): IMAPS (IMAP SSL/TLS használatával)

A teljes listát a /etc/services fájlban tekinthetjük meg:

cat /etc/services

A fájl tartalmazza azokat a szolgáltatásokat, amelyek ha telepítésre kerülnek, akkor a megadott portszámon fogják hallgatni a beérkező adatcsomagokat.

 

Portok ellenőrzésére szolgáló parancsok

A hálózati portok ellenőrzésére többféle parancs is létezik, valamint ezeket a parancsokat is sorolhatjuk kétféle felhasználási módba (belső vagy külső használat). Ebben a részben megnézünk  ezekre néhány példát.

Az itt következő példákat egy Debian 10 (Buster) tökéletes szerver 1.0 telepítés utódján, az 1.1-es változaton hajtom végre, mivel ezen a szerveren már elég sok szolgáltatás működik ahhoz, hogy demonstrálni lehessen velük a portok ellenőrzését, vizsgálatát.

Portok belülről történő ellenőrzésére szolgáló parancsok

A belülről történő ellenőrzésre szolgáló parancsokat magáról a szerverről futtatjuk, és a szerveren futó, tehát "saját" szolgáltatások és portok ellenőrzésére használjuk.

Lássuk is az erre a célra használható parancsokat!

netstat

A netstat parancs segítségével hálózati kapcsolatokat és interfészstatisztikákat jeleníthetünk meg. Teljes körű használatához root jogosultság szükséges. Telepítéséhez Debian/Ubuntu rendszereken futtassuk az alábbi parancsot:

sudo apt-get install net-tools
A listen (hallgató) portok listázása

A várakozó (hallgató, listen) portok kilistázásához futtassuk az alábbi parancsot:

sudo netstat -tunlp

Ahol a kapcsolók jelentései az alábbiak:

  • -t: TCP portok megjelenítése
  • -u: UDP portok megjelenítése
  • -n: IP-címek használata hosztnevek helyett.
  • -l: Csak a "hallgató" (listen) portokat listázza, tehát amelyiket figyel valamilyen szolgáltatás (daemon)
  • -p: Megjeleníti a hallgató folyamat processz ID-jét és nevét is.

A kimenete pedig:

A netstat parancs használata

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      22616/dovecot
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      22616/dovecot
tcp        0      0 127.0.0.1:10023         0.0.0.0:*               LISTEN      708/postgrey --pidf
tcp        0      0 127.0.0.1:10024         0.0.0.0:*               LISTEN      21188/amavisd-new (
tcp        0      0 127.0.0.1:10025         0.0.0.0:*               LISTEN      20373/master
tcp        0      0 127.0.0.1:10026         0.0.0.0:*               LISTEN      21188/amavisd-new (
tcp        0      0 127.0.0.1:10027         0.0.0.0:*               LISTEN      20373/master
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN      20373/master
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      500/memcached
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      22616/dovecot
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      22616/dovecot
[...]

A kapott kimenet oszlopainak jelentése:

  • Proto: A használt protokoll típusa (tcp, udp, udpl vagy raw). A "tcp6" az IPv6 címekre vonatkozó adatok.
  • Recv-Q: Ha itt nem nulla érték van, az annyit jelent, hogy az adatok még a TCP/IP fogadási pufferben vannak, de még nem kerültek kiírásra az alkalmazáspufferbe.
  • Send-Q: Ugyanaz, mint az előző, csak a küldési oldalról: az adatok a TCP/IP küldési pufferbe kerültek, de még nem kerültek elküldésre, vagy elküldték, de még nem lettek nyugtázva. Ha itt magas érték található, akkor azt okozhatja például hálózati torlódás, vagy a szerver teljesítménye, stb.
  • Local Address: Az adatátvitel helyi végpontjának az IP-címe valamint a portszáma. Ha nincs megadva a -n kapcsoló, akkor a parancs feloldja az IP-címet, és helyette a hosztnevet jeleníti meg, ami a helyi végponton a "localhost".
  • Foreign Address: Az adatátvitel távoli végpontjának az IP-címe valamint portszáma. Ha nincs megadva a -n kapcsoló, akkor a parancs feloldja a távolról adatokat küldő vagy fogadó gép IP-címet, és helyette annak a hosztnevét jeleníti meg, amihez a DNS szolgáltatásnak köszönhetően jut hozzá.
    A jelenlegi példában szereplő "0.0.0.0:*" azt jelenti, hogy a rendszer várja a bármilyen IP-címről és (távoli) portról érkező kapcsolatokat.
  • State: Állapot. A "LISTEN" jelzés azt jelenti, hogy a rendszer várakozik a bejövő új kapcsolatokra a megadott portokon, amik azért jelennek meg, mert a -l vagy a -a kapcsolóval futtattuk a parancsot.
  • PID/Program name: A kapcsolatot birtokló folyamat folyamatazonosítója (PID) és a nevének a megjelenítése, ami a -p kapcsoló hatására kerül a parancs kimenetébe. Ennek az információnak a megjelenítése root jogosultságot igényel, főleg ha olyan folyamatok is futnak, amik nem a netstat parancsot futtató felhasználó tulajdonában vannak.

Ezzel a példával tehát megjeleníthetjük azokat a portokat, ahol a szerverünk várja a beérkező kapcsolódásokat. Láthatunk itt például IMAPS (IMAP over SSL) szolgáltatást a Dovecot levelező szerver által a 993-as és 995-ös portokon, illetve a hagyományos (nem SSL/TLS titkosított) változatát a 110 és 143 portokon, MySQL kiszolgálót a 3306-os porton, Apache2 webkiszolgálót a 80 (HTTP), 8080 (ISPConfig elérése) és a 443 (HTTPS) portokon, és még egy jónéhány egyéb szolgáltatást, amik mind várják a kapcsolódásokat a távoli kliensekről.

 

 

Az aktív használatban lévő portok listázása

De mi van, ha azt szeretnénk megnézni, hogy jelenleg mely szolgáltatásokhoz csatlakozik éppen valami? Erre az alábbi példa szolgál:

sudo netstat -tunp

Egyszerűen csak kivettük a -l kapcsolót. A kimenet pedig:

A netstat parancs használata - Aktuális csatlakozások

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:143           127.0.0.1:50548         TIME_WAIT   -
tcp        0      0 192.168.1.130:22        192.168.1.100:41616     ESTABLISHED 9269/sshd: linuxpor
tcp        0      0 127.0.0.1:50548         127.0.0.1:143           TIME_WAIT   -
tcp6       0      0 192.168.1.130:8080      192.168.1.3:62302       TIME_WAIT   -
tcp6       0      0 192.168.1.130:443       192.168.1.3:62543       TIME_WAIT   -
tcp6       0      0 192.168.1.130:8080      192.168.1.3:62390       TIME_WAIT   -
tcp6       0      0 192.168.1.130:443       192.168.1.3:62544       TIME_WAIT   -
tcp6       0      0 192.168.1.130:443       192.168.1.3:62542       TIME_WAIT   -
tcp6       0      0 192.168.1.130:443       192.168.1.3:62389       TIME_WAIT   -
tcp6       0      0 192.168.1.130:8080      192.168.1.3:62589       ESTABLISHED 27044/apache2

Itt viszont azt láthatjuk, hogy van egy SSH csatlakozásunk a 22-es porton az SSHD szolgáltatáson keresztül, ami ebben a példában a saját terminálom, amivel csatlakozom ehhez a szerverhez, valamint Az Apache kiszolgálóhoz is csatlakozik valami. Ez pedig azért van, mert egy böngészőben megnyitogattam ennek a szervernek a különböző webes dolgait. így például ezek a webes alkalmazások csatlakoznak a böngészőn keresztül a szerver több portjához (143, 8080) is. A másodjára lefuttatott parancs kimenete csak annyiban különbözik az elsőétől, hogy a parancs futtatása előtt közvetlenül rá is frissítettem ezekre a webes részekre, hogy a példa kedvéért felszaporodjanak az Apache kapcsolatok száma. Így például a szerverre telepített Drupal9-es CMS rendszerre a böngészőben frissítve megnövekedett a parancs kimenetében az apache2 tételek száma.

Ebben a példában a State oszlop három új állapot értéket jelenít meg, amiknek a jelentése az alábbi:

  • TIME_WAIT: A kapcsolati végpont (socket) a hálózaton lévő csomagok lezárása után várakozik.
  • FIN_WAIT2: A kapcsolat lezárult, de még várja a távoli géptől a lezárást. Tulajdonképpen még egy nyugtázási jelet vár.
  • ESTABLISHED: A kapcsolat ki van építve, amelyen aktív adatforgalom zajlik.

Természetesen ezeknél még van több állapot jelzés, ezekről a netstat parancs manual oldalán tájékozódhatunk.

Az összes szolgáltatáshoz rendelt port listázása

Ha pedig meg szeretnénk jeleníteni egyszerre a várakozó (LISTEN) portokat és a már kapcsolatot fenntartó (ESTABLISHED/TIME_WAIT, stb) portokat is, akkor használjuk a rövid -a vagy a hosszabb --all kapcsolót:

sudo netstat -tunpa
sudo netstat -tunp --all
Szabad portok keresése, ellenőrzése

Ha szabad portot szeretnénk keresni, akkor azt megtehetjük az alábbi parancs segítségével:

sudo netstat -tunpa | grep <portszám>

Ha ez ad valamilyen kimenetet, akkor értelemszerűen van a porton valami szolgáltatás, ha nem ad kimenetet, akkor pedig használható a port.

Például először megnézzük a 443-as (HTTPS) portot, majd utána egy szabadon választott egyedi portot, például a 57345-ös számút:

sudo netstat -tunpa | grep 443
sudo netstat -tunpa | grep 57345

A netstat parancs használata - Szabad port keresése

Az első parancsra természetesen kiadta a HTTPS-en kapcsolódó böngészőt a megnyitott weboldallal, míg a második parancs nem adott kimenetet. így tehát a második lekérdezett portszám szabadon felhasználható.

 

A netstat parancs segítségével tehát egyszerűen jeleníthetjük meg a várakozó, illetve a már kapcsolatot létesített portokat és szolgáltatásokat, valamint nem használt portokat is kereshetünk az eredmények leszűrésével. Egy porton természetesen több kapcsolódás is lehetséges.

 

 

ss

Az ss (socket statistics) parancsot az új netstat-ként is emlegetik. Ugyan hiányzik belőle néhány netstat funkció, de több TCP állapotot tesz közzé, és valamivel gyorsabb is. A parancs opciói többnyire megegyeznek, ezért nem nehéz áttérni a netstatról az ss-re. A parancs teljes körű használatához root jogosultság szükséges. Telepítéséhez Debian/Ubuntu rendszereken futtassuk az alábbi parancsot:

sudo apt-get install iproute2
A listen (hallgató) portok listázása

A várakozó (hallgató, listen) portok kilistázásához futtassuk az alábbi parancsot:

sudo ss -tunlp

A kapcsolók tehát itt is ugyanazok, mint a netstat esetén:

  • -t: Csak a TCP portok megjelenítése (ezzel kiszűri a többi, nem megjelenítendő protokollt)
  • -u: Csak az UDP portok megjelenítése (ezzel kiszűri a többi, nem megjelenítendő protokollt)
  • -n: IP-címek használata hosztnevek helyett.
  • -l: Csak a "hallgató" (listen) portokat listázza, tehát amelyiket figyel valamilyen szolgáltatás (daemon)
  • -p: Megjeleníti a hallgató folyamat processz ID-jét és nevét is.

A kimenet:

Az ss parancs használata - A listen (figyelő) portok listázása

Így talán áttekinthetőbb:

Netid                    State                     Recv-Q                    Send-Q                                                           Local Address:Port                                        Peer Address:Port                   
udp                      UNCONN                    0                         0                                                                192.168.1.130:53                                               0.0.0.0:*                       users:(("named",pid=23040,fd=520),("named",pid=23040,fd=519),("named",pid=23040,fd=518))
udp                      UNCONN                    0                         0                                                                    127.0.0.1:53                                               0.0.0.0:*                       users:(("named",pid=23040,fd=517),("named",pid=23040,fd=516),("named",pid=23040,fd=515))
udp                      UNCONN                    0                         0                                                                192.168.1.130:123                                              0.0.0.0:*                       users:(("ntpd",pid=563,fd=19))
udp                      UNCONN                    0                         0                                                                    127.0.0.1:123                                              0.0.0.0:*                       users:(("ntpd",pid=563,fd=18))
udp                      UNCONN                    0                         0                                                                      0.0.0.0:123                                              0.0.0.0:*                       users:(("ntpd",pid=563,fd=17))
udp                      UNCONN                    0                         0                                                                         [::]:53                                                  [::]:*                       users:(("named",pid=23040,fd=514),("named",pid=23040,fd=513),("named",pid=23040,fd=512))
udp                      UNCONN                    0                         0                                            [fe80::a00:27ff:fe4e:950c]%enp0s3:123                                                 [::]:*                       users:(("ntpd",pid=563,fd=24))
udp                      UNCONN                    0                         0                                                                        [::1]:123                                                 [::]:*                       users:(("ntpd",pid=563,fd=20))
udp                      UNCONN                    0                         0                                                                         [::]:123                                                 [::]:*                       users:(("ntpd",pid=563,fd=16))
tcp                      LISTEN                    0                         128                                                                    0.0.0.0:993                                              0.0.0.0:*                       users:(("dovecot",pid=22616,fd=42))
tcp                      LISTEN                    0                         100                                                                    0.0.0.0:995                                              0.0.0.0:*                       users:(("dovecot",pid=22616,fd=23))
tcp                      LISTEN                    0                         128                                                                  127.0.0.1:10023                                            0.0.0.0:*                       users:(("postgrey --pidf",pid=708,fd=5))
tcp                      LISTEN                    0                         128                                                                  127.0.0.1:10024                                            0.0.0.0:*                       users:(("/usr/sbin/amavi",pid=22228,fd=6),("/usr/sbin/amavi",pid=22223,fd=6),("/usr/sbin/amavi",pid=21188,fd=6))
tcp                      LISTEN                    0                         100                                                                  127.0.0.1:10025                                            0.0.0.0:*                       users:(("master",pid=20373,fd=124))
tcp                      LISTEN                    0                         128                                                                  127.0.0.1:10026                                            0.0.0.0:*                       users:(("/usr/sbin/amavi",pid=22228,fd=8),("/usr/sbin/amavi",pid=22223,fd=8),("/usr/sbin/amavi",pid=21188,fd=8))
tcp                      LISTEN                    0                         100                                                                  127.0.0.1:10027                                            0.0.0.0:*                       users:(("master",pid=20373,fd=127))
tcp                      LISTEN                    0                         100                                                                    0.0.0.0:587                                              0.0.0.0:*                       users:(("master",pid=20373,fd=18))
tcp                      LISTEN                    0                         128                                                                  127.0.0.1:11211                                            0.0.0.0:*                       users:(("memcached",pid=500,fd=26))
tcp                      LISTEN                    0                         100                                                                    0.0.0.0:110                                              0.0.0.0:*                       users:(("dovecot",pid=22616,fd=21))
tcp                      LISTEN                    0                         128                                                                    0.0.0.0:143                                              0.0.0.0:*                       users:(("dovecot",pid=22616,fd=40))
tcp                      LISTEN                    0                         100                                                                    0.0.0.0:465                                              0.0.0.0:*                       users:(("master",pid=20373,fd=22))
tcp                      LISTEN                    0                         10                                                               192.168.1.130:53                                               0.0.0.0:*                       users:(("named",pid=23040,fd=23))
tcp                      LISTEN                    0                         10                                                                   127.0.0.1:53                                               0.0.0.0:*                       users:(("named",pid=23040,fd=22))
tcp                      LISTEN                    0                         9                                                                      0.0.0.0:21                                               0.0.0.0:*                       users:(("pure-ftpd-mysql",pid=23009,fd=4))
tcp                      LISTEN                    0                         128                                                                    0.0.0.0:22                                               0.0.0.0:*                       users:(("sshd",pid=580,fd=3))
tcp                      LISTEN                    0                         128                                                                  127.0.0.1:953                                              0.0.0.0:*                       users:(("named",pid=23040,fd=24))
tcp                      LISTEN                    0                         100                                                                    0.0.0.0:25                                               0.0.0.0:*                       users:(("master",pid=20373,fd=13))
tcp                      LISTEN                    0                         128                                                                       [::]:993                                                 [::]:*                       users:(("dovecot",pid=22616,fd=43))
tcp                      LISTEN                    0                         100                                                                       [::]:995                                                 [::]:*                       users:(("dovecot",pid=22616,fd=24))
tcp                      LISTEN                    0                         128                                                                      [::1]:10023                                               [::]:*                       users:(("postgrey --pidf",pid=708,fd=6))
tcp                      LISTEN                    0                         128                                                                      [::1]:10024                                               [::]:*                       users:(("/usr/sbin/amavi",pid=22228,fd=7),("/usr/sbin/amavi",pid=22223,fd=7),("/usr/sbin/amavi",pid=21188,fd=7))
tcp                      LISTEN                    0                         128                                                                      [::1]:10026                                               [::]:*                       users:(("/usr/sbin/amavi",pid=22228,fd=9),("/usr/sbin/amavi",pid=22223,fd=9),("/usr/sbin/amavi",pid=21188,fd=9))
tcp                      LISTEN                    0                         80                                                                           *:3306                                                   *:*                       users:(("mysqld",pid=19462,fd=144))
tcp                      LISTEN                    0                         100                                                                       [::]:587                                                 [::]:*                       users:(("master",pid=20373,fd=19))
tcp                      LISTEN                    0                         100                                                                       [::]:110                                                 [::]:*                       users:(("dovecot",pid=22616,fd=22))
tcp                      LISTEN                    0                         128                                                                       [::]:143                                                 [::]:*                       users:(("dovecot",pid=22616,fd=41))
tcp                      LISTEN                    0                         128                                                                          *:8080                                                   *:*                       users:(("apache2",pid=27780,fd=10),("apache2",pid=27045,fd=10),("apache2",pid=27010,fd=10),("apache2",pid=26893,fd=10),("apache2",pid=26092,fd=10),("apache2",pid=26089,fd=10),("apache2",pid=26088,fd=10),("apache2",pid=26052,fd=10),("apache2",pid=22889,fd=10),("apache2",pid=5822,fd=10),("apache2",pid=4003,fd=10),("apache2",pid=1722,fd=10))
tcp                      LISTEN                    0                         128                                                                          *:80                                                     *:*                       users:(("apache2",pid=27780,fd=4),("apache2",pid=27045,fd=4),("apache2",pid=27010,fd=4),("apache2",pid=26893,fd=4),("apache2",pid=26092,fd=4),("apache2",pid=26089,fd=4),("apache2",pid=26088,fd=4),("apache2",pid=26052,fd=4),("apache2",pid=22889,fd=4),("apache2",pid=5822,fd=4),("apache2",pid=4003,fd=4),("apache2",pid=1722,fd=4))
tcp                      LISTEN                    0                         128                                                                          *:8081                                                   *:*                       users:(("apache2",pid=27780,fd=8),("apache2",pid=27045,fd=8),("apache2",pid=27010,fd=8),("apache2",pid=26893,fd=8),("apache2",pid=26092,fd=8),("apache2",pid=26089,fd=8),("apache2",pid=26088,fd=8),("apache2",pid=26052,fd=8),("apache2",pid=22889,fd=8),("apache2",pid=5822,fd=8),("apache2",pid=4003,fd=8),("apache2",pid=1722,fd=8))
tcp                      LISTEN                    0                         100                                                                       [::]:465                                                 [::]:*                       users:(("master",pid=20373,fd=23))
tcp                      LISTEN                    0                         10                                                                        [::]:53                                                  [::]:*                       users:(("named",pid=23040,fd=21))
tcp                      LISTEN                    0                         9                                                                         [::]:21                                                  [::]:*                       users:(("pure-ftpd-mysql",pid=23009,fd=5))
tcp                      LISTEN                    0                         128                                                                          *:4949                                                   *:*                       users:(("munin-node",pid=663,fd=5))
tcp                      LISTEN                    0                         128                                                                       [::]:22                                                  [::]:*                       users:(("sshd",pid=580,fd=4))
tcp                      LISTEN                    0                         128                                                                      [::1]:953                                                 [::]:*                       users:(("named",pid=23040,fd=25))
tcp                      LISTEN                    0                         100                                                                       [::]:25                                                  [::]:*                       users:(("master",pid=20373,fd=14))
tcp                      LISTEN                    0                         128                                                                          *:443                                                    *:*                       users:(("apache2",pid=27780,fd=6),("apache2",pid=27045,fd=6),("apache2",pid=27010,fd=6),("apache2",pid=26893,fd=6),("apache2",pid=26092,fd=6),("apache2",pid=26089,fd=6),("apache2",pid=26088,fd=6),("apache2",pid=26052,fd=6),("apache2",pid=22889,fd=6),("apache2",pid=5822,fd=6),("apache2",pid=4003,fd=6),("apache2",pid=1722,fd=6))

Lényegében majdnem ugyanaz a kimenet, csak itt serializálva kapunk sok adatot, valamint Netid néven szerepel a protokollt megjelenítő oszlop.

Ha pedig még rá akarunk szűrni csak a "LISTEN" tételekre, akkor azt a grep paranccsal tehetjük meg:

sudo ss -tunlp | grep LISTEN
Az aktív használatban lévő portok listázása

Ha az éppen aktív csatlakozásokra vagyunk kíváncsiak, akkor ezt az alábbi paranccsal nézhetjük meg:

sudo ss -tunp

Az ss parancs használata - Az aktív kapcsolatok listázása

Netid  State  Recv-Q  Send-Q            Local Address:Port             Peer Address:Port
tcp    ESTAB  0       0                 192.168.1.130:22              192.168.1.100:35340   users:(("sshd",pid=10410,fd=3),("sshd",pid=10392,fd=3))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56267   users:(("apache2",pid=10427,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56255   users:(("apache2",pid=21615,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56249   users:(("apache2",pid=10425,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56266   users:(("apache2",pid=11511,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56223   users:(("apache2",pid=10424,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56233   users:(("apache2",pid=10426,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56244   users:(("apache2",pid=21613,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:8080     [::ffff:192.168.1.3]:56275   users:(("apache2",pid=11512,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56232   users:(("apache2",pid=10422,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56240   users:(("apache2",pid=21612,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56230   users:(("apache2",pid=21611,fd=22))
tcp    ESTAB  0       0        [::ffff:192.168.1.130]:443      [::ffff:192.168.1.3]:56231   users:(("apache2",pid=21614,fd=22))

Az "ESTAB" (established) állapot jelzi, hogy a kapcsolat aktív.

Itt is ráfrissítettem néhányszor a szerveren futó weboldalra (443-as port), valamint az ISPConfigra (8080-as port) is, hogy több adat legyen látható.

Az összes szolgáltatáshoz rendelt port listázása

Ha pedig meg szeretnénk jeleníteni egyszerre a várakozó (LISTEN) portokat és a már kapcsolatot fenntartó (ESTAB, stb) portokat is, akkor ennél a parancsnál is használhatjuk a rövid -a vagy a hosszabb --all kapcsolót:

sudo ss -tunpa
sudo ss -tunp --all
Szabad portok keresése, ellenőrzése

Ha szabad portot szeretnénk keresni, akkor az netstat parancshoz hasonlóan itt is ugyanúgy szűrhetjük a portszám alapján az alábbi minta alapján.

sudo ss -tunpa | grep <portszám>

Ha ez ad valamilyen kimenetet, akkor a port foglalt, ha nem ad kimenetet, akkor pedig szabadon felhasználható.

Itt is például megnézzük először a 443-as (HTTPS) portot, majd utána egy szabadon választott egyedi portot, például a 57345-ös számút:

sudo ss -tunpa | grep 443
sudo ss -tunpa | grep 57345

Az ss parancs használata - Szabad port keresése

Az első parancsra itt is megjelentek a HTTPS protokollt használó kapcsolódások, majd a második parancs nem adott kimenetet. így tehát a második lekérdezett portszám szabadon felhasználható.

 

Az ss parancs paraméterei és kapcsolói, valamint működése nagyon hasonló a netstat parancshoz, így ezzel is könnyedén ellenőrizhetjük a hálózati portjaink állapotát.

 

 

lsof

Az lsof egy hatékony parancssori segédprogram, amely információkat szolgáltat a különböző folyamatok által megnyitott fájlokról. Mivel Linuxban minden fájlból áll - így a hálózati kommunikációk végpontjai, a socket-ek is -, ezért a nyitott fájlok vizsgálatával hozzájuthatunk az ezeken a végpontokon lévő portok állapotával kapcsolatos információkhoz is.

A rendszerben általában egyszerre nagyon sok fájl van nyitva, amiket valamilyen eszköz vagy szolgáltatás használ, ezért ez a fájlokból álló lista nem csak az általunk figyelni kívánt portokhoz tartozó fájlokat foglalja magában, emiatt az lsof parancs kimenetét általában szűrni kell a kívánt célcsoportra történő szűkítés érdekében.
A listen (hallgató) portok listázása

A várakozó (hallgató, listen) portok kilistázásához futtassuk az alábbi lsof parancsot:

sudo lsof -nPi | grep -E "COMMAND|LISTEN|UDP|TCP"

Ahol a kapcsolók és szűrőszavak jelentései az alábbiak:

  • -n: IP-címek használata hosztnevek helyett.
  • -P: A portok nevei helyett a portok számait jeleníti meg.
  • -i: Ennek a kapcsolónak többféle funkciója van, többnyire szűrésre lehet használni. Jelen esetben, ha nincs mögötte semmi, akkor csak az IPv4 illetve IPv6 típusú, azaz hálózati kapcsolatokat jeleníti meg.
  • grep: A kimenetet ezzel szűrjük le a kívánt célcsoportra, melynek paraméterei:
    • -E: extended regexp, azaz bővített reguláris kifejezések használata. Segítségével nem kell escapelni (\) a speciális karaktereket. A kapcsoló az egrep parancs szinonimájaként is használható.
    • Szűrőszavak: Az alábbi szavak bármelyikét tartalmazó sorokra szűrünk (logikai VAGY kapcsolat):
      • COMMAND: Ezt csak azért tesszük bele, hogy a fejléc sora is megjelenjen, így jobban áttekinthető a kapott kimenet.
      • LISTEN: A hallgató, figyelő portokhoz kapcsolódó fájlok szűrése.
      • UDP: Az UDP típusú socket-ekhez kapcsolódó fájloknál a fájl csomópont azonosítójának helyén jelenik meg, így könnyen szűrhetünk rá.
      • TCP: A TCP típusú socket-ekhez kapcsolódó fájloknál a fájl csomópont azonosítójának helyén jelenik meg, így könnyen szűrhetünk rá.

A kimenete pedig:

Az lsof parancs használata - A listen (hallgató) portok listázása

COMMAND     PID        USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
memcached   500    memcache   26u  IPv4   17426      0t0  TCP 127.0.0.1:11211 (LISTEN)
sshd        580        root    3u  IPv4   17445      0t0  TCP *:22 (LISTEN)
sshd        580        root    4u  IPv6   17447      0t0  TCP *:22 (LISTEN)
munin-nod   663        root    5u  IPv6   17717      0t0  TCP *:4949 (LISTEN)
postgrey    708    postgrey    5u  IPv4   20176      0t0  TCP 127.0.0.1:10023 (LISTEN)
postgrey    708    postgrey    6u  IPv6   20177      0t0  TCP [::1]:10023 (LISTEN)
sshd      10392        root    3u  IPv4 3636818      0t0  TCP 192.168.1.130:22->192.168.1.100:35340 (ESTABLISHED)
sshd      10410 linuxportal    3u  IPv4 3636818      0t0  TCP 192.168.1.130:22->192.168.1.100:35340 (ESTABLISHED)
apache2   10422    www-data    4u  IPv6  146489      0t0  TCP *:80 (LISTEN)
apache2   10422    www-data    6u  IPv6  146493      0t0  TCP *:443 (LISTEN)
apache2   10422    www-data    8u  IPv6  146497      0t0  TCP *:8081 (LISTEN)
apache2   10422    www-data   10u  IPv6  146505      0t0  TCP *:8080 (LISTEN)
apache2   10426    www-data    4u  IPv6  146489      0t0  TCP *:80 (LISTEN)
apache2   10426    www-data    6u  IPv6  146493      0t0  TCP *:443 (LISTEN)
apache2   10426    www-data    8u  IPv6  146497      0t0  TCP *:8081 (LISTEN)
[...]

Itt ez egy hosszabb listát eredményez ezen a szerveren, így csak az eleje látható.

A kapott kimenet oszlopainak jelentése:

  • COMMAND: A megnyitott fájlt kezelő folyamat vagy szolgáltatás.
  • PID: A folyamat azonosítója
  • USER: A fájl tulajdonosa
  • FD: A fájlok egyedi azonosítói (File Descriptor). Ez normál fájlok esetén egy pozitív egész szám, egyéb erőforrás fájlok esetén pedig annak rövidítése. Részletekért lásd a parancs manual oldalát.
  • TYPE: A fájlhoz társított node (csomópont) típusa. Ez sokféle lehet, például normál fájl, könyvtár, blokk eszköz, vagy egy hálózati kapcsolat végpontja (socket), ilyenkor IPv4 vagy IPv6 jelenik meg, attól függően milyen hálózatra csatlakozik a számítógép.
  • DEVICE: Az eszköz azonosítók. Több érték esetén vesszővel van elválasztva.
  • SIZE/OFF: A fájl mérete byte-okban. Speciális erőforrás-fájlok esetén a "0t0" jelenik meg.
  • NODE: A fájlok node azonosítói. Normál fájloknál ez egy pozitív egész szám, speciális erőforrás-fájloknál pedig a protokoll típusa, például TCP.
  • NAME: Normál fájloknál a fájl útvonala, speciális erőforrás-fájloknál pedig az adott erőforrásra jellemző adatok jelennek meg. Socket fájlok esetén a hálózatra vonatkozó adatok, például a hosztnév vagy IP-cím, a hálózati portszám és a kapcsolat állapota (pl. LISTEN, ESTABLISHED, stb)

Ebben a listában sok mindent láthatunk, köztük van pár ESTABLISHED jelölésű sor is, amit a -v kapcsolóval kiszűrhetünk a kimenetből, ha nem akarjuk látni őket:

sudo lsof -nPi | grep -E "COMMAND|LISTEN|UDP|TCP" | grep -v "ESTABLISHED"

Ahogy láthatjuk a lista elejét, van itt 22-es, 80-as, 443-as, 8080-as, stb porthoz kapcsolódó fájl is. Persze lejjebb ott van a többi szolgáltatás is, csak itt névsorban az "apache2" tölti ki a sorokat. Ez a sok apache2 sor a PHP-FPM folyamatkezelésének köszönhető: ennyi szálon várja készenlétben a beérkező kéréseket az Apache, aminek következtében gyorsabban felépülnek az újabb webes kapcsolatok, így a kliensek böngészőibe hamarabb betöltődnek a lekért weboldalak.

Az aktív használatban lévő portok listázása

Az éppen aktív port csatlakozásokat az alábbi paranccsal nézhetjük meg:

sudo lsof -nPi | grep -E "COMMAND|ESTABLISHED"

Itt pedig az "ESTABLISHED" szóra kell szűrnünk, és persze a fejléc sor megtartásához a "COMMAND" szót is betehetjük. A kimenet pedig:

Az lsof parancs használata - Az aktív portok listázása

COMMAND     PID        USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
apache2    1837    www-data   22u  IPv6 5607954      0t0  TCP 192.168.1.130:8080->192.168.1.3:55034 (ESTABLISHED)
apache2    7741    www-data   22u  IPv6 5609490      0t0  TCP 192.168.1.130:443->192.168.1.3:54994 (ESTABLISHED)
sshd      23504        root    3u  IPv4 5600073      0t0  TCP 192.168.1.130:22->192.168.1.100:43354 (ESTABLISHED)
sshd      23510 linuxportal    3u  IPv4 5600073      0t0  TCP 192.168.1.130:22->192.168.1.100:43354 (ESTABLISHED)
apache2   24380    www-data   22u  IPv6 5609486      0t0  TCP 192.168.1.130:443->192.168.1.3:54990 (ESTABLISHED)
apache2   24387    www-data   22u  IPv6 5607306      0t0  TCP 192.168.1.130:443->192.168.1.3:55011 (ESTABLISHED)
sshd      27429        root    3u  IPv4 5333070      0t0  TCP 192.168.1.130:22->192.168.1.100:38116 (ESTABLISHED)
sshd      27447 linuxportal    3u  IPv4 5333070      0t0  TCP 192.168.1.130:22->192.168.1.100:38116 (ESTABLISHED)

Itt is láthatók az sshd, és a webkiszolgáló portjainak aktív kapcsolatai.

Az összes szolgáltatáshoz rendelt port listázása

Ha az összes várakozó vagy figyelő (LISTEN) portot és az aktív portokat is szeretnénk egyben kilistázni, akkor vagy elhagyjuk a szűrőt az előző parancsból, vagy kibővítjük azt, hogy mindegyik állapot bekerüljön:

sudo lsof -nPi
sudo lsof -nPi | grep -E "COMMAND|LISTEN|ESTABLISHED|UDP|TCP"
Szabad portok keresése, ellenőrzése

Ha szabad portot szeretnénk keresni, akkor azt az lsof parancs -i paraméterével tehetjük meg:

sudo lsof -nPi:<portszám>

Itt az "i" betű után közvetlenül kettőspont jön, és utána rögtön a portszám, tehát nem lehetnek közöttük szóközök!

Ha ez ad valamilyen kimenetet, akkor a port foglalt, ha nem ad kimenetet, akkor pedig szabadon felhasználható.

Itt is a korábbi példánál maradva megnézzük a két portot, a 443 és 57345-ös számút:

sudo lsof -nPi:443
sudo lsof -nPi:57345

Az lsof parancs használata - Szabad portok keresése, ellenőrzése

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2  1795 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2  1837 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2  1865 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2  7648 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2  7746 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2 22889     root    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2 24380 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2 24384 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2 24386 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2 24387 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2 24388 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)
apache2 24390 www-data    6u  IPv6 146493      0t0  TCP *:443 (LISTEN)

 

 

Portok kívülről történő ellenőrzésére szolgáló (port scan) parancsok

A kívülről történő port ellenőrzéskor port scan (port letapogatás) műveletet hajtunk végre a vizsgálni kívánt számítógépen, hogy kiderítsük hogy mely portok vannak nyitva, milyen szolgáltatások figyelik ezeket a portokat, stb. Port szkennelést általában a rendszergazdák a kiszolgálóik biztonsági ellenőrzésének céljából hajtják végre, de sajnos gyakran rosszindulatú támadók is használják a kiszemelt célszámítógép gyenge pontjainak feltérképezésére.

Mivel ez a téma - összetettsége miatt - túlmutat ennek a leírásnak a keretein, ezért erről részletesebben egy másik leírásban tájékozódhatunk, itt most csak érintőlegesen megemlítünk néhány hasznos parancsot, amivel ellenőrizhetjük hálózati portjainkat.

nmap

Az nmap parancs (Network Mapper) egy hatékony hálózatfelderítésre és biztonsági ellenőrzésre szolgáló segédeszköz. Sima felhasználóként is futtatható, de számos funkcióját csak root jogosultsággal tudjuk használni, tehát az itt következő részeket root jogosultságokkal hajtsuk végre.

Telepítéséhez Debian/Ubuntu rendszereken futtassuk az alábbi parancsot:

sudo apt-get install nmap

A paranccsal egyszerűen hajthatjuk végre az ismertebb TCP és UDP portok szkennelését saját vagy távoli számítógépeken:

nmap <hosztnév vagy IP-cím>
nmap -sT <hosztnév vagy IP-cím>
nmap -sU <hosztnév vagy IP-cím>
nmap -sTU <hosztnév vagy IP-cím>

Az első és második parancs TCP portokat vizsgál (az elsőnél kapcsoló nélkül is alapértelmezetten TCP portokat vizsgál), míg a harmadik UDP portokat. Ez jóval több idő alatt fut le az UDP protokoll működéséből kifolyólag. A negyedik paranccsal pedig mindkét protokollt használó portot figyeli. A z nmap segítségével tehát "kívülről" ellenőrizhetjük portjainkat.

nc/ncat

Az nc/ncat (Netcat) egy olyan parancssori segédeszköz, amely adatokat ír és olvas hálózati kapcsolatokon keresztül, TCP vagy UDP protokoll használatával. Ez az egyik leghatékonyabb eszköz a rendszergazdák arzenáljában, ezért a hálózati eszközök svájci bicskájaként is szokták emlegetni. A Netcat többplatformos, így több operációs rendszeren is elérhető, mint például Linux, macOS, Windows és BSD. A Netcat használható hálózati kapcsolatok hibakeresésére, figyelésére, nyitott portok keresésére, adatok átvitelére, stb.

A program a legtöbb disztribúcióban már előre telepítve van, de ha véletlenül mégsem lenne fent a gépünkön, akkor telepítsük az alábbi paranccsal:

sudo apt-get install ncat

A netcat segédprogram alapvető szintaxisa az alábbi:

nc [opciók] hoszt port

A paranccsal az alábbi szintaktika szerint kérdezhetünk le portokat a távoli számítógépeken, annak megállapítására, hogy az nyitva van-e vagy sem:

nc -vz <hosztnév vagy IP-cím> <TCP portszám>
nc -vzu <hosztnév vagy IP-cím> <UDP portszám>

Példák:

nc -vz debian10.linuxportal.vm 80
nc -vzu debian10.linuxportal.vm 53

Hálózati portok ellenőrzése a netcat programmal

Az első paranccsal TCP portot vizsgálhatunk, míg a másodikkal pedig UDP portot.

A Netcat programnak több implementációja létezik, amelyek másképpen működnek. Erről az Alapszintű port szkennelés című leírás második oldalán tájékozódhatunk.

 

A port szkennelés témában készített - szorosan ide kapcsolódó - részletesebb leírás tehát itt található:

 

 

Konklúzió

Amint láthatjuk, a számítógépünk vagy szerverünk hálózati portjainak ellenőrzésére több lehetőség is kínálkozik. A portok vizsgálatát elvégezhetjük "házon belül" is különböző parancsokkal, de akár kívülről is végezhetünk port szkennelést, hogy megbizonyosodjunk rendszerünk biztonságosságáról.