title: SOCKS
text: # SOCKS
  
  Un server SOCKS è un particolare tipo di proxy che permette di effettuare connessioni TCP dirette (e, dalla versione 5, di veicolare traffico UDP oltre che TCP) tra computer su due reti IP differenti nei casi in cui un instradamento diretto (routing) non sia disponibile. È l'abbreviazione di "SOCKet Secure".
  
  I punti di forza del protocollo SOCKS sono l'estrema semplicità di implementazione (sia dal lato client che dal lato server) e la completa indipendenza dal protocollo da veicolare attraverso di esso.
  
  Storicamente SOCKS è stato usato come punto di contatto tra due LAN oppure tra una LAN e una WAN (come ad esempio Internet). Recentemente è più comune incontrare reti direttamente connesse ad Internet o connesse attraverso un proxy HTTP.
  
  ## Versioni
  
  Attualmente esistono tre versioni del protocollo SOCKS:
  
  * SOCKS 4, definito da NEC nel documento "SOCKS: A protocol for TCP proxy across firewalls"
  * Socks 4a, definito da NEC nel documento "SOCKS 4A: A Simple Extension to SOCKS 4 Protocol"
  * SOCKS 5, definito da IETF nella RFC 1928
  
  ## Logica di funzionamento
  
  La logica di funzionamento di un server SOCKS è simile a quello di un proxy:
  
  * Il client si collega al server SOCKS invece che al server di destinazione e, dopo una fase di handshake in cui vengono negoziati versione del protocollo ed eventuale cifratura, invia una richiesta in cui specifica alcuni parametri tra cui l'indirizzo ip e la porta di destinazione;
     * se per un qualsiasi motivo la richiesta non viene accettata (mancanza di autorizzazione, servizio non disponibile, parametri errati, ecc.) viene inviata al client una risposta negativa e termina la connessione;
     * se la richiesta viene accettata, il server SOCKS cerca di stabilire una connessione col server di destinazione;
        * se la connessione col server non può venir stabilita viene inviata al client una risposta negativa e termina la connessione;
        * se la connessione col server viene stabilita con successo, il server SOCKS comincia a trasferire i dati in modo bidirezionale tra client e server; da questo punto in poi il server SOCKS ignora completamente il formato e il protocollo usati per il trasferimento dei dati;
  * il servizio termina con la chiusura della connessione indifferentemente da parte del server o del client.
  
  ## Protocollo v4/4a
  
  ### Richiesta
  
  * VN: Numero di versione. Deve essere 0x04
  * CD: Operazione. 0x01 per CONNECT, 0x02 per BIND
  * DSTPORT: Porta TCP del server di destinazione in formato network byte order
  * DSTIP: Indirizzo IP del server di destinazione in formato network byte order
  * USERID: Stringa contenente nome utente, non terminata da 0x00, di dimensione arbitraria
  * NULL: 0x00
  
  ### Risposta
  
  * VN: Numero di versione della risposta. Dovrebbe essere 0x00
  * CD: Codice di risposta. Può assumere i seguenti valori:
     * 0x5A (90 dec): richiesta accettata
     * 0x5B (91 dec): richiesta rifiutata o fallita
     * 0x5C (92 dec): richiesta rifiutata perché il server SOCKS non ha potuto connettersi al server ident sul client
     * 0x5D (93 dec): richiesta rifiutata perché il server ident e il client hanno riportato USERID differenti
  * DSTPORT: ignorato per CONNECT
  * DSTIP: ignorato per CONNECT
  