Strona Główna Unixy.pl
Internetowe forum na temat systemów GNU/Linux Unix

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy  StatystykiStatystyki
RejestracjaRejestracja  ZalogujZaloguj  DownloadDownload
 Ogłoszenie 
Strona korzysta z plików cookies w celu realizacji usług (logowanie do konta itp.). Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.

Poprzedni temat «» Następny temat
Zamknięty przez: Maciek_Rutecki
2006-07-27, 15:54
Tunel zwrotny SSH
Autor Wiadomość
Maciek_Rutecki 
Administrator

JID: [email protected]
Pomógł: 39 razy
Dołączył: 07 Cze 2005
Posty: 2959
Wysłany: 2006-07-27, 10:53   Tunel zwrotny SSH

Działa pod knoppixem i Debianem, powinno też działac tam, gdzie używane jest OpenSSH.

Komputer A: Jest za natem, nie można przekierować żadnego portu na routerze, firewall akceptuje połaczenia wychodzące z komputera i wcześniej nawiązane.

konto: user_a

Komputer B: Bez tych ograniczeń, ma także uruchomiony serwer SSH, otwarty port 22 do połączeń przychodzących. Oprócz trego otwarty jest port np 6666 (przykładowy, nie zajęty przez inny program). Jest dostepne konto shellowe na zewnątrz.

konto user_b

Problem: Chcemy się zalogować z komputera B do komputera A.

Rozwiązanie: Tunel zwrotny SSH

Wydajemy polecenia:

Komputer A:

Kod:
ssh user_b@server -R 6666:localhost:22


user_b: nazwa konta na komputerze B

serwer: ip komputera B

Komputer B:

Kod:
ssh user_a@localhost -p 6666


Usprawnienia:

Na komputerze A można zamiast poprzedniego wydać takie polecenie:
Kod:
ssh user_b@server -R 6666:localhost:22 "/bin/sh -c 'while true; do sleep 15;
echo +; done'"


Aby po zerwaniu połaczenia można je przywrócić.

Aby nie pytał się o hasło w powyższym poleceniu to:
na komputerze A:

Kod:
ssh-keygen -t rsa


Przy pytaniu o hasło należy wcisnąć ENTER - utworzony zostanie klucz bezhasłowy.

Otrzymamy dwa klucze:
- prywatny (nikomu nie udostępniać): /home/użytkownik/.ssh/id_rsa
- publiczny (jego możemy pokazać): /home/użytkownik/.ssh/id_rsa.pub

Na komputerze A:

Kod:
scp /home/użytkownik/.ssh/id_rsa.pub użytkownik@zdalny_serwer:~/
ssh użytkownik@zdalny_serwer


Na komputerze B (choćby przez SSH):


Kod:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
_________________
Maciek
http://www.maciek.unixy.pl
 
     
Maciek_Rutecki 
Administrator

JID: [email protected]
Pomógł: 39 razy
Dołączył: 07 Cze 2005
Posty: 2959
Wysłany: 2009-11-20, 08:49   

Maciek_Rutecki napisał/a:
Na komputerze A można zamiast poprzedniego wydać takie polecenie: Kod:
ssh user_b@server -R 6666:localhost:22 "/bin/sh -c 'while true; do sleep 15;
echo +; done'"



Aby po zerwaniu połaczenia można je przywrócić.


Życie zmusiło mnie do modyfikacji skryptu i bardziej elegancka wersja ma postać:

Kod:
#!/bin/bash
# login na serwerze B
LOGIN=user_b
# adres IP serwera B
IP_SERVER=server
# port TCP na serwerze B
PORT_SERVER=22
# adres IP, na którym serwer B będzie nasłuchiwać na połączenia,
# jesli ma to być coś innego niż "localhost" (127.0.0.1),
# to w /etc/ssh/sshd_config musi się pojawić opcja:
# "GatewayPorts yes"
SOURCE_IP=127.0.0.1
# port TCP na którym ma nasłuchiwać serwer B
SOURCE_PORT=6666
# docelowy IP, na który chcemy się połączyć na maszynie A
# zwykle jest to "localhost",
# można zmienić to na inny, mierzony z punktu widzenia maszyny A
DESTINATION_IP=127.0.0.1
# port TCP na docelowym IP
DESTINATION_PORT=22
# opóźnienie w sekundach, po przekroczeniu czasu połączenia
# zwykle timeout w połączeniu ssh występuje po 3-4 minutach
# wtedy rzeczywiste opóźnienie wyniesie DELAY+(ok. 180 sekund)
DELAY=1200

i=0

while true; do
        let i=i+1
        echo "("`date`") Trying create the tunnel (try "$i")..."
        ssh -C -p $PORT_SERVER $LOGIN@$IP_SERVER -R $SOURCE_IP:$SOURCE_PORT:$DESTINATION_IP:$DESTINATION_PORT
        echo "("`date`") Disconnect (try "$i"), sleep for "$DELAY" seconds."
        sleep $DELAY
done


Jeśli na komputerze A działa system z rodziny Windows, to można się zainteresować programem:
http://www.bitvise.com/tunnelier

lub nieśmiertelnym putty (nie obsługuje automatycznego ponownego łączenia w przypadku rozłączenia).
_________________
Maciek
http://www.maciek.unixy.pl
Ostatnio zmieniony przez Maciek_Rutecki 2009-11-20, 08:53, w całości zmieniany 2 razy  
 
     
Maciek_Rutecki 
Administrator

JID: [email protected]
Pomógł: 39 razy
Dołączył: 07 Cze 2005
Posty: 2959
Wysłany: 2009-11-23, 13:37   

Uprościć sobie można pracę za pomocą autossh i wspomnianej wcześniej wymiany kluczy:

Kod:
#!/bin/bash
# login na serwerze B
LOGIN=user_b
# adres IP serwera B
IP_SERVER=server
# port TCP na serwerze B
PORT_SERVER=22
# sciezka do klucza prywatnego:
IDENTIFY_FILE=/home/maciek/.ssh/id_rsa
# adres IP, na którym serwer B będzie nasłuchiwać na połączenia,
# jesli ma to być coś innego niż "localhost" (127.0.0.1),
# to w /etc/ssh/sshd_config musi się pojawić opcja:
# "GatewayPorts yes"
SOURCE_IP=127.0.0.1
# port TCP na którym ma nasłuchiwać serwer B
SOURCE_PORT=6666
# docelowy IP, na który chcemy się połączyć na maszynie A
# zwykle jest to "localhost",
# można zmienić to na inny, mierzony z punktu widzenia maszyny A
DESTINATION_IP=127.0.0.1
# port TCP na docelowym IP
DESTINATION_PORT=22

/usr/bin/autossh -fN -p $PORT_SERVER -i $IDENTIFY_FILE -R $SOURCE_IP:$SOURCE_PORT:$DESTINATION_IP:$DESTINATION_PORT $LOGIN@$IP_SERVER
exit 0
_________________
Maciek
http://www.maciek.unixy.pl
 
     
Wyświetl posty z ostatnich:   
Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group