Una connessione di rete TCP/IP può essere bloccata, interrotta, aperta o filtrata. Queste azioni sono generalmente controllate dal firewall IPtables utilizzato dal sistema ed è indipendente da qualsiasi processo o programma che potrebbe essere in ascolto su una porta di rete. Al di là del firewall, un programma o un processo (un server o un demone) potrebbe essere in ascolto su una porta o non essere in ascolto. Questo può essere verificato usando i programmi netstat o ss. Controllare se una porta è aperta, bloccata, eliminata o filtrata sul firewall non è semplice. Ci sono due modi per farlo:
- testare la porta esternamente
- elenca la configurazione del firewall ed esamina l'output
1. Utilizzo di netstat per vedere i processi di ascolto
Per vedere se un programma o un processo è in ascolto su una porta, pronto ad accettare un pacchetto, usa il comando netstat.
# netstat -tulnp
Gli argomenti del comando netstat sono elencati di seguito:
t – Mostra TCP
u – Mostra UDP
l – Mostra solo i processi di ascolto (netstat può mostrare sia l'ascolto che tutte le connessioni stabilite, cioè anche come client)
n – Non risolvere i nomi degli indirizzi IP di rete o i numeri di porta
p – Mostra il nome del processo in ascolto sulla porta
Ad esempio :
# netstat -tulnp 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:111 0.0.0.0:* LISTEN 1254/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1484/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1355/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1562/master tcp 0 0 0.0.0.0:44349 0.0.0.0:* LISTEN 1274/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 1254/rpcbind udp 0 0 0.0.0.0:631 0.0.0.0:* 1355/cupsd udp 0 0 0.0.0.0:44165 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:602 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:1001 0.0.0.0:* 1254/rpcbind
2. Usare ss per vedere i processi di ascolto
Per vedere se un programma o un processo è in ascolto su una porta, pronto ad accettare un pacchetto, usa il programma ss.
# ss -nutlp
Gli argomenti del programma ss sono elencati di seguito:
t – Visualizza i socket TCP.u – Visualizza le prese UDP.
l – Visualizza le prese di ascolto
n – Prova ora a risolvere i nomi
p – Mostra il processo usando il socket
Ad esempio:
# ss -nutlp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:111 *:* users:(("rpcbind",1254,6)) udp UNCONN 0 0 *:631 *:* users:(("cupsd",1355,9)) udp UNCONN 0 0 *:44165 *:* users:(("rpc.statd",1274,8)) udp UNCONN 0 0 *:602 *:* users:(("rpc.statd",1274,5)) udp UNCONN 0 0 *:1001 *:* users:(("rpcbind",1254,7)) tcp LISTEN 0 128 *:111 *:* users:(("rpcbind",1254,8)) tcp LISTEN 0 128 *:22 *:* users:(("sshd",1484,3)) tcp LISTEN 0 128 127.0.0.1:631 *:* users:(("cupsd",1355,7)) tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",1562,12)) tcp LISTEN 0 128 *:44349 *:* users:(("rpc.statd",1274,9))
3. usando lsof per trovare le porte aperte
Per elencare tutte le porte aperte su un sistema, utilizzare il comando seguente per elencare il nome e il numero del processo che ha aperto le porte.
# lsof -i
Ecco un esempio di output:
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1254 rpc 6u IPv4 12592 0t0 UDP *:sunrpc rpcbind 1254 rpc 7u IPv4 12596 0t0 UDP *:1001 rpcbind 1254 rpc 8u IPv4 12597 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1274 rpcuser 5r IPv4 12784 0t0 UDP *:xmlrpc-beep rpc.statd 1274 rpcuser 8u IPv4 12788 0t0 UDP *:44165 rpc.statd 1274 rpcuser 9u IPv4 12792 0t0 TCP *:44349 (LISTEN) cupsd 1355 root 7u IPv4 13147 0t0 TCP localhost:ipp (LISTEN) cupsd 1355 root 9u IPv4 13150 0t0 UDP *:ipp sshd 1484 root 3u IPv4 13707 0t0 TCP *:ssh (LISTEN) master 1562 root 12u IPv4 13923 0t0 TCP localhost:smtp (LISTEN) sshd 1657 root 3r IPv4 14745 0t0 TCP 192.168.1.50:ssh->192.168.1.101:49549 (ESTABLISHED)
Testare una porta esternamente
L'applicazione telnet può essere utilizzata per testare una semplice connettività socket di rete, ma solo per connessioni TCP, non UDP. Ad esempio, se desidero vedere se la porta TCP 80 di un sistema è pronta per accettare una connessione, specifico l'indirizzo IP e la porta per telnet:
# telnet 192.168.1.55 80 Trying 192.168.1.55... Connected to example.redhat.com (192.168.1.55). Escape character is '^]'.
Se il server non è in ascolto, la risposta è diversa:
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection refused telnet: Unable to connect to remote host: Connection refused
- Questo indica che la connessione è stata attivamente rifiutata. Il sottosistema TCP ha ricevuto il pacchetto, lo ha esaminato e ha scoperto che si trattava di una richiesta di apertura di un socket alla porta 80, ha visto che non c'era alcun processo pronto per accettare la connessione e ha risposto con un rifiuto.
- Se il firewall fosse configurato per bloccare o filtrare la connessione, telnet visualizzerebbe qualcosa di molto simile a quanto sopra, anche se esisteva un processo pronto per accettare la connessione.
- Se il firewall fosse configurato per interrompere le connessioni, non vedremmo alcuna risposta e telnet andrebbe invece in timeout:
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection timed out
Elenco delle regole del firewall
In Red Hat Enterprise Linux, le regole del firewall possono essere elencate utilizzando il comando service:
# service iptables status
Oppure usando il comando iptables:
# iptables -xvn -L