Příkaz
netstat -antu
zobrazí všechny používané porty tcp a udp. Výstup bude vypadat nějak takto:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN
Číslo za dvojtečkou v poli Místní adresa ukazuje používaný port. Pokud je stav "LISTEN", znamená to port, který se používá pro příchozí připojení. Pokud je IP adresa v Local Address
pole je 0.0.0.0
to znamená, že příchozí připojení budou přijímána na jakékoli IP adrese přiřazené k rozhraní – to znamená z připojení pocházejících mimo váš počítač.
Pokud je tam uvedeno localhost
nebo 127.0.0.1
bude přijímat pouze připojení z vašeho počítače.
Navíc, pokud přidáte -p
a spusťte jej jako root, zobrazí se proces, který otevřel port:
$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN 860/rpc.statd
Vše, co není uvedeno jako používané, je zdarma, ale uživatelé (neprivilegované účty) mohou otevřít pouze porty nad 1023.
Sám jsem sestavil malý seznam.
Některé z mých oblíbených jsou:
netstat -tulpn
lsof -i -n -P
Dobrým a spolehlivým způsobem kontroly otevřených portů je použití ss
(náhrada za zastaralé netstat
), je použitelný ve skriptu bez nutnosti zvýšených oprávnění (např. sudo
).
Použití:volba -l
pro naslouchací porty, volba -n
obejít překlad DNS a filtr na zdrojovém portu NN
:src :NN
(nahraďte NN
podle portu, který chcete monitorovat). Další možnosti viz man ss
ss -ln src :NN
Příklady:
[[email protected] ~]# ss -ln src :80
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
[[email protected] ~]# ss -ln src :81
State Recv-Q Send-Q Local Address:Port Peer Address:Port
A ve skriptu pomocí grep můžeme otestovat, zda výstup obsahuje port, který jsme požadovali. Příklad s používaným portem 80 (viz výše):
myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
echo "Port $myport is in use (result == $result) "
else
echo "Port $myport is NOT in use (result == $result) "
fi
# output:
Port 80 is in use (result == 1)
Příklad s nepoužívaným portem 81 (viz výše)
myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
echo "Port $myport is in use (result == $result) "
else
echo "Port $myport is NOT in use (result == $result) "
fi
# output:
Port 81 is NOT in use (result == 0)