Per raggiungere una rete isolata io uso un proxy ssh -D
socks .
Per evitare di dover digitare i dettagli ogni volta che li ho aggiunti a ~/.ssh/config
:
$ awk '/Host socks-proxy/' RS= ~/.ssh/config
Host socks-proxy
Hostname pcit
BatchMode yes
RequestTTY no
Compression yes
DynamicForward localhost:9118
Quindi ho creato un file di definizione dell'unità di servizio utente di 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
Ho lasciato che il demone ricarichi le nuove definizioni di servizio, abiliti il nuovo servizio, lo avvii, ne abbia verificato lo stato e verificato che stia ascoltando:
$ 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
Funziona come previsto. Quindi volevo evitare di dover avviare manualmente il servizio o eseguirlo in modo permanente con autossh , utilizzando l' attivazione socket di systemd per la (ri) generazione su richiesta. Non ha funzionato, penso (la mia versione di) non può ricevere descrittori di file socket.ssh
Ho trovato la documentazione ( 1 , 2 ) e un esempio per l'uso di systemd-socket-proxyd
-tool per creare 2 servizi "wrapper", un "servizio" e un "socket":
$ 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
Questo sembra funzionare fino a quando non ssh
muore o viene ucciso. Quindi non si rigenererà al prossimo tentativo di connessione quando dovrebbe.
Domande:
- / Usr / bin / ssh non può davvero accettare socket passati dal sistema? O solo versioni più recenti? Il mio è quello di Debian 8.9 aggiornato .
- Solo le unità di root possono usare l'
BindTodevice
opzione? - Perché il mio servizio proxy non viene rigenerato correttamente alla prima nuova connessione dopo la morte del vecchio tunnel?
- È questo il modo giusto di impostare un "proxy di calze ssh su richiesta"? Se no, come lo fai?
autossh
.
autossh
dovrebbe occuparsi di riconnettersi nel caso in cui la connessione fallisca (anche se non è il sistema).