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.
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:
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 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
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
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