Um ein isoliertes Netzwerk zu erreichen, benutze ich einen ssh -D
socks Proxy .
Um zu vermeiden, dass ich die Details jedes Mal eingeben muss, wenn ich sie hinzufüge ~/.ssh/config
:
$ awk '/Host socks-proxy/' RS= ~/.ssh/config
Host socks-proxy
Hostname pcit
BatchMode yes
RequestTTY no
Compression yes
DynamicForward localhost:9118
Dann habe ich eine systemd-user Service Unit Definitionsdatei erstellt:
$ cat ~/.config/systemd/user/SocksProxy.service
[Unit]
Description=SocksProxy Over Bridge Host
[Service]
ExecStart=/usr/bin/ssh -Nk socks-proxy
[Install]
WantedBy=default.target
Ich habe den Dämon die neuen Dienstdefinitionen neu laden lassen, den neuen Dienst aktiviert, gestartet, seinen Status überprüft und überprüft, ob er empfangsbereit ist:
$ 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/[email protected]/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
Das funktioniert wie vorgesehen. Dann wollte ich vermeiden, dass der Dienst manuell gestartet oder permanent mit autossh ausgeführt werden muss , indem ich die systemd- Socket-Aktivierung für das (erneute) Abrufen nach Bedarf verwende. Das hat nicht funktioniert, ich glaube (meine Version von) ssh
kann keine Socket-Dateideskriptoren empfangen.
Ich fand die Dokumentation ( 1 , 2 ) und ein Beispiel für die Verwendung des systemd-socket-proxyd
Tools zum Erstellen von 2 "Wrapper" -Diensten, einem "Dienst" und einem "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
Dies scheint zu funktionieren, bis es ssh
stirbt oder getötet wird. Dann wird es beim nächsten Verbindungsversuch nicht erneut erzeugt, wenn es sollte.
Fragen:
- Kann / usr / bin / ssh wirklich keine vom System übergebenen Sockets akzeptieren? Oder nur neuere Versionen? Meins ist das von up2date Debian 8.9 .
- Können nur Root-Einheiten die
BindTodevice
Option verwenden? - Warum wird mein Proxy-Dienst bei der ersten neuen Verbindung nach dem Ausfall des alten Tunnels nicht korrekt neu gestartet?
- Ist dies der richtige Weg, um einen "On-Demand-SSH-Socken-Proxy" einzurichten? Wenn nicht, wie machst du das?
autossh
sollte für den Fall, dass die Verbindung ausfällt (obwohl dies nicht der Systemweg ist), auf die Wiederherstellung der Verbindung achten.autossh
.Antworten:
Ich denke, das ist nicht allzu überraschend, wenn man bedenkt:
Benutzer systemd-Instanzen sind im Allgemeinen ziemlich isoliert und können z. B. nicht mit der Hauptinstanz pid-0 kommunizieren. Abhängig von Systemeinheiten sind solche Dinge aus User-Unit-Dateien nicht möglich.
Die Dokumentation für
BindToDevice
Erwähnungen:Aufgrund der oben genannten Einschränkung können wir darauf hinweisen, dass die Option bei systemd-Benutzerinstanzen nicht funktioniert.
Soweit ich weiß, sieht die Ereigniskette wie folgt aus:
SocksProxyHelper.socket
ist gestartet.SocksProxyHelper.service
.SocksProxyHelper.service
startet auch systemdSocksProxy.service
.systemd-socket-proxyd
Akzeptiert den systemd-Socket und leitet seine Daten an weiterssh
.ssh
stirbt oder wird getötet.SocksProxy.service
in einen inaktiven Zustand, tut aber nichts.SocksProxyHelper.service
läuft weiter und akzeptiert Verbindungen, kann jedoch keine Verbindung herstellenssh
, da sie nicht mehr ausgeführt wird.Das Update ist hinzuzufügen ,
BindsTo=SocksProxy.service
zuSocksProxyHelper.service
. Zitiert seine Dokumentation (Hervorhebung hinzugefügt):Es gibt wahrscheinlich keinen "richtigen Weg". Diese Methode hat ihre Vorteile (alles ist "on-demand") und Nachteile (Abhängigkeit von systemd, die erste Verbindung kommt nicht durch, weil ssh noch nicht mit dem Abhören begonnen hat). Vielleicht ist es eine bessere Lösung, die systemd-Socket-Aktivierungsunterstützung in autossh zu implementieren.
quelle
BindsTo=SocksProxy.service
den Unit-Abschnitt der Datei~/.config/systemd/user/SocksProxyHelper.service
nach derAfter=SocksProxy.service
Zeile hinzugefügt . Ein manueller Neustart des SocksProxy-Dienstes ist jetzt nicht mehr erforderlich, wenn SSH stirbt / gets_killed. Gibt es eine Möglichkeit für systemd, die ursprüngliche Verbindung zu "halten", so dass es keinen TCP-Reset erhält?$LISTEN_FDS
ohne Hinzufügen einer Abhängigkeit von implementiert werdensd_listen_fds()
, so dass es immer noch ein harter Verkauf sein kann, aber nicht zu hart.