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.
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 :
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 :
sudo apt updatesudo apt install netcat-openbsdnc -hLors 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 :
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 :
sudo chown root:root /etc/sudoers.d/proxysudo chmod 0440 /etc/sudoers.d/proxysudo visudo -cLa sortie attendue contient :
/etc/sudoers: parsed OK/etc/sudoers.d/proxy: parsed OKLes 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 :
nano ~/.bashrcAjoutez 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.
# =========================# 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 ~/.bashrcPROXY_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" ;;esacRechargez le fichier :
source ~/.bashrcproxy_statusCommandes manuelles :
proxy_onproxy_offproxy_statusproxy_on et proxy_off agissent sur le shell courant et ses processus enfants. L’ouverture d’un nouveau terminal relance la logique automatique.
env | grep -i proxycurl -I --max-time 10 https://example.comLe mode verbeux permet d’observer la négociation CONNECT ou SOCKS5 :
curl -vI --max-time 10 https://example.comsudo env | grep -i proxysudo apt updatecurl --noproxy '*' -I --max-time 5 http://$RDK_HOST:8000ssh <RDK_USER>@$RDK_HOSTL’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 :
proxy_statussudo env | grep -i proxysudo visudo -csudo apt -o Debug::Acquire::http=true updateCertaines 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.