Tato příručka vysvětluje několik různých způsobů, jak zjistit, která služba naslouchá na konkrétním portu v Linuxu. Většina z vás zná výchozí port oblíbených služeb nebo procesů. Například výchozí port Apache je 80, výchozí port FTP je 21 a výchozí port SSH je 22. Názvy a čísla portů v Linuxu naleznete podle této příručky . Výchozí čísla portů lze také změnit na libovolné vlastní porty pro zabezpečení serveru Linux. Následující návody například popisují, jak změnit výchozí port Apache, FTP a SSH na jiný port.
- Jak změnit výchozí port Apache na vlastní port
- Jak změnit výchozí port FTP na vlastní port
- Jak změnit výchozí port SSH na vlastní port
Pokud se změní výchozí číslo portu, jak zjistíte, která služba na kterém portu naslouchá? To se nyní dozvíme!
Zjistěte, která služba naslouchá na konkrétním portu v Linuxu
Níže jsem uvedl čtyři způsoby, jak zkontrolovat, jaká služba běží na konkrétním čísle portu. Tento seznam budu průběžně aktualizovat, pokud v budoucnu narazím na nějaké nové metody. Takže si to uložte do záložek a jednou za čas to zkontrolujte.
Metoda 1 – Použití netstat
Toto je nejčastěji používaný způsob, jak zjistit, která služba naslouchá na kterém portu. Netstat je nástroj příkazového řádku používaný k tisku síťových připojení, směrovacích tabulek, statistik rozhraní, připojení maškarád a členství v multicastu.
Netstat je dostupný ve výchozích úložištích většiny distribucí Linuxu.
Chcete-li jej nainstalovat na Arch Linux a jeho varianty, postupujte takto:
$ sudo pacman -S net-tools
Na CentOS, RHEL:
$ sudo yum install net-tools
Na Fedoře:
$ sudo dnf install net-tools
Na Debianu, Ubuntu:
$ sudo apt install net-tools
Po instalaci spusťte následující příkaz a zjistěte, které služby naslouchají na jakých portech:
$ sudo netstat -tulpn
Ukázkový výstup:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 665/systemd-resolve tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1026/sshd tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 2068/python3 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1072/mysqld tcp6 0 0 :::22 :::* LISTEN 1026/sshd tcp6 0 0 :::80 :::* LISTEN 1062/apache2 udp 0 0 127.0.0.53:53 0.0.0.0:* 665/systemd-resolve udp 0 0 192.168.225.22:68 0.0.0.0:* 647/systemd-network udp 0 0 192.168.225.53:68 0.0.0.0:* 647/systemd-network udp6 0 0 fe80::a00:27ff:feff:546 :::* 647/systemd-network udp6 0 0 fe80::a00:27ff:fe7e:546 :::* 647/systemd-network
Jak vidíte, služba python (simpleHTTPserver v tomto případě) naslouchá na portu číslo 8000, služba mysqld naslouchá na portu 3306, služba ssh běží na portu číslo 22, apache2 běží na portu 80 atd.
Tady,
-t
příznak zobrazuje připojení TCP.-u
příznak zobrazuje připojení udp.-l
flag zobrazuje naslouchající zásuvky.-p
flag zobrazuje ID procesu (PID) a název procesu čehokoli, co tento port používá.-n
flag zobrazuje číselné adresy.
Výše uvedený příkaz uvádí všechny služby a čísla portů, na kterých naslouchají. Co když chcete zjistit, která služba naslouchá na konkrétním portu? Zde je příkaz grep přijde vhod! Můžeme kombinovat netstat
a grep
příkaz k filtrování výstupu pro konkrétní službu, například mysqld , jako níže.
$ sudo netstat -tulpn | grep mysqld [sudo] password for sk: tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld
Vidět? služba mysqld naslouchá na portu číslo 3306.
Pokud již znáte číslo portu, ale nevíte, která služba jej aktuálně používá, jednoduše nahraďte název služby číslem portu, jak je uvedeno níže.
$ sudo netstat -tulpn | grep -w 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld
Zde -w
flag zobrazí pouze ty řádky obsahující shody, které tvoří celá slova. Jinými slovy -w
zobrazí přesnou shodu daného řetězce.
Můžete také použít -i
Ignorovat rozlišení velkých a malých písmen, aby se znaky, které se liší pouze velikostí písmen, vzájemně shodovaly
$ sudo netstat -tulpn | grep -i 3306
Je to tak jednoduché.
Další podrobnosti naleznete na manuálových stránkách.
$ man netstat
Netstat je většinou zastaralý. Alternativou k netstat je "ss".
Metoda 2 – Použití příkazu "ss"
ss je nástroj příkazového řádku pro zkoumání soketů. Je to alternativa k netstat a použití "ss" je téměř stejné jako "netstat". Dodává se předinstalovaný na Ubuntu a jeho variantách.
Chcete-li zjistit, které služby naslouchají na kterých portech, spusťte:
$ sudo ss -tulpn
Ukázkový výstup:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=671,fd=12)) udp UNCONN 0 0 192.168.225.22%enp0s3:68 0.0.0.0:* users:(("systemd-network",pid=653,fd=17)) udp UNCONN 0 0 192.168.225.53%enp0s8:68 0.0.0.0:* users:(("systemd-network",pid=653,fd=25)) udp UNCONN 0 0 [fe80::a00:27ff:fe7e:8a9c]%enp0s8:546 [::]:* users:(("systemd-network",pid=653,fd=24)) udp UNCONN 0 0 [fe80::a00:27ff:feff:d2e0]%enp0s3:546 [::]:* users:(("systemd-network",pid=653,fd=22)) tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1076,fd=32)) tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=671,fd=13)) tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1015,fd=3)) tcp LISTEN 0 128 *:80 *:* users:(("apache2",pid=1094,fd=4),("apache2",pid=1090,fd=4),("apache2",pid=1089,fd=4),("apache2",pid=1088,fd=4),("apache2",pid=1087,fd=4),("apache2",pid=1062,fd=4)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1015,fd=4))
Chcete-li filtrovat výstup pro konkrétní službu (např. mysqld), použijte:
$ sudo ss -tulpn | grep -w mysqld tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1076,fd=32))
Další podrobnosti naleznete na manuálových stránkách.
$ man ss
Metoda 3 – Použití lsof
Jak název napovídá, lsof je nástroj příkazového řádku pro seznam všech otevřených souborů patřících všem aktivním procesům.
Chcete-li jej nainstalovat na Linux, použijte následující příkazy v závislosti na typu distribuce, kterou používáte.
Na Arch Linuxu:
$ sudo pacman -S lsof
Na Debianu, Ubuntu:
$ sudo apt install lsof
Na CentOS, RHEL:
$ sudo yum install lsof
Na Fedoře:
$ sudo dnf install lsof
Chcete-li zjistit, které procesy běží na kterých portech, jednoduše zadejte číslo portu, jak je uvedeno v následujícím příkazu:
$ sudo lsof -i :80
Ukázkový výstup:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 1062 root 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1087 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1088 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1089 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1090 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1094 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN)
Další podrobnosti naleznete na manuálových stránkách.
$ man lsof
Metoda 4 – Použití příkazu fixační jednotky
fixační jednotka je další nástroj příkazového řádku k identifikaci procesů pomocí souborů nebo soketů. Zobrazuje PID procesů používajících zadané soubory nebo systémy souborů.
Je také k dispozici ve výchozích úložištích většiny distribucí Linuxu.
Chcete-li jej nainstalovat na Arch Linux, spusťte:
$ sudo pacman -S psmisc
Na Debianu, Ubuntu:
$ sudo apt install psmisc
Na CentOS, RHEL:
$ sudo yum install psmisc
Na Fedoře:
$ sudo dnf install psmisc
Nejprve musíme najít PID služby nebo procesu naslouchajícího na konkrétním portu. Například najdu PID procesu naslouchajícího na portu 3306 pomocí příkazu:
$ sudo fuser 3306/tcp
Uvidíte výstup jako níže.
3306/tcp: 1076
Zde 1076 je PID.
A pak zjistěte skutečný proces pomocí PID pomocí příkazu:
$ ps -p 1076 -o comm= mysqld
Případně můžete použít -v
flag pro zobrazení úplných podrobností v jediném příkazu.
$ sudo fuser -v 3306/tcp USER PID ACCESS COMMAND 3306/tcp: mysql 1076 F.... mysqld
Pro více podrobností si projděte manuálové stránky.
$ man fuser
Nyní znáte čtyři různé nástroje, jak zjistit, které procesy naslouchají na jakých portech. Všechny čtyři se snadno používají a jsou dostupné ve většině distribucí Linuxu. Pokud znáte nějaké další nástroje, dejte nám vědět v sekci komentářů níže. Tento seznam podle toho zkontroluji a aktualizuji.