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é | SOCKS4 | SOCKS5 |
|---|---|---|
| Protocoles | TCP uniquement | TCP + UDP |
| Authentification | Non | Oui (user/pass, GSSAPI) |
| IPv6 | Non | Oui |
| Résolution DNS | Côté client | Côté serveur (SOCKS5) ou client |
| Usage moderne | Rare (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.com2. 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 podsSOCKS vs Forward Proxy HTTP
| SOCKS5 | Forward Proxy HTTP | |
|---|---|---|
| Couche | L5 (Session) | L7 (Application) |
| Protocoles | Tout TCP/UDP | HTTP/HTTPS uniquement (natif) |
| Filtrage | Non (opaque) | Oui (URL, domaine, contenu) |
| Journalisation | IP + port | URL, méthode, headers |
| Performance | Très faible overhead | Overhead applicatif |
| Usage | Tunneling générique, Tor, SSH | Contrô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
- Protocoles OSI - Index — tous les protocoles par couche
- Forward Proxy — proxy HTTP applicatif, plus de fonctionnalités mais limité à HTTP
- SSH — SSH crée facilement un proxy SOCKS5 dynamique (
-D) - Forward Proxy vs NAT — comparaison des mécanismes de masquage