Dokud lze spustit socat
lokálně a na gateway
(nebo dokonce jen bash
a cat
na gateway
, viz poslední příklad!) a je povoleno ne použijte pty, aby bylo 8 bitů čisté, je možné vytvořit tunel přes ssh. Zde jsou 4 příklady, které vylepšují předchozí:
Základní příklad fungující jednou
(jejich vidlice by vyžadovala jedno připojení ssh na tunel, což není dobré). Je nutné escapovat :
aby socat přijal příkaz exec:
termín1:
$ socat tcp-listen:12345,reuseaddr exec:'ssh [email protected] exec socat - tcp\:devbox\:22',nofork
termín 2:
$ ssh -p 12345 [email protected]
termín1:
[email protected]'s password:
termín 2:
[email protected]'s password:
Prohozením první a druhé adresy je soket okamžitě dostupný
socat
musí zůstat pod kontrolou, takže žádné nofork
:
termín1:
$ socat exec:'ssh [email protected] exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
[email protected]'s password:
termín 2:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Pomocí ControlMaster
ssh
umožňuje rozvětvení při použití pouze jediného ssh připojení k bráně, čímž poskytuje chování podobné obvyklému přesměrování portů:
termín1:
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
termín 2:
$ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket [email protected] exec socat - tcp\:devbox\:22'
termín 3:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Pouze bash
a cat
k dispozici na gateway
Pomocí bash
vestavěné přesměrování tcp a dva poloduplexní cat
příkazy (pro plně duplexní výsledek) nepotřebujete ani vzdálené socat
nebo netcat
. Manipulace s více vrstvami vnořených a uvozových uvozovek byla trochu nešikovná a možná by se dala udělat lépe nebo zjednodušit použitím vzdáleného bash
skript. Je třeba dbát na to, abyste měli rozvětvený cat
pouze pro výstup:
termín1 (beze změny):
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
termín 2:
$ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket [email protected] '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
termín 3:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Nahradit ProxyJump za Bash
Výše uvedený nápad je dobrý! Zde je moje obecná verze ssh_config při ProxyJump nefunguje protože AllowTcpForwarding nastaveno na no a můj výchozí shell je BASH:
ProxyCommand=ssh -T [email protected] "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
- -T Zakázat alokaci pseudoterminálu
- exec Žádný nový proces (bash) nebude vytvořen
- 3 je jednoduše přesměrování na dostupný deskriptor souboru
- /dev/tcp/... požádá bash, aby otevřel odpovídající TCP socket.
- %h a %p bude vaším OpenSSH klientem vyhodnocena jako devbox a 22
- 2<&- zavře STDERR (můžete jej také přesměrovat na /dev/null)
- kočka <&3 & přečte vybraný deskriptor souboru 3 na pozadí
- kočka>&3 zapíše náš deskriptor souboru do popředí
- zabijte $! zabije "čtecí" kočku <&3 příkaz běžící na pozadí, když zavřete/přerušíte spojení. Jinak by běžel dál.
Mohl by mi nahradit ProxyJump v situacích, kdy byl zakázán na skokovém serveru, ale opravdu jsem tam nechtěl předávat svůj soukromý klíč nebo zadávat hesla bez extra úrovně šifrování. Používání jiných SSH_AUTH_SOCK jako root nebo nahrávání relací terminálu kompletně pomocí kláves jsou skutečné věci.
Ale vždy se prosím ujistěte, že neporušujete žádné zásady, které se na vás vztahují!