To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
Unixy.pl
Internetowe forum na temat systemów GNU/Linux Unix

linki-portal - Tunel zwrotny SSH

Maciek_Rutecki - 2006-07-27, 10:53
Temat postu: 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_Rutecki - 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_Rutecki - 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



Powered by phpBB modified by Przemo © 2003 phpBB Group