Ať už řešíte problémy se síťovým připojením nebo konfigurujete firewall, jednou z prvních věcí, které je třeba zkontrolovat, je, jaké porty jsou ve vašem systému skutečně otevřeny.
Tento článek popisuje několik přístupů, jak zjistit, jaké porty jsou na vašem systému Linux otevřeny ven.
Co je otevřený port #
Naslouchací port je síťový port, na kterém aplikace naslouchá. Seznam naslouchacích portů vašeho systému můžete získat dotazem na síťový zásobník pomocí příkazů jako ss
, netstat
nebo lsof
. Každý naslouchací port lze otevřít nebo zavřít (filtrovat) pomocí brány firewall.
Obecně řečeno, otevřený port je síťový port, který přijímá příchozí pakety ze vzdálených míst.
Pokud například provozujete webový server, který naslouchá na portech 80
a 443
a tyto porty jsou otevřené na vašem firewallu, kdokoli (kromě blokovaných IP adres) bude mít přístup k webovým stránkám hostovaným na vašem webovém serveru pomocí jeho prohlížeče. V tomto případě obě 80
a 443
jsou otevřené porty.
Otevřené porty mohou představovat bezpečnostní riziko, protože každý otevřený port mohou útočníci využít ke zneužití zranitelnosti nebo k provedení jakéhokoli jiného typu útoku. Měli byste vystavit pouze porty potřebné pro funkčnost vaší aplikace a zavřít všechny ostatní porty.
Zkontrolujte otevřené porty pomocí nmap
#
Nmap je výkonný nástroj pro skenování sítě, který dokáže skenovat jednotlivé hostitele a velké sítě. Používá se hlavně pro bezpečnostní audity a penetrační testování.
Pokud je k dispozici, nmap
by měl být vaším prvním nástrojem, pokud jde o skenování portů. Kromě skenování portů, nmap
může také zjistit adresu Mac, typ OS, verze jádra a mnoho dalšího.
Následující příkaz vydaný z konzoly určuje, které porty naslouchají připojení TCP ze sítě:
sudo nmap -sT -p- 10.10.8.8
-sT
říká nmap
pro skenování TCP portů a -p-
pro vyhledání všech portů 65535. Pokud -p-
se nepoužívá nmap
prohledá pouze 1000 nejoblíbenějších portů.
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-09 23:10 CEST
Nmap scan report for 10.10.8.8
Host is up (0.0012s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:05:49:23 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
Výše uvedený výstup ukazuje, že pouze porty 22
, 80
a 8069
jsou otevřeny v cílovém systému.
Chcete-li vyhledat porty UDP, použijte -sU
místo -sT
:
sudo nmap -sU -p- 10.10.8.8
Pro více informací navštivte manuálovou stránku nmap a přečtěte si o všech dalších výkonných možnostech tohoto nástroje.
Zkontrolujte otevřené porty pomocí netcat
#
Netcat (nebo nc
) je nástroj příkazového řádku, který dokáže číst a zapisovat data přes síťová připojení pomocí protokolů TCP nebo UDP.
Pomocí netcat
můžete skenovat jeden port nebo rozsah portů.
Například pro skenování otevřených TCP portů na vzdáleném počítači s IP adresou 10.10.8.8
v rozsahu 20-80
použijete následující příkaz:
nc -z -v 10.10.8.8 20-80
-z
volba říká nc
pro vyhledávání pouze otevřených portů, bez odesílání jakýchkoli dat a -v
je pro podrobnější informace.
Výstup bude vypadat nějak takto:
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
...
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Pokud chcete, aby se na obrazovce tiskly pouze řádky s otevřenými porty, filtrujte výsledky pomocí grep
příkaz.
nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Chcete-li vyhledat porty UDP, zadejte -u
možnost nc
příkaz:
nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded
2>&1
konstrukt přesměruje standardní chybu na standardní výstup. Zkontrolujte otevřené porty pomocí Bash Pseudo Device #
Dalším způsobem, jak zkontrolovat, zda je určitý port otevřený nebo zavřený, je použití prostředí Bash /dev/tcp/..
nebo /dev/udp/..
pseudozařízení.
Při provádění příkazu na /dev/$PROTOCOL/$HOST/$IP
pseudo-zařízení, Bash otevře TCP nebo UDP připojení k určenému hostiteli na zadaném portu.
Následující if..elsestatement zkontroluje, zda port 443
na kernel.org
je otevřeno:
if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
echo "Port is open"
else
echo "Port is closed"
fi
Port is open
Jak funguje výše uvedený kód?
Při připojování k portu pomocí pseudozařízení je výchozí časový limit obrovský, takže používáme timeout
příkaz k ukončení testovacího příkazu po 5 sekundách. Pokud je navázáno připojení k kernel.org
port 443
příkaz test vrátí hodnotu true.
Chcete-li zkontrolovat rozsah portů, použijte cyklus for:
for PORT in {20..80}; do
timeout 1 bash -c "</dev/tcp/10.10.8.8/$PORT &>/dev/null" && echo "port $PORT is open"
done
Výstup bude vypadat nějak takto:
port 22 is open
port 80 is open
Závěr č.
Ukázali jsme vám několik nástrojů, které můžete použít ke skenování otevřených portů. Existují také další nástroje a metody pro kontrolu otevřených portů, například můžete použít socket
Pythonu modul, curl
, telnet
nebo wget
.
Pokud máte nějaké dotazy nebo připomínky, zanechte prosím níže komentář.