Mål: At kunne installere et Kali Linux operativsystem på min Raspberry Pi 5, og derudover også bruge en tunnel, til at kunne tilgå den alle steder fra, og også sørge for at sende den tunnel address til mig selv.

Meningen med dette produkt er at kunne have en lille maskine som man eventuelt kan gemme et sted, hvor der er et lan udtag, så man kan have adgang til en andens netværk. Derfor er det essentielt at det bare skulle være at tilslutte strøm og Ethernet, og så bag efter smutte derfra uden at skulle få forward adressen gennem en skærm, men igennem noget som sender det til mig.

Jeg har derfor valgt at installere Kali Linux på min Raspberry Pi 5, som var overraskende nemt at få gjort. Jeg hentede bare en image fil fra Kali’s hjemmeside, som passede med Raspberry Pi 5.

Så bruge jeg Raspberry Pi Imager, til at installere Kali image filen ned på mit SD kort som så skal ind I Raspberry PI’en. Alt dette var sådan set rimelig nemt at finde ud af, og tog ikke så lang tid. Den svære del kom i at få sat en tunnel op, så jeg kan tilgå min raspberry pi udefra. Jeg valgte at gå med Ngrok til at sætte min tunnel op så jeg kan tilgå den med ssh udefra. Det var relativt nemt at sætte op, jeg registrerede mig på Ngrok, og fulgte deres instruktioner.

I stedet for den sidste stykke kode, så skulle jeg bruge ssh tunnel istedet med port 22, da det er den port SSH protokollen bruger.

ngrok tcp 22

Dette gjorde det muligt at kunne tilgå min raspberry pi med ssh.

Der var dog et andet problem som også skulle løses før mit mål kunne opnås, problemet er at den forward address som er addressen på min Ngrok tunnel bliver ændret for hver gang jeg kører Ngrok. Det vil sige at jeg på en eller anden måde enten skal gøre adressen statisk, eller på en eller anden måde sende forward adressen til mig selv.

Jeg valgte at sende den til mig selv, da jeg havde fundet ud af at man igennem appen Telegram kan lave en bot, hvor man kan sende beskeder igennem deres API. Det eneste jeg skulle gøre var at oprette en bot og få API Token, og ChatId.

API Token kan man få ved ved at starte BotFather, og derefter følger instrukser til at starte en ny bot. Så får man sit Token, og kan tilgå denne web adresse https://api.telegram.org/bot<MyToken>/getUpdates. Jeg viser forresten ikke mit Token eller ChatId her grundet sikkerhed, og da jeg ikke vil have andre skal kunne sende ting igennem min bot. ChatId kunne jeg få ved at skrive til min bot, og så tjekke min api response gennem api linket.

"result": [
    {
      "update_id": <my_update_id>,
      "message": {
        "message_id": 3,
        "from": {
          "id": <my_chat_id>,
          "is_bot": false,
          "first_name": "Rasmus",
          "last_name": "Olsen",
          "language_code": "en"
        },
        "chat": {
          "id": <my_chat_id>,
          "first_name": "Rasmus",
          "last_name": "Olsen",
          "type": "private"
        },
        "date": 1746355741,
        "text": "Hello"
      }
    }
]

Så havde jeg mit ChatId, og mit Token, så nu manglede jeg bare at den sender min forward adresse til min bot ved telegram. Derfor brugte jeg bash scripts til at udføre dette.

/usr/local/bin/ngrok tcp 22 > /dev/null &
sleep 10

# Få fat i ngrok forward adresse
NGROK_URL=$(curl -s http://127.0.0.1:4040/api/tunnels | grep -o 'tcp://[^"]*')

BOT_TOKEN="<my_api_token>"
CHAT_ID="<my_chat_token>"

# Send besked igennem telegram
/usr/bin/curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
  -d chat_id="$CHAT_ID" \
  -d text="Your Raspberry Pi is accessible via SSH at: $NGROK_URL"

Dette script er relativt simpelt, da det første den gør er egentlig bare at starte Ngrok tcp 22 kommandoen, som starter en tunnel hvor jeg kan tilgå gennem ssh, her laver den min forward adresse. Den næste linje får jeg den til at vente 10 sekunder, for at være sikker på at Ngrok er nået at starte op, og at forward adressen eksistere. Dernæst finder jeg forward adressen ved at sende en GET request til Ngrok’s lokale API som kører på min raspberry pi, og hvor jeg kan finde informationer omkring den aktive tunnel. Her bruger jeg værktøjet grep til at kun finde der hvor der står “tcp://” og så alt andet indtil det næste " tegn.

Derfra skulle jeg bare sætte min telegram api op til at sende min forward adresse til min aktive bot chat, der tilgår jeg samme web adresse som før til min api, men laver en post request til deres /sendMessage endpoint. Hvor jeg giver den min Chat id med, og derefter selve teksten som indeholder min forward adresse.

Til sidst mangler jeg så bare at få den til at køre dette script når min raspberry pi starter op, og valgte at lave en ny systemd service, som ville køre mit script.

Skulle bare lave en ny .service fil i mappen /etc/systemd/system.

sudo nano /etc/systemd/system/ngrok-ssh.service

Efter det skrev jeg ind hvad min service skulle udfører, altså hvilket script, hvilket environment den skal bruge, så den kender til ngrok og curl. Derudover også om min service altid skulle restart når først scriptet er kørt, og det har jeg sagt nej til da den kun skal køre en gang på startup. Herunder er mit script.

[Unit]
Description=Start ngrok for SSH on boot
After=network.target

[Service]
ExecStart=/bin/bash /home/kali/ngrok_init.sh
Restart=no
User=kali
StandardOutput=journal
StandardError=journal
Environment=PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

[Install]
WantedBy=multi-user.target

Til sidst skulle jeg bare kalde kommandoen sudo systemctl enable ngrok-ssh.service. Derefter virkede mit script og når min raspberry pi starter får jeg tilsendt min forward adresse.

Produkt:


Kilder: