Aller au contenu
Mind in Motion

Configurer le proxy d’un environnement Ubuntu/RDK : bascule automatique et accès au réseau local

Configuration pratique d’un proxy pour Ubuntu et RDK avec détection automatique, commandes manuelles, transmission via sudo et dépannage d’apt, Git, curl et ROS.

Développement,ROS4min de lecture

Dans un environnement de développement Ubuntu ou RDK, le proxy sert souvent en même temps à apt, Git, curl, aux paquets ROS et aux dépendances Python. L’appareil proxy du réseau local peut changer selon le réseau utilisé ; des variables shell fixes peuvent alors perturber le travail hors ligne, les communications locales et le dépannage de l’appareil.

Cet article réunit un script de proxy automatique pour Ubuntu Shell et les variables de proxy du réseau local RDK dans une seule configuration : le terminal vérifie le port du proxy au démarrage et l’active lorsque le port répond. Les adresses des appareils locaux sont ajoutées à NO_PROXY afin que SSH, les nœuds ROS et les connexions WebSocket restent directes. Les exemples d’hôte, de ports et d’adresse RDK utilisent des valeurs fictives ; remplacez-les par les valeurs du réseau réel avant le déploiement.

  • Un poste Ubuntu ou une carte RDK utilisant Bash.
  • Un service proxy exécuté sur un autre ordinateur ou une passerelle du même réseau local.
  • Le besoin de faire lire les variables de proxy à apt, Git, curl ou aux outils ROS.
  • Le passage fréquent d’un réseau avec proxy à un réseau classique.

Commencez par confirmer le shell courant :

Terminal window
echo "$SHELL"
ps -p "$$" -o comm=

Cette configuration est écrite dans ~/.bashrc. Si l’image RDK utilise un autre shell, placez les mêmes fonctions dans le fichier de démarrage correspondant et vérifiez la syntaxe adaptée à ce shell.

Variable Rôle
HTTP_PROXY, HTTPS_PROXY Fournir un proxy HTTP/HTTPS aux clients
ALL_PROXY Fournir un proxy SOCKS5 aux programmes qui prennent en charge cette variable
NO_PROXY Garder les adresses locales, du réseau local et du RDK en accès direct
PROXY_HOST Adresse de l’appareil proxy du réseau local
HTTP_PORT, SOCKS5_PORT Ports des services HTTP et SOCKS5

Définir les variables en majuscules et en minuscules améliore la compatibilité entre les programmes. Les processus lancés par apt, Git, curl et ROS héritent des variables exportées par le shell courant.

La détection automatique utilise nc, fourni par netcat-openbsd :

Terminal window
sudo apt update
sudo apt install netcat-openbsd
nc -h

Lors de la première installation sans proxy, utilisez temporairement une source de paquets accessible ou configurez d’abord le proxy dans les paramètres réseau du système.

Par défaut, sudo supprime certaines variables d’environnement. Créez /etc/sudoers.d/proxy :

Terminal window
sudoedit /etc/sudoers.d/proxy

Écrivez :

Defaults env_keep += "http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY no_proxy NO_PROXY"

Définissez le propriétaire et les permissions, puis vérifiez la syntaxe de sudoers :

Terminal window
sudo chown root:root /etc/sudoers.d/proxy
sudo chmod 0440 /etc/sudoers.d/proxy
sudo visudo -c

La sortie attendue contient :

/etc/sudoers: parsed OK
/etc/sudoers.d/proxy: parsed OK

Les fichiers de /etc/sudoers.d/ doivent avoir le propriétaire root:root et les permissions 0440 ; sinon sudo peut refuser de les lire.

Modifiez ~/.bashrc :

Terminal window
nano ~/.bashrc

Ajoutez le code suivant. Remplacez d’abord PROXY_HOST, HTTP_PORT, SOCKS5_PORT et RDK_HOST. Conserver temporairement les valeurs fictives permet de vérifier la structure du script.

