Hlavní navigace

Reverzní SSH tunelování

28. 7. 2008 23:52 | Jan Hrach

Předminule jsem psal o zavádění internetu do jedné firmy v Chrastavě. U:fon nepřiděluje veřejné adresy a tak chci sestavit tunel.

Sestavení tunelu jsem chtěl původně dát do /etc/rc.local, ale to se neosvědčilo – jednak spojení může „vyhnít“,  a pak už není nikdo, kdo by jej znovu nahodil, a jednak nechci mít zbytečně navázaný tunel. Telefonické „aktivování“ jsem zavrhl, Jeho Veličenstvo Pan Ředitel má telefonátů moc i tak.

Rozhodl jsem se, že se skript bude jednou za půl hodiny snažit stáhnout soubůrek, a když se mu to podaří, postaví tunel.

Samotný tunel

ssh -R 0.0.0.0:1234:localhost:22 tunelar@yakumo.hrach.eu -n -N -o ConnectTimeout=20 ConnectionAttempts=1

SSHčko se připojí s uživatelem tunelar na yakumo.hrach.eu a port 1234. Na yakumu na všech (0.0.0.0) rozhraních se bude forwardovat na port 22 lokálního přístroje. -N dělá (tedy spíše nedělá) nespuštění vzdáleného shellu, další parametry viz man ssh. Tunelarovi můžeme nastavit shell na /bin/false.  chsh tunelar -s /bin/false

Pokud toto spustíme, pravděpodobně zjistíme, že se port 1234 otevřel na yakumu jenom na localhostu a zvenku není přístupný. RTFM, man ssh:

By default, the listening socket on the server will be bound to the loopback interface only. This may be overriden by specifying a bind_address. An empty bind_address, or the address ‚*‘, indi- cates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see sshd_config(5)).

Hmm…

The argument may be ``no'' to force remote port forward- ings to be available to the local host only, ``yes'' to force remote port forwardings to bind to the wildcard address, or ``clientspecified'' to allow the client to select the address to which the forwarding is bound.

Takže do /etc/ssh/sshd_config přidáme GatewayPorts clientspecified.

Aby šlo přihlašování automaticky (bez hesla), vytvoříme si nějakého uživatele (přece nebudeme stavět tunel pod rootem) a pomocí tohoto návodu mu vyrobíme klíč.

Omáčka okolo

#!/bin/bash
while true; do
if wget http://yakumo.hrach.eu/tunel -q -O /dev/null
then
echo ok
ssh -R 0.0.0.0:1234:localhost:22 tunelar@yakumo.hrach.eu -n -N -o ConnectTimeout=20 ConnectionAttempts=1sleep 1 #když spojení spadne, pokusíme se ho obnovit skoro hnedelseecho failsleep 1800 #jinak se půl hodiny vyspímefi done

Skript někam uložíme, nastavíme mu x-bit a necháme ho pod jiným uživatelem než rootem spouštět z /etc/rc.local.