# Porta (reti)

Nella telematica e nell'ambito delle reti di computer le porte (traduzione dell'inglese port, nell'accezione in italiano di porta o apertura) sono lo strumento utilizzato per realizzare la multiplazione delle connessioni a livello di trasporto, ovvero per permettere ad un calcolatore di effettuare più connessioni contemporanee verso altri calcolatori, facendo in modo che i dati contenuti nei pacchetti in arrivo vengano indirizzati al processo che li sta aspettando.
In particolare il termine porta è mutuato direttamente da quello di porta fisica di connessione tra cavi di un calcolatore o di un qualunque altro dispositivo elettronico, ma di fatto nell'ambito della trasmissione dei dati durante una connessione non c'è altra porta fisica oltre a quella di aggancio del connettore del cavo. Nell'ambito delle reti di telecomunicazioni il termine porta indica quindi solamente una porta virtuale o logica e può essere vista banalmente come un'etichetta (label) che identifica e discrimina il traffico dati di una connessione da quello di un'altra.
Tutti i processi di rete tra i vari terminali di rete necessitano dunque di una porta per l'instaurazione, l'esecuzione ed il completamento del servizio preposto.

## Caratteristiche

Le porte sono numeri (in TCP e UDP sono a 16 bit per un totale di 2$^{16}$= 65 536 porte possibili che vanno da 0 a 65 535) utilizzati per identificare una particolare connessione di trasporto tra quelle al momento attive su un calcolatore. I pacchetti appartenenti ad una connessione saranno quindi identificati dalla quadrupla [<indirizzo IP sorgente>, <indirizzo IP destinazione>, <porta sorgente>, <porta destinazione>]. I pacchetti nella direzione opposta avranno ovviamente sorgente e destinazione scambiati.
Mentre la porta di destinazione è l'identificativo univoco del processo applicativo, la porta di sorgente è assegnata casualmente in maniera tale da identificare univocamente la connessione da parte del mittente col destinatario eventualmente tra più computer all'interno di una rete locale.
Il livello di trasporto (tipicamente realizzato dal sistema operativo) associa a ciascuna porta utilizzata un punto di contatto (ad esempio, una socket), utilizzato da uno (o più) processi applicativi per trasmettere e/o ricevere dati.
Per poter inviare con successo un pacchetto con una certa porta di destinazione, ci deve essere un processo che è "in ascolto" su quella porta, ovvero che ha chiesto al sistema operativo di ricevere connessioni su quella porta. L'operazione di impegnare una porta TCP o UDP da parte di un processo è detta "bind", dal nome della chiamata di sistema unix che la realizza.
La porta sorgente utilizzata in una connessione viene scelta dal calcolatore che inizia la connessione tra una di quelle al momento non impegnate.
In Internet, c'è una convenzione per cui ad alcuni numeri di porta sono associati determinati protocolli di livello applicativo. Ad esempio, se voglio contattare il server HTTP eventualmente in esecuzione su un certo calcolatore, so che devo tentare di stabilire una connessione verso la porta 80 (vedi lista di porte standard).

### Tipi di porte

I numeri di porta sono classificabili in tre gruppi:
* le well-known ports (intervallo 0-1023) sono assegnate dall'Internet Assigned Numbers Authority (IANA) e sono generalmente utilizzate a livello di sistema operativo o di processi di sistema. In genere rimangono in ascolto su queste porte applicazioni con funzioni di server. Alcuni esempi possono essere le applicazioni che utilizzino protocolli FTP (21), SSH (22), TELNET (23), SMTP (25) e HTTP (80). Sono dette porte ben note.
* Le registered ports (intervallo 1024 - 49 151) invece sono spesso utilizzate come riferimento fra applicazioni, come una specie di accordo.
* Le dynamic ports (intervallo 49 152 - 65 535) invece sono tutte le altre, liberamente utilizzabili da tutte le applicazioni utente, salvo l'occupazione contemporanea da parte di qualche altro processo.

## Sicurezza

Supervisionare le porte "in ascolto" (cioè aperte) è di estrema importanza sul fronte della sicurezza informatica per evitare attacchi informatici che nel caso più grave possono portare al controllo completo del computer. Per visualizzare le porte aperte sul proprio computer è necessario un programma di scansione delle porte e dei relativi servizi collegati ad esse.
Il port scanning è una tecnica comunemente usata per tentare di connettere un insieme di porte in sequenza su un singolo host ed è tipicamente associata sia agli attacchi malevoli relativi al cracking sia alla ricerca di potenziali vulnerabilità da parte degli amministratori di rete per prevenire tali attacchi. I tentativi di connessione alle porte sono frequentemente monitorati e registrati dagli host. La tecnica del port knocking utilizza una serie di connessioni alle porte da un computer client per attivare una connessione verso un server.
Le porte normalmente più vulnerabili sono:
* Servizi di login: Telnet (23/TCP), SSH (22/TCP), NetBIOS (139/TCP), ecc.
* Posta: SMTP (25/TCP), POP (109/TCP e 110/TCP), IMAP (143/TCP), ecc.
* Web: HTTP (80/TCP) e SSL (443/TCP), tranne quelle verso i server web esterni. Si dovrebbero bloccare anche le porte HTTP comuni (8000/TCP, 8080/TCP, 8888/TCP e così via)
* Piccoli servizi: porte prima delle 20/TCP e 20/UDP, time (37/TCP e 37/UDP)