firewallIbland så behöver man ha möjlighet att komma åt sin server som sitter bakom någon typ av brandvägg. Har man åtkomsten till konfigureringen av brandväggen så är det egentligen inte ett problem men ibland så har man inte kontroll över filtreringen. T.ex om man har en dator uppkopplad via 3G så blockerar leverantören åtkomsten då maskinen sitter bakom leverantörens brandvägg och ibland även på ett NAT-nät. Normalt har man öppen åtkomst ut från maskinen och detta öppnar för en annan typ av lösning som är en punkt-till-punkt anslutning via ssh så trafiken är krypterad. Ett exempel är en maskin som sitter i någon sommarstuga och har åtkomst till nätet via en 3G-dongle som man vill ha möjlighet att komma åt.

Vad man gör är att öppna en ssh mellan server och en maskin som du har nätåtkomst till, därefter startas en tunnel inne i sshkopplet i andra riktningen så att man kan via den få åtkomst till servern bakom brandväggen.

Ett exempel, jag vill ha möjlighet att komma åt ssh (port 22) på server1 från klient1, där server1 är maskinen bakom brandvägg och klient1 är den du har åtkomst till.

  1. en ssh anslutning skapas från server1 till klient1
  2. via shh anslutningen skapas en tunnel mellan port 2222 på klient1 till port 22 på server1
  3. på klient1 startas en ssh mot localhost port 2222
  4. tunneln skickar anropet som den får på port 2222 till port 22 på server1
  5. server1 hantera anropet på port 22 som en inlogging på server1
  6. om du angav rätt användare och lösenord så är du nu inloggad via en ssh på klient1 på server1

För att lösa detta finns två problem

  1. Hur loggar jag in från servern till klienten utan ha ha blankt lösenord?
  2. Hur håller jag tunneln öppen om förbindelsen går ner då jag inte kan logga in på servern och starta om tunneln.

Då vi kommer att arbeta med två datorer i denna artikel så kommer jag att använda namnet server för den dator som finns bakom brandväggen och namnet klient på den dator som du har tillgång till.

Att logga in utan lösenord har varit löst ganska länge på Unix/Linux system. Genom att använda en privat och en publik ssh-nyckel kan man logga in utan lösenord. Den privata ska den som ska initiera inloggningen (den som startar ssh anslutningen) ha och den publika behöver mottagaren för att verifiera att du är du. Den privata nyckel kan förses med ett lösenord för att skapa en extra nivå av säkerhet. I detta fall så kommer vi att köra utan lösenord på nycken annars är vi tillbaka till ruta ett, hur kan vi logga in utan att mata in lösenordet men nu behöver vi inte lämna mottagarsidan öppen. Man generera en unik nyckel med kommandot ssh-keygen, observera att man genererar en ny nyckel varje gång man kör kommandot så om du kör det igen får du upprepa proceduren att flytta över den publika nyckeln till klienten. Dessa kryptonycklar sparas i hemmakatalogen i en gömd katalog som heter .ssh, vi börjar med att generera nycklarna, viktigt är att man kör det som användaren som ska initiera ssh uppkopplingen då den måste ha tillgång till nycklarna.

Följande kommandon ska utföras på server om det inte står något annat.

Det först vi behöver göra är att generera nycklarna som ska användas,  viktigt är att ange blank “passphrase” annars kommer den inte att fungera, kör ssh-keygen

Nu finns 2 filer i .ssh katalogen

  • id_rsa – din privata nyckel, den lämnar man aldrig ut
  • id_rsa_pub – din publika nyckel, används på mottagande sida för att identifiera dig

Nu ska vi kopiera den publika nyckeln till klientmaskinen, man hade kunna fyttat över den manuellt och lagt till den men som tur är finns ett kommando som gär allt-i-ett, ssh-copy-id, pi@klient.nimmis.se är användarnamn och adress till datorn klient precis som när man loggar in normalt med ssh

Pröva att logga in på klienten igen

denna gång ska du inte få någon fråga om lösenord utan du ska komma in direkt

Nu har vi löst problem 1, dax för problem 2, som tur var finns det redan en lösning för att hantera uppkopplingar som kan gå  ner som heter autossh (http://www.harding.motd.ca/autossh/). Programmet övervakar uppkopplingen och om länken gått ner, startar om uppkopplingen helt automatiskt. Så då installerar vi det

Kommandosyntaxen för tunneln är något som nedan

autossh -M 20000 -o “PubkeyAuthentication=yes” -o “PasswordAuthentication=no” -i /home/pi/.ssh/id_rsa -R 2222:localhost:22 pi@klient.nimmis.se

  • -M 20000 är en monitor port, valfri men välj ett som inte används och över 1000 om du in kör det som root
  • -o “PubkeyAuthentication=yes” använd ssh nyckeln för inloggning
  • -o “PasswordAuthentication=no” använd aldrig lösenord, förhindrar att något hänger sig och väntar på input
  • -i /home/pi/.ssh/id_rsa anger vart ssh-nyckeln finns, använd alltid fullständig sökväg om du skulle starta den som root
  • -R 2222:localhost:22 anger klient port 2222 och server port
  • pi@klient.nimmis.se inloggninguppgifterna för användarn som vi satte upp publika nyckeln för

Då kan vi testa om det verkar fungera

Här kan man se att klientmaskinen lyssnar på port 2222, så alla som kan komma åt port 2222 på den maskinen kan använda tunneln, man behöver inte var lokalt inloggad på den för att det ska fungera.

Logga in på klientmaskinen och kör följande kommando, använd en användare på server och motsvarande lösenord, i exemplet loggar jag in på användare pi på server.

Som du ser kom vi inte på server via tunnelen klient:2222<->server:22, logga ut från klienten och skriv exit i fönstret på server så att du kommer tillbaka till kommandopromten.

Nu är det dax att sätta upp autossh så att den startar upp automatiskt. Öppna filen /etc/init.d/autossh

och klistra in följande

Ändra på SSH_ variablarna så att de stämmer överens med dina inställningar och spara filen

Gör sendan filen exekverbar

Sätt upp autossh så att den startar upp automatiskt

Boota om för att kontrollera att allt verkar fungera