Raspberry reverse ssh
Š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