Raspberry reverse ssh

Iš Žinynas.
Jump to navigation Jump to search

Šis būdas padės prisijungti prie RaspberryPI nors šis bus už firewall/nat. RaspberryPI inicijuos prisijungimą (reverse connection) į nutolusį serverį ir ten atidarys ssh pasiklausymo prievadą į kurį galima bus prisijungti iš pačio serverio. Daugiau jokių portų fowardinimų ir kitokio laiko gaišimo!

RaspberryPI pusės konfigūravimas[keisti]

apt install autossh

Naudosime prievadą 20000, įdedame šį failą į /usr/local/bin/reverse_ssh, prieš tai surašome mums būtinas reikšmes:

#!/bin/bash
RPI_PORT=20000
REMOTE_PORT=220
REMOTE_ADDRESS=vardas@xxxx.eofnet.lt
IDENTITY="~/.ssh/id_rsa"
WAIT_SECONDS=60

autossh -i $IDENTITY -o ServerAliveInterval=60 \
    -o ServerAliveCountMax=2 \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    -o ConnectTimeout=15 \
    -N -R $RPI_PORT:localhost:22 $REMOTE_ADDRESS -p $REMOTE_PORT

Įgaliname failą pasileisti:

chmod +x /usr/local/bin/reverse_ssh

Kaip jau pastebėjote naudosime ssh public key autentifikaciją (taip neiškils papildomų saugumo klausimų)

Systemd servisas (/etc/systemd/system/reverse_ssh.service):

[Unit]
Description=Reverse SSH service
After=network.target
[Service]
WorkingDirectory=/etc
ExecStart=/usr/local/bin/reverse_ssh
Restart=always
RestartSec=3
User=root
Group=root
[Install]
WantedBy=multi-user.target

Nurodome, kad startuotų automatiškai sistemos krovimosi metu ir įjungiame:

systemctl enable reverse_ssh&&systemctl start reverse_ssh

 Nutolęs serveris[keisti]

Nutolusio serverio ssh servisas turi būti pasiekiamas iš išorės (jeigu reikia praforwardiname į jį prievadus). Nutolusiame serveryje sukuriame home direktorijoje faila $HOME/raspberries, į jį įrašysime portus ir raspberių pavadinimus, kad galėtume juos lengviau pasiekti su prisijungimo įrankiu:

20000 RetroPie
20001 CAM1-2
20002 RelaySwitch
apt install dialog

Pats prisijungimo įrankis:

#!/bin/bash
# prereq: apt install dialog

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
BACKTITLE="Raspberry Reverse IP Connections"
TITLE="Select connection"
MENU="Choose one of the following options:"

if [ -f "$HOME/raspberries" ]; then
settings="$HOME/raspberries"
elif [ -f "/etc/mods/raspberries" ]; then
settings="/etc/mods/raspberries"
else
echo "We cannot file configuration file in either /etc/mods/raspberries nor in $HOME/raspberries"
echo "You should create this file and specify your raspberries in the following order"
echo "<port> <name>"
echo "Example.: "
echo "2222 RetroPie"
exit 1
fi

while read i; do
    OPTIONS+=($i)
done < $settings

CHOICE=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

LINE=`cat $settings|grep $CHOICE`
if [ "$LINE" == "" ]; then
echo "We got empty choice, exiting..."
exit 1
fi
name="$(cut -d' ' -f2 <<<"$LINE")"
port="$(cut -d' ' -f1 <<<"$LINE")"
clear
echo "Connecting to $name using port $port..."
ssh root@localhost -p $port
chmod +x raspberry_connect
./raspberry_connect

Screens[keisti]

Screenshot 2019-04-18 at 16.05.10.png