Automatiske SSH Tuneller (autossh)

Eller med andre ord, en guide til at tilgå udstyr uden offentlige IPv4 adresser, det er en nyttig ting når man som mig har mange kunder med udstyr der skal passes men som ikke har behov for at kunne blive tilgået udefra normalt.

Det er jo en klassisk situation hvor en SSH Tunnel er rar at have, det er bare monster besværligt at skulle sætte den op og holde den kørende, den lukker jo ned hvis du kke bruger den – og hvis ikke lige du er i nærheden skal du guide kunden til at sætte den op. Det er noget rod, derfor har jeg strikket en løsning sammen som jeg syntes virker ok.

Situationen er den at jeg vil have fat i min kundes server, begge maskiner er på RFC1918 Adesser (dvs 10.x.x.x/8 og 192.168.x.x/24) og kan således ikke snakke direkte sammen, derfor introducerer jeg en jumpserver som jeg har tænkt mig at få til at “ligne” min kundes server udefra.

Mht. sikkerhed så skal den selvfølgelig firewalles fornuftigt, men det er så simpelt at jeg ikke gider gennemgå det her 🙂

Først starter vi med at generere en ssh nøgle på kundens server, for den skal kunne logge ind på “JumpServer” automatisk.

KundensServer# ssh-keygen -t rsa

Du kan roligt acceptere alle standardforslagene, dvs. trykke enter et par gange. Når du er færdig så kopier /root/.ssh/id_pub.rsa til JumpServer /root/.ssh/authorized_keys, test herefter:

KundensServer# ssh root@JumpServer

Såfremt det virker er vi klar til at fortsætte med næste skridt:

JumpServer# vim /etc/ssh/sshd_config

Og skift “Port 22” til “Port 2222” og tilføj “GatewayPorts Yes” i bunden af filen, gem den og genstart ssh:

JumpServer# /etc/init.d/ssh restart

Vend herefter tilbage til kundensserver og installer autossh:

KundensServer# apt-get install autossh

Dernæst har jeg strikket et lille fattigmandsscript sammen til dig, det antager at der ikke er andre processer der hedder “autossh”, og hvis der er det alligevel bliver de dræbt samtidig med at du evt. dræber den her tunnel.

#!/bin/bash

### BEGIN INIT INFO
# Provides:          tunnel 
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the tunnel
# Description:       starts the tunnel
### END INIT INFO

case "$1" in
  start)
    echo "Starting tunnels "
        autossh -M 0 -q -f -N -p 2222 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R *:22:localhost:22 root@JUMPSERVER
        autossh -M 0 -q -f -N -p 2222 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R *:80:localhost:80 root@JUMPSERVER
    ;;
  stop)
    echo "Stopping tunnels "
    killall autossh
    ;;
  restart)
    echo "Restarting firewall"
    /etc/init.d/firewall stop
    sleep 1
    /etc/init.d/firewall start
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|status}" >&2
    exit 1
    ;;
esac

exit 0

Parametrene til autossh kort forklaret:

* -M 0, vælger hvilken metode autossh skal benytte for at holde øje med om forbindelsen er i live, her har vi valgt metode 0 fordi vi bruger SSH’s egen indbyggede.
* -q for quiet, -f for at forke til en baggrundsprocess -N for ikke at udføre en kommando på destinationsmaskinen (som er standard opførsel)
* -p 2222 fortæller at vi skal forbinde _til_ port 2222 på destinationsmaskinen, fordi vi jo ændrede ssh’s port.
ServerAliveInterval og ServerAliveCountMax er ssh’s indbyggede løsning på ustabile forbindelser, hvis forbindelsen mistes afbryder ssh og autossh genstarter så forbindelsen.
* -R *:22 betyder at den skal binde sig til port 22 på JumpHost og localhost:22 betyder at den anden ende af tunellen skal ende på localhost port 22

Når det script kører kan du forbinde til din kundes server ved at skrive:

klient1# ssh bruger@jumpserver

og du kan taste http://jumpserver i din browser, og få maskinens hjemmeside at se. Tilføj selv flere porte efter behov 🙂

Når du er tilfreds automatiseres processen ved at skrive:

KundensServer# update-rc.d tunnel defaults

Nu vil tunnelen starte af sig selv hvergang maskinen booter, jeg kan kun anbefale løsningen. Jeg bruger det selv og det er pænt stabilt 🙂

Dette indlæg blev udgivet i Knowledge Base, Linux, Networking, Old Base. Bogmærk permalinket.

Skriv et svar