Configurer, utiliser et tester des proxies (forward proxy) sous Linux.

Sujets associés : Proxy — Vue d’ensemble, Forward Proxy, Load Balancer vs Forward Proxy


Variables d’environnement proxy

La manière la plus universelle de configurer un proxy sur Linux : les variables d’environnement standard.

# Configurer le proxy pour la session courante
export http_proxy="http://proxy.exemple.com:3128"
export https_proxy="http://proxy.exemple.com:3128"
export ftp_proxy="http://proxy.exemple.com:3128"
 
# Proxy avec authentification
export http_proxy="http://utilisateur:motdepasse@proxy.exemple.com:3128"
export https_proxy="http://utilisateur:motdepasse@proxy.exemple.com:3128"
 
# Majuscules aussi reconnues par certains outils
export HTTP_PROXY="http://proxy.exemple.com:3128"
export HTTPS_PROXY="http://proxy.exemple.com:3128"
 
# Exclure des hôtes du proxy (pas de proxy pour ces destinations)
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,*.interne.exemple.com"
export NO_PROXY="localhost,127.0.0.1,192.168.0.0/16"
 
# Vérifier les variables actives
env | grep -i proxy
 
# Supprimer la config proxy
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY

Rendre permanent (tous les utilisateurs)

# /etc/environment (lu au login)
sudo tee -a /etc/environment <<'EOF'
http_proxy="http://proxy.exemple.com:3128"
https_proxy="http://proxy.exemple.com:3128"
no_proxy="localhost,127.0.0.1,10.0.0.0/8"
EOF
 
# /etc/profile.d/proxy.sh (scripts shell)
sudo tee /etc/profile.d/proxy.sh <<'EOF'
export http_proxy="http://proxy.exemple.com:3128"
export https_proxy="http://proxy.exemple.com:3128"
export no_proxy="localhost,127.0.0.1"
EOF

Proxy pour APT (Debian/Ubuntu)

# /etc/apt/apt.conf.d/99proxy
sudo tee /etc/apt/apt.conf.d/99proxy <<'EOF'
Acquire::http::Proxy "http://proxy.exemple.com:3128";
Acquire::https::Proxy "http://proxy.exemple.com:3128";
EOF
 
# Ou passer en argument
sudo apt-get -o Acquire::http::Proxy="http://proxy.exemple.com:3128" update

Proxy pour systemd (services)

# Ajouter le proxy à un service systemd
sudo systemctl edit docker
# Ajouter dans le fichier :
[Service]
Environment="HTTP_PROXY=http://proxy.exemple.com:3128"
Environment="HTTPS_PROXY=http://proxy.exemple.com:3128"
Environment="NO_PROXY=localhost,127.0.0.1"
 
sudo systemctl daemon-reload
sudo systemctl restart docker

curl avec proxy

# Proxy HTTP
curl -x http://proxy.exemple.com:3128 https://api.exemple.com/
 
# Proxy SOCKS5
curl --socks5 proxy.exemple.com:1080 https://api.exemple.com/
curl --socks5-hostname proxy.exemple.com:1080 https://api.exemple.com/
 
# Proxy avec authentification
curl -x http://user:pass@proxy.exemple.com:3128 https://api.exemple.com/
 
# Exclure du proxy
curl --noproxy "localhost,192.168.1.0/24" -x http://proxy:3128 https://api.exemple.com/
 
# Proxy via variable d'environnement (curl la respecte automatiquement)
export https_proxy="http://proxy.exemple.com:3128"
curl https://api.exemple.com/      # utilise le proxy automatiquement
 
# Ignorer la variable d'environnement proxy pour cette requête
curl --noproxy "*" https://api.exemple.com/

wget avec proxy

# Via variable d'environnement
export https_proxy="http://proxy.exemple.com:3128"
wget https://exemple.com/fichier.zip
 
# En argument
wget -e "https_proxy=http://proxy.exemple.com:3128" https://exemple.com/fichier.zip
 
# Via ~/.wgetrc
echo "https_proxy=http://proxy.exemple.com:3128" >> ~/.wgetrc
echo "no_proxy=localhost,127.0.0.1" >> ~/.wgetrc

Proxy SOCKS5 via SSH (tunnel dynamique)

# Créer un proxy SOCKS5 local via SSH (port 1080)
ssh -D 1080 -f -N utilisateur@serveur-distant
#    │       │  └── pas de commande distante (tunnel seulement)
#    │       └───── en arrière-plan
#    └─────────── dynamic port forwarding
 
# Utiliser ce tunnel SOCKS5
curl --socks5 localhost:1080 https://api.exemple.com/
export http_proxy="socks5://localhost:1080"
export https_proxy="socks5://localhost:1080"
 
# Vérifier que le tunnel est actif
ss -tnlp | grep 1080

mitmproxy — inspection HTTPS en développement

mitmproxy est un proxy interceptant qui déchiffre et affiche le trafic HTTPS.

# Démarrer mitmproxy (interface TUI)
mitmproxy --listen-port 8080
 
# Mode web (navigateur)
mitmweb --listen-port 8080
 
# Mode script (headless)
mitmdump --listen-port 8080 -w capture.mitm
 
# Configurer le client pour utiliser mitmproxy
export http_proxy="http://localhost:8080"
export https_proxy="http://localhost:8080"
 
# Installer le certificat CA de mitmproxy (pour déchiffrer HTTPS)
# Le certificat est dans ~/.mitmproxy/mitmproxy-ca-cert.pem
sudo cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
sudo update-ca-certificates
 
# Capturer le trafic d'une commande spécifique
mitmdump --listen-port 8080 &
http_proxy=http://localhost:8080 https_proxy=http://localhost:8080 \
    curl -k https://api.exemple.com/endpoint

Tester la configuration proxy

# Vérifier si le proxy est joignable
nc -zv proxy.exemple.com 3128
 
# Tester une requête via le proxy
curl -v -x http://proxy.exemple.com:3128 https://google.com
 
# Vérifier quelle IP est vue par le serveur distant (avec/sans proxy)
curl https://api.ipify.org                                          # sans proxy
curl -x http://proxy.exemple.com:3128 https://api.ipify.org        # avec proxy
 
# Tester avec authentification proxy
curl -v -x http://user:pass@proxy.exemple.com:3128 https://google.com
 
# Déboguer les variables proxy actives
env | grep -i proxy
 
# Vérifier que no_proxy fonctionne
curl -v --noproxy "exemple-interne.com" https://exemple-interne.com/

iptables REDIRECT — proxy transparent

Forcer du trafic vers un proxy sans configurer les clients (proxy transparent).

# Rediriger tout le trafic HTTP (port 80) vers mitmproxy (port 8080)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
    -j REDIRECT --to-port 8080
 
# Rediriger HTTPS (port 443) — nécessite SSL bumping (ex. Squid en mode SSL)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 \
    -j REDIRECT --to-port 8443
 
# Exclure la machine proxy elle-même (éviter boucle infinie)
sudo iptables -t nat -A PREROUTING -p tcp -m owner --uid-owner proxy \
    -j RETURN

En relation avec