SOCKS — Socket Secure

Couche OSI : L5 — Session
Port : 1080 (convention)

SOCKS est un protocole de proxy générique qui opère au niveau des sessions. Contrairement au Forward Proxy HTTP (qui ne comprend que HTTP/HTTPS), SOCKS est agnostique au protocole — il peut relayer n’importe quel trafic TCP (et UDP avec SOCKS5).


SOCKS4 vs SOCKS5

FonctionnalitéSOCKS4SOCKS5
ProtocolesTCP uniquementTCP + UDP
AuthentificationNonOui (user/pass, GSSAPI)
IPv6NonOui
Résolution DNSCôté clientCôté serveur (SOCKS5) ou client
Usage moderneRare (legacy)Standard

Fonctionnement SOCKS5

Application (ex: navigateur)
  │
  │  [connexion TCP vers proxy SOCKS5 sur port 1080]
  ▼
Proxy SOCKS5
  │  négociation : méthode d'auth ?
  │  → "no auth" ou "user/pass"
  │
  │  [si auth] client envoie user + pass
  │
  │  commande : CONNECT monserveur.com:443
  │
  │  [proxy ouvre la connexion vers monserveur.com:443]
  ▼
monserveur.com:443
  │
  [le proxy relaie les octets dans les deux sens]
  [l'application n'a aucune connaissance du réseau au-delà du proxy]

Cas d’usage

1. Proxy via SSH (tunnel dynamique)

# Créer un proxy SOCKS5 via SSH sur localhost:1080
ssh -D 1080 alice@serveur-distant.com
 
# Tout le trafic de l'application passe par le serveur SSH
# → Configurer le navigateur : proxy SOCKS5 localhost:1080
 
# Avec curl
curl --socks5-hostname localhost:1080 https://example.com

2. Contourner un réseau restrictif

Un réseau d’entreprise bloque certains ports. SOCKS5 via SSH permet de faire passer n’importe quel protocole dans le tunnel SSH (port 22) :

Laptop → SSH:22 → Serveur externe → monserveur.com:5432 (Postgres)
                                  → monserveur.com:6379 (Redis)
                                  → n'importe quel port

3. Tor (The Onion Router)

Tor expose un proxy SOCKS5 local (port 9050) que les applications utilisent pour anonymiser leur trafic :

# Configurer une application pour utiliser Tor
export ALL_PROXY=socks5://localhost:9050
curl https://check.torproject.org/

4. Kubernetes — kube-proxy et proxies internes

Certains outils Kubernetes utilisent SOCKS pour le tunneling :

# kubectl proxy — expose l'API Kubernetes localement
kubectl proxy --port=8001
 
# Accès aux services Kubernetes via SOCKS
ssh -D 1080 -N user@bastion-k8s.com
kubectl --proxy-url=socks5://localhost:1080 get pods

SOCKS vs Forward Proxy HTTP

SOCKS5Forward Proxy HTTP
CoucheL5 (Session)L7 (Application)
ProtocolesTout TCP/UDPHTTP/HTTPS uniquement (natif)
FiltrageNon (opaque)Oui (URL, domaine, contenu)
JournalisationIP + portURL, méthode, headers
PerformanceTrès faible overheadOverhead applicatif
UsageTunneling générique, Tor, SSHContrôle d’accès web entreprise

Configuration dans les applications

# Variables d'environnement (Linux)
export ALL_PROXY=socks5://localhost:1080
export NO_PROXY=localhost,127.0.0.1,10.0.0.0/8
 
# curl
curl --socks5 localhost:1080 https://example.com
curl --socks5-hostname localhost:1080 https://example.com  # DNS côté proxy
 
# git
git config --global http.proxy socks5://localhost:1080
 
# Python (requests)
import requests
proxies = {"https": "socks5://localhost:1080"}
r = requests.get("https://example.com", proxies=proxies)

En relation avec