Terminal window
# =========================
# Proxy réseau Ubuntu/RDK
# =========================
PROXY_SCHEME="http"
PROXY_HOST="<PROXY_HOST>"
HTTP_PORT="<HTTP_PORT>"
SOCKS5_PORT="<SOCKS5_PORT>"
RDK_HOST="<RDK_IP>"
# auto : vérifier le port du proxy, le proxy système ou le TUN ; port : vérifier uniquement le port
# system : vérifier le proxy système et utiliser le proxy ci-dessus ; tun : vérifier le TUN et utiliser le proxy ci-dessus
# off : ne pas modifier les variables de proxy lors de la lecture de ~/.bashrc
PROXY_AUTO_MODE="auto"
proxy_configured() {
[ -n "$PROXY_HOST" ] &&
[ "$PROXY_HOST" != "<PROXY_HOST>" ] &&
[ -n "$HTTP_PORT" ] &&
[ "$HTTP_PORT" != "<HTTP_PORT>" ]
}
proxy_port_available() {
proxy_configured || return 1
command -v nc >/dev/null 2>&1 || return 1
nc -z -w1 "$PROXY_HOST" "$HTTP_PORT" >/dev/null 2>&1
}
proxy_system_enabled() {
command -v gsettings >/dev/null 2>&1 || return 1
local mode
mode=$(gsettings get org.gnome.system.proxy mode 2>/dev/null)
case "$mode" in
""|*none*) return 1 ;;
*) return 0 ;;
esac
}
proxy_tun_enabled() {
command -v ip >/dev/null 2>&1 || return 1
ip -o link show 2>/dev/null |
awk -F': ' '{print $2}' |
cut -d@ -f1 |
grep -Eq '^(tun|tap|wg|tailscale|zt)'
}
proxy_network_enabled() {
proxy_port_available || proxy_system_enabled || proxy_tun_enabled
}
proxy_on() {
if ! proxy_configured; then
[ "${1:-}" = "--quiet" ] || echo "Configurez d’abord PROXY_HOST et HTTP_PORT."
return 1
fi
export http_proxy="$PROXY_SCHEME://$PROXY_HOST:$HTTP_PORT"
export https_proxy="$PROXY_SCHEME://$PROXY_HOST:$HTTP_PORT"
export HTTP_PROXY="$PROXY_SCHEME://$PROXY_HOST:$HTTP_PORT"
export HTTPS_PROXY="$PROXY_SCHEME://$PROXY_HOST:$HTTP_PORT"
if [ -n "$SOCKS5_PORT" ] && [ "$SOCKS5_PORT" != "<SOCKS5_PORT>" ]; then
export all_proxy="socks5h://$PROXY_HOST:$SOCKS5_PORT"
export ALL_PROXY="socks5h://$PROXY_HOST:$SOCKS5_PORT"
else
unset all_proxy ALL_PROXY
fi
# La prise en charge des jokers NO_PROXY dépend du client ; RDK_HOST force l’accès direct.
export no_proxy="localhost,127.0.0.1,::1,$RDK_HOST,10.*,192.168.*,172.*"
export NO_PROXY="$no_proxy"
if [ "${1:-}" != "--quiet" ]; then
echo "Proxy activé"
echo "Proxy HTTP : $http_proxy"
if [ -n "$all_proxy" ]; then
echo "Proxy SOCKS5 : $all_proxy"
else
echo "Proxy SOCKS5 : désactivé"
fi
fi
}
proxy_off() {
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
unset all_proxy ALL_PROXY no_proxy NO_PROXY
if [ "${1:-}" != "--quiet" ]; then
echo "Proxy désactivé"
fi
}
proxy_status() {
if proxy_system_enabled; then
echo "Proxy système : ON"
else
echo "Proxy système : OFF"
fi
if proxy_tun_enabled; then
echo "Route TUN : ON"
else
echo "Route TUN : OFF"
fi
if proxy_port_available; then
echo "Port proxy : ON ($PROXY_HOST:$HTTP_PORT)"
else
echo "Port proxy : OFF ($PROXY_HOST:$HTTP_PORT)"
fi
if [ -n "$http_proxy" ]; then
echo "Proxy du shell : ON"
echo "Proxy HTTP : $http_proxy"
echo "Proxy HTTPS : $https_proxy"
if [ -n "$all_proxy" ]; then
echo "Proxy SOCKS5 : $all_proxy"
else
echo "Proxy SOCKS5 : désactivé"
fi
else
echo "Proxy du shell : OFF"
fi
}
case "$PROXY_AUTO_MODE" in
auto)
if proxy_network_enabled && proxy_port_available; then
proxy_on --quiet
else
proxy_off --quiet
fi
;;
port)
if proxy_port_available; then
proxy_on --quiet
else
proxy_off --quiet
fi
;;
system)
if proxy_system_enabled && proxy_port_available; then
proxy_on --quiet
else
proxy_off --quiet
fi
;;
tun)
if proxy_tun_enabled && proxy_port_available; then
proxy_on --quiet
else
proxy_off --quiet
fi
;;
off)
;;
*)
echo "Mode PROXY_AUTO_MODE inconnu : $PROXY_AUTO_MODE"
;;
esac

