Posiadam szybki internet LTE w PLAY, który niestety nie ma możliwości włączenia usługi publicznego ip (stały lub dynamiczny). U pozostałych mobilnych operatorów ta usługa jest płatna. Jeżeli więc nasza malina stoi za NAT-em i nie ma do niej bezpośrednio dostępu z internetu to jednym z możliwych rozwiązań dostępu zdalnego jest reverse ssh. Dzięki temu adres publicznego serwera z odpowiednim numerem portu staje się adresem naszej maliny. Można wchodzić bezpośrednio z internetu np. na stronę www maliny,pulpit zdalny vnc,czy zarządzać przez ssh.
Wymagania:
- konto ssh na serwerze posiadającym publiczne ip
Przygotowania po stronie serwera z publicznym ip
W przykładzie wykorzystano Ubuntu Server 14.04.1 LTS. Należy dokonać drobnej modyfikacji konfiguracji usługi sshd :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sudo nano /etc/ssh/sshd_config dodać: GatewayPorts yes zmienić na: RSAAuthentication yes PubkeyAuthentication yes sudo service ssh restart |
Dodatkowo jeśli chcemy mieć bezpośredni dostęp z internetu do maliny poprzez tunel na serwerze warto ustawić odpowiednie przekierowanie portów na routerze przed naszym serwerem z publicznym ip. W tym przykładzie serwer wewnętrzny z Ubuntu ma ip : 192.168.1.10. Porty zewnętrzne przekierowujące do odpowiednich usług to odpowiednio :
- 1234 port ssh
- 1235 port http
- 1236 port vnc
Na routerze w tym przykładzie 192.168.1.1 ustawiamy więc przekierowanie portów (w routerach Linksys Setup -> Forwarding):
- 1234 => 192.168.1.10
- 1235 => 192.168.1.10
- 1236 => 192.168.1.10
Oczywiście musimy także zezwolić firewallowi na serwerze 192.168.1.10 na ruch przychodzący na porty 1234,1235,1236 ze wszystkich albo tylko z konkretnych ip.
Przygotowania po stronie maliny
Należy dokonać drobnej modyfikacji konfiguracji usługi sshd:
1 2 3 4 5 |
sudo nano /etc/ssh/sshd_config dodać: GatewayPorts yes |
Ręczne zestawianie tunelu
1 |
ssh -f -NT -R 1234:localhost:22 -R 1235:localhost:80 -R 1236:localhost:5901 uzytkownik@serwer -p 2221 |
gdzie:
- -f oznacza uruchomienie połączenia w tle
- -N tworzy tylko tunel bez uruchamiania żadnych poleceń zdalnych
- -R 1234,1235,1236 to porty, na które chcemy przekierować żądania do konkretnych usług: ssh,http,vnc
- uzytkownik@serwer to nasz login i nazwa naszego serwera z publicznym ip np. usr_zibi@205.204.199.198 (numer ip serwera przykładowego)
- -p 2221 port serwera ssh , podajemy jeśli na naszym serwerze usługa ssh ma inny port niż 22
Jeśli ustawiliśmy przekierowanie na routerze i skonfigurowaliśmy odpowiednio firewall to możemy teraz bezpośrednio z internetu np. z naszego smartphone wpisać adres : http://205.204.199.198:1235 . Zobaczymy wtedy stronę www z naszej maliny. Aby połączyć się bezpośrednio z internetu z usługą ssh maliny łączymy się z serwerem 205.204.199.198 z portem 1234 np. ssh pi@205.204.199.198 – p 1234 . Aby połączyć się bezpośrednio z internetu z pulpitem zdalnym maliny przez vnc wpisujemy w kliencie vnc np. tightvnc Remote Host: 205.204.199.198:1236.
Automatyczne zestawianie i podtrzymywanie tunelu
Aby możliwe było automatyczne zestawianie tunelu potrzebna jest możliwość logowania się bez wpisywania hasła na naszym serwerze zdalnym z publicznym ip.
Na naszej malinie wydajemy polecenia:
1 2 3 4 5 |
cd ~/.ssh ssh-keygen -t rsa na wszystkie pytanie odpowiadamy [ENTER] |
Kopiujemy wygenerowany id_rsa.pub do authorized_keys do naszego serwera z publicznym ip np.
1 |
ssh-copy-id -i ~/.ssh/id_rsa.pub "usr_zibi@205.204.199.198 -p 2221" |
Tworzymy skrypt:
1 |
nano -c /sbin/reverse_tunnel.sh |
o zawartości:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash createTunnel() { /usr/bin/ssh -f -NT -R 1234:localhost:22 -R 1235:localhost:80 -R 1236:localhost:5901 usr_zibi@205.204.199.198 -p 2221 if [[ $? -eq 0 ]]; then echo Reverse tunnel Rpi <=> Ubuntu created successfully else echo An error occurred creating a reverse tunnel fi } /bin/pidof ssh if [[ $? -ne 0 ]]; then echo Creating new reverse tunnel connection createTunnel fi |
Nadajemy mu atrybut wykonywalności : sudo chmod +x /sbin/reverse_tunnel.sh i dodajemy go do crontaba maliny:
1 2 3 |
sudo crontab -e */1 * * * * /sbin/reverse_tunnel.sh > /dev/null |
Aby sprawdzić czy połączenie ssh (tunel) jest aktywny należy wykonać polecenie :
1 |
netstat -ntp|grep ssh|grep 205.204.199.198 |