Il est parfois nécessaire d’avoir à s’authentifier sur un proxy socks pour plusieurs raisons comme accéder à un site web, établir une session ssh, etc.
Ici nous allons voir comment établir cette connexion de manière transparente pour le système, même si votre application que vous souhaitez utiliser ne supporte pas la connexion à un proxy socks.
L’identifiant et le mot de passe de connexion seront stockés dans le fichier de configuration de redsocks, l’un des objectifs étant de ne plus avoir à s’en souvenir 😉
Comment ça fonctionne
- Des règles iptables redirigent le traffic pour une destination spécifique vers un port local.
- Redsocks écoute sur ce port, s’authentifie sur le proxy distant et envoie le trafic.
- Systemd démarre et automatise le tout.
Configuration de l’environnement
Redsocks
Il est possible d’installer redsocks depuis les sources ou directement depuis le gestionnaire de paquets.
apt update
apt install redsocks
La configuration redsocks est située dans /etc/redsocks.conf
. Elle est assez simple et facile à comprendre :
base {
log_debug = on;
log_info = on;
log = "stderr";
daemon = off;
redirector = iptables;
}
redsocks {
// Local IP listen to
local_ip = 127.0.0.1;
// Port to listen to
local_port = 12345;
// Remote proxy address
ip = MY.PROXY.ADDRESS;
port = 443;
// Proxy type
type = socks5;
// Username to authorize on proxy server
login = MYLOGIN;
// Password for a proxy user
password = MYPASSWORD;
// Do not disclose real IP
disclose_src = false;
}
La configuration redsocks est terminée, on peut le démarrer avec systemd :
systemctl enable --now redsocks
On vérifie que tout est au vert :
systemctl status redsocks
Redsocks est maintenant configuré pour démarrer automatiquement. Pour l’instant le trafic n’est pas intercepté, la redirection vers le proxy distant ne fonctionne donc pas.
Configuration d’iptables
J’ai écris un petit bout de script pour ajouter les règles iptables automagiquement. Le script est écrit dans /usr/local/bin/iptablesSocks.sh
:
#!/bin/bash
arg=${1}
add_rules () {
iptables -t nat -F
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -d 172.17.0.0/24 -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A REDSOCKS -d 172.17.1.0/24 -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
}
delete_rules () {
iptables -t nat -F
iptables -t nat -X
}
case ${arg} in
start ) add_rules ;;
stop ) delete_rules ;;
* ) echo "no matching command"
exit 0
;;
esac
- Dans la fonction
add_rules
, on ajoute les règles pour envoyer le trafic pour tcp/172.17.{0,1}.0/24 vers tcp/localhost/12345 - Dans la fonction
delete_rules
, on flush les règles. - On peut donc utiliser ce script avec les arguments
start
etstop
.
Maintenant redsocks fonctionne, la configuration iptables aussi. Il reste à “interfacer” les deux pour être certain que les règles iptables sont chargées au lancement de redsocks, et effacées lors de son arrêt.
Systemd
Le paquet redsocks fournit un fichier service systemd. Il est possible dans ces fichiers de surcharger tout ou partie de la configuration à l’aide de la commande systemctl edit
.
Exemple :
sudo systemctl edit redsocks
Note : Il n’est pas nécessaire d’ajouter .service à la fin, ou le chemin complet vers le fichier service.
Et tada :
Commen indiqué en commentaire, il est possible d’ajouter du contenu entre les lignes "### Anything between[…]" and "### Lines below this".
Ci-dessous la configuration utilisée :
[Unit]
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStartPost=//usr/local/bin/iptablesSocks.sh start
ExecStopPost=/usr/local/bin/iptablesSocks.sh stop
Une fois le fichier sauvegardé, on peut en vérifier le contenu en lisant /etc/systemd/system/redsocks.service.d/override.conf
Pour tester la configuration, on recharge la configuration systemd :
sudo systemctl daemon-reload
On relance redsocks :
sudo systemctl restart redsocks
Les règles iptables sont visibles avec ;
sudo iptables -t nat -L
En sortie :
Chain REDSOCKS (1 references)
target prot opt source destination
REDIRECT tcp -- anywhere 172.17.0.0/24 redir ports 12345
REDIRECT tcp -- anywhere 172.17.1.0/24 redir ports 12345
Enjoy 😉