Pour atteindre un réseau isolé, j'utilise un proxy ssh  -D socks  .
Afin d'éviter d'avoir à taper les détails chaque fois que je les ai ajoutés à ~/.ssh/config:
$ awk '/Host socks-proxy/' RS= ~/.ssh/config
Host socks-proxy
  Hostname pcit
  BatchMode yes
  RequestTTY no
  Compression yes
  DynamicForward localhost:9118
J'ai ensuite créé un fichier de définition d'unité de service utilisateur systemd :
$ cat ~/.config/systemd/user/SocksProxy.service 
[Unit]
Description=SocksProxy Over Bridge Host
[Service]
ExecStart=/usr/bin/ssh -Nk socks-proxy
[Install]
WantedBy=default.target
Je laisse le démon recharger les nouvelles définitions de service, j'active le nouveau service, le démarre, vérifie son état et vérifie qu'il écoute:
$ systemctl --user daemon-reload
$ systemctl --user list-unit-files | grep SocksP
SocksProxy.service   disabled
$ systemctl --user enable SocksProxy.service
Created symlink from ~/.config/systemd/user/default.target.wants/SocksProxy.service to ~/.config/systemd/user/SocksProxy.service.
$ systemctl --user start SocksProxy.service 
$ systemctl --user status SocksProxy.service 
● SocksProxy.service - SocksProxy Over Bridge Host
   Loaded: loaded (/home/alex/.config/systemd/user/SocksProxy.service; enabled)
   Active: active (running) since Thu 2017-08-03 10:45:29 CEST; 2s ago
 Main PID: 26490 (ssh)
   CGroup: /user.slice/user-1000.slice/user@1000.service/SocksProxy.service
           └─26490 /usr/bin/ssh -Nk socks-proxy
$ netstat -tnlp | grep 118
tcp     0    0 127.0.0.1:9118        0.0.0.0:*             LISTEN     
tcp6    0    0 ::1:9118              :::*                  LISTEN
Cela fonctionne comme prévu. Ensuite, je voulais éviter d'avoir à démarrer manuellement le service ou à l'exécuter de manière permanente avec autossh , en utilisant l' activation de socket systemd  pour la (re) génération à la demande. Cela n'a pas fonctionné, je pense que (ma version de) ne peut pas recevoir les descripteurs de fichiers socket.ssh
J'ai trouvé la documentation ( 1 , 2 ), et un exemple pour l' utilisation du systemd-socket-proxyd-Outil pour créer 2 services « wrapper », un « service » et une « prise »:
$ cat ~/.config/systemd/user/SocksProxyHelper.socket 
[Unit]
Description=On Demand Socks proxy into Work
[Socket]
ListenStream=8118
#BindToDevice=lo
#Accept=yes
[Install]
WantedBy=sockets.target
$ cat ~/.config/systemd/user/SocksProxyHelper.service 
[Unit]
Description=On demand Work Socks tunnel
After=network.target SocksProxyHelper.socket
Requires=SocksProxyHelper.socket SocksProxy.service
After=SocksProxy.service
[Service]
#Type=simple
#Accept=false
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:9118
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target
$ systemctl --user daemon-reload
Cela semble fonctionner jusqu'à ce qu'il sshmeure ou soit tué. Ensuite, il ne réapparaîtra pas lors de la prochaine tentative de connexion.
Des questions:
- / Usr / bin / ssh ne peut-il vraiment pas accepter les sockets passés par systemd? Ou seulement des versions plus récentes? Le mien est celui de up2date Debian 8.9 .
- Seules les unités de racine peuvent-elles utiliser l' BindTodeviceoption?
- Pourquoi mon service proxy ne réapparaît-il pas correctement lors de la première nouvelle connexion après la mort de l'ancien tunnel?
- Est-ce la bonne façon de configurer un "proxy ssh socks à la demande"? Si non, comment procédez-vous?
autossh.
                
autosshdevrait prendre soin de se reconnecter en cas d'échec de la connexion (bien que ce ne soit pas le système).