Rechargez le fichier :

Terminal window
source ~/.bashrc
proxy_status

Commandes manuelles :

Terminal window
proxy_on
proxy_off
proxy_status

proxy_on et proxy_off agissent sur le shell courant et ses processus enfants. L’ouverture d’un nouveau terminal relance la logique automatique.

Terminal window
env | grep -i proxy

Terminal window
curl -I --max-time 10 https://example.com

Le mode verbeux permet d’observer la négociation CONNECT ou SOCKS5 :

Terminal window
curl -vI --max-time 10 https://example.com

Terminal window
sudo env | grep -i proxy
sudo apt update

Terminal window
curl --noproxy '*' -I --max-time 5 http://$RDK_HOST:8000
ssh <RDK_USER>@$RDK_HOST

L’adresse de l’appareil utilisée par ROS, SSH, la page de la caméra et le WebSocket rosbridge doit figurer dans NO_PROXY. Testez les services locaux avec curl –noproxy ‘*’ pour isoler les règles du proxy des problèmes de connectivité.

Le proxy sert principalement aux téléchargements de dépendances publiques :

  • apt update et apt install récupèrent les paquets Ubuntu, ROS ou RDK.
  • Les clonages et pull Git accèdent aux dépôts distants.
  • curl, wget et les gestionnaires de paquets Python accèdent aux adresses externes.

SSH vers le RDK, la page de la caméra, le WebSocket rosbridge et les communications ROS locales utilisent une connexion directe. RDK_HOST et les plages locales placées dans NO_PROXY permettent de conserver les variables de proxy pour les requêtes publiques.

nc prouve seulement que le port TCP accepte une connexion. Le service proxy doit aussi utiliser le bon protocole. Utilisez http:// pour un proxy HTTP et socks5h:// pour un proxy SOCKS5. Vérifiez l’adresse d’écoute, le port et les contrôles d’accès de l’application proxy.

Vérifiez dans cet ordre :

Terminal window
proxy_status
sudo env | grep -i proxy
sudo visudo -c
sudo apt -o Debug::Acquire::http=true update

Certaines versions d’apt acceptent aussi un fichier de proxy séparé dans /etc/apt/apt.conf.d/. Cette configuration commence par des variables d’environnement afin que proxy_on et proxy_off pilotent ensemble l’état du shell.

Vérifiez que NO_PROXY contient l’adresse IP actuelle du RDK, son nom d’hôte et la plage du réseau local. La prise en charge des jokers et de la notation CIDR varie selon les clients ; l’approche la plus fiable consiste à placer l’adresse IP exacte du RDK dans RDK_HOST.

© yznn007. Tous droits réservés.