GNU/Linux >> Znalost Linux >  >> Linux

Jak přesměrovat ssh s AllowTcpForwarding nastaveným na ne?

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í!


Linux
  1. SSH na jiný port než 22:Jak na to (s příklady)

  2. Jak nastavit SSH tunelování

  3. Jak nastavit klíče SSH na Ubuntu 18.04

  1. Jak nastavit klíče SSH

  2. Jak nastavit datum pomocí formátu Epoch?

  3. Jak nastavit přesměrování webu

  1. Jak zakázat přihlášení SSH pomocí hesla

  2. Jak na to:Začínáme s Ansible

  3. Jak nastavit klíče SSH na Debianu