Para llegar a una red aislada, uso un proxy ssh -D
socks .
Para evitar tener que escribir los detalles cada vez que los agregué a ~/.ssh/config
:
$ awk '/Host socks-proxy/' RS= ~/.ssh/config
Host socks-proxy
Hostname pcit
BatchMode yes
RequestTTY no
Compression yes
DynamicForward localhost:9118
Luego creé un archivo de definición de unidad de servicio systemd-user :
$ cat ~/.config/systemd/user/SocksProxy.service
[Unit]
Description=SocksProxy Over Bridge Host
[Service]
ExecStart=/usr/bin/ssh -Nk socks-proxy
[Install]
WantedBy=default.target
Dejé que el demonio volviera a cargar las nuevas definiciones de servicio, habilité el nuevo servicio, lo inicié, verifiqué su estado y verifiqué que está escuchando:
$ 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
Esto funciona según lo previsto. Luego, quería evitar tener que iniciar manualmente el servicio, o ejecutarlo permanentemente con autossh , mediante la activación del socket systemd para el (rea) desove bajo demanda. Eso no funcionó, creo que (mi versión de) no puede recibir descriptores de archivos de socket.ssh
Encontré la documentación ( 1 , 2 ) y un ejemplo para usar la systemd-socket-proxyd
herramienta -tool para crear 2 servicios "wrapper", un "servicio" y 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
Esto parece funcionar, hasta que ssh
muere o muere. Entonces no volverá a aparecer en el siguiente intento de conexión cuando debería.
Preguntas:
- ¿Puede / usr / bin / ssh realmente no aceptar sockets pasados por systemd? ¿O solo versiones más nuevas? El mío es el de up2date Debian 8.9 .
- ¿Solo las unidades de raíz pueden usar la
BindTodevice
opción? - ¿Por qué mi servicio proxy no se reaparece correctamente en la primera conexión nueva después de que el túnel viejo muere?
- ¿Es esta la forma correcta de configurar un "proxy de calcetines ssh a pedido"? Si no, ¿cómo lo haces?
autossh
.
autossh
debe ocuparse de reconectarse en caso de que falle la conexión (aunque no es el sistema).