туннель SSH к удалённым хостам

Настройка, программирование, распределённые вычисления

Модераторы: Olej, bellic, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 31 янв 2022, 20:30

Olej писал(а):
31 янв 2022, 20:16
Дальше всё делаю в терминале этого целевого компьютера...
Целевой хост (HP-Compaq):

Код: Выделить всё

an@HP-Compaq:~$ hostname
HP-Compaq

an@HP-Compaq:~$ uname -a
Linux HP-Compaq 5.4.0-96-generic #109-Ubuntu SMP Wed Jan 12 16:49:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

an@HP-Compaq:~$ ps -A | grep ssh
    747 ?        00:00:00 sshd
   1074 ?        00:00:00 ssh-agent
Проверяю сетевую доступность транзитного хоста:

Код: Выделить всё

an@HP-Compaq:~$ ssh olej@185.200.243.3
The authenticity of host '185.200.243.3 (185.200.243.3)' can't be established.
ECDSA key fingerprint is SHA256:Zy7Qjz2Pd0ylCA6jUOGLpiY9ORdHUD9YZsuJ55epLok.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '185.200.243.3' (ECDSA) to the list of known hosts.
olej@185.200.243.3's password: 
Linux 277938.local 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Jan 31 17:37:06 2022 from 193.28.177.117

olej@277938:~$ hostname
277938.local
Создаю (на транзитном хосте) туннель к целевому компьютеру:

Код: Выделить всё

an@HP-Compaq:~$ ssh -fN -R 185.200.243.3:2222:localhost:22 olej@185.200.243.3
olej@185.200.243.3's password: 
an@HP-Compaq:~$ 
Похоже что состоялось...
С управляющего хоста (R420) устанавливаю SSH коннект с целевым хостом (HP-Compaq) используя транзитный хост (с белым IP 185.200.243.3 - linux-ru.ru - имя хоста 277938.local) ... и тут облом:

Код: Выделить всё

olej@R420:~$ ssh -p 2222 olej@185.200.243.3
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:GAldbNLTt0x2c1YDiYxSwuacPiJ7hSu6TdfKnSlVDnc.
Please contact your system administrator.
Add correct host key in /home/olej/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/olej/.ssh/known_hosts:24
  remove with:
  ssh-keygen -f "/home/olej/.ssh/known_hosts" -R "[185.200.243.3]:2222"
ECDSA host key for [185.200.243.3]:2222 has changed and you have requested strict checking.
Host key verification failed.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 31 янв 2022, 20:44

Olej писал(а):
31 янв 2022, 20:30
... и тут облом
Это решается - идентификация хоста поменялась!

Код: Выделить всё

olej@R420:~$ ssh-keygen -f "/home/olej/.ssh/known_hosts" -R "[185.200.243.3]:2222"
# Host [185.200.243.3]:2222 found: line 24
/home/olej/.ssh/known_hosts updated.
Original contents retained as /home/olej/.ssh/known_hosts.old
Новое подключение через туннель:

Код: Выделить всё

olej@R420:~$ ssh -p 2222 olej@185.200.243.3
The authenticity of host '[185.200.243.3]:2222 ([185.200.243.3]:2222)' can't be established.
ECDSA key fingerprint is SHA256:GAldbNLTt0x2c1YDiYxSwuacPiJ7hSu6TdfKnSlVDnc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[185.200.243.3]:2222' (ECDSA) to the list of known hosts.
olej@185.200.243.3's password: 
Permission denied, please try again.
olej@185.200.243.3's password: 
Здесь понадобился пароль именно целевого хоста (за туннелем), не транзитного сервера! (здесь легко запутаться, потому что в алгоритме фигурируют 3 хоста со своими разными паролями :-o )
И теперь смотрим где мы находимся:

Код: Выделить всё

olej@HP-Compaq:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Linuxmint
Description:	Linux Mint 20.3
Release:	20.3
Codename:	una

Код: Выделить всё

olej@HP-Compaq:~$ hostname 
HP-Compaq
Всё! С хоста LAN c локальным IP установлена сессия SSH с удалённым хостом cо своим локальным IP, через транзитный SSH сервер с "белым" IP.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 01 фев 2022, 01:13

Olej писал(а):
31 янв 2022, 20:30
Похоже что состоялось...
Теперь вопрос в том, чтобы:
1. затолкать установку SSH-туннеля в скрипт (см. SSH в скриптах: sshpass)
2. выполнять этот скрипт при загрузке системы (или после логина конкретного пользователя?)

п.1 (предварительно) решается так:

Код: Выделить всё

olej@HP-Compaq:~$ cat ssh.to.linux-ru
sshpass -p <passwd> ssh -fN -R 185.200.243.3:2222:localhost:22 <user>@185.200.243.3
где:
- 185.200.243.3 - IP транзитного сервера с "белым" IP
- <user> - пользователь на этом транзитном сервере, зарегистрированное в /etc/passwd и которому разрешено SSH подключение
- <passwd> - пароль этого пользователя на этом транзитном сервере
Olej писал(а):
31 янв 2022, 18:43
Но прежде чем её переносить на реальные хосты, нужно ликвидировать установленный туннель на транзитном сервере.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 01 фев 2022, 01:47

Olej писал(а):
01 фев 2022, 01:13
Но прежде чем её переносить на реальные хосты, нужно ликвидировать установленный туннель на транзитном сервере.
По порядку...
1. На транзитном хосте останавливаю туннель:

Код: Выделить всё

olej@277938:~$ hostname
277938.local

olej@277938:~$ ip a s dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether de:73:e9:53:45:1a brd ff:ff:ff:ff:ff:ff
    inet 185.200.243.3/24 brd 185.200.243.255 scope global dynamic eth0
       valid_lft 79073sec preferred_lft 79073sec
    inet6 fe80::dc73:e9ff:fe53:451a/64 scope link
       valid_lft forever preferred_lft forever

olej@277938:~$ sudo netstat -pnlt | grep :2222
tcp        0      0 185.200.243.3:2222      0.0.0.0:*               LISTEN      20084/sshd: olej

olej@277938:~$ kill -9 20084

olej@277938:~$ sudo netstat -pnlt | grep :2222
olej@277938:~$
Всё, его нет...

2. На подключенных через туннель SSH сессиях при этом наблюдаем:

Код: Выделить всё

olej@R420:~$ hostname
R420

olej@HP-Compaq:~$ Connection to 185.200.243.3 closed by remote host.
Connection to 185.200.243.3 closed.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 01 фев 2022, 01:48

Olej писал(а):
01 фев 2022, 01:47
По порядку...
3. На целевом удалённом хосте (пока добираюсь на него через TeamViewer! :-( ) запускаю по-новой удалённо SSH-туннель:

Код: Выделить всё

an@HP-Compaq:/home/olej$ hostname
HP-Compaq

an@HP-Compaq:/home/olej$ ip a s dev eno1
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether e8:39:35:4f:85:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute eno1
       valid_lft 62839sec preferred_lft 62839sec
    inet6 fe80::6934:a326:6419:179/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

Код: Выделить всё

an@HP-Compaq:/home/olej$ pwd
/home/olej

an@HP-Compaq:/home/olej$ ./ssh.to.linux-ru 

an@HP-Compaq:/home/olej$ echo $?
0
Код завершения 0 - ОК!

4. Проверяю наличие туннеля на транзитном хосте - что там происходит?:

Код: Выделить всё

olej@277938:~$ hostname
277938.local

olej@277938:~$ sudo netstat -pnlt | grep :2222
tcp        0      0 185.200.243.3:2222      0.0.0.0:*               LISTEN      32384/sshd: olej
5. Подключение с любого локального (в мире!) хоста:

Код: Выделить всё

olej@R420:~$ hostname
R420

olej@R420:~$ ip a s dev eno1
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:b1:1c:54:3a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.14/24 brd 192.168.1.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever

Код: Выделить всё

olej@R420:~$ ssh -p 2222 olej@185.200.243.3
olej@185.200.243.3's password:
Last login: Mon Jan 31 23:19:00 2022 from 127.0.0.1

olej@HP-Compaq:~$ hostname
HP-Compaq

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 01 фев 2022, 02:22

Olej писал(а):
01 фев 2022, 01:48
Подключение с любого локального (в мире!) хоста:
Остаётся решить вопрос: как организовать выполнение скрипта ssh.to.linux-ru (показанное выше) при (после) загрузке системы, или при логоне пользователя?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 01 фев 2022, 13:52

Olej писал(а):
01 фев 2022, 01:48
5. Подключение с любого локального (в мире!) хоста:
Вопрос: как канализировать через этот SSH туннель графический X-протокол, чтобы иметь возможность удалённо запускать (выполнять через транзитный "белый" сервер) GUI приложения?

Ответ:
1. На транзитном сервере убиваю ранее установленный SSH туннель:

Код: Выделить всё

olej@277938:~$ sudo netstat -pnlt | grep :2222
tcp        0      0 185.200.243.3:2222      0.0.0.0:*               LISTEN      32384/sshd: olej

olej@277938:~$ kill -9 32384

olej@277938:~$ sudo netstat -pnlt | grep :2222
olej@277938:~$
2. На целевом хосте редактирую скрипт создания SSH туннеля:

Код: Выделить всё

an@HP-Compaq:/home/olej$ cat ssh.to.linux-ru.
sshpass -p <passed> ssh -Y -fN -R 185.200.243.3:2222:localhost:22 <user>@185.200.243.3
- где <passed> - это пароль на транзитном сервере для SSH-пользователя <user>, где именно и создаётся (удалённо) SSH туннель.
И запускаю создание SSH туннеля:

Код: Выделить всё

an@HP-Compaq:/home/olej$ ./ssh.to.linux-ru.

an@HP-Compaq:/home/olej$ echo $?
0
Всё ОК.

3. С любого хоста в природе подключаюсь сквозь SSH туннель с туннелированием X-протокола, графики:

Код: Выделить всё

olej@R420:~$ ssh -Y -p 2222 olej@185.200.243.3
olej@185.200.243.3's password:
Last login: Tue Feb  1 12:22:29 2022 from 127.0.0.1

- где password, на этот раз - пароль на целевом хосте для пользователя ... ну а -p 2222 - порт созданного туннеля.

4. Проверяем выполнением любого GUI-приложения:

Код: Выделить всё

olej@HP-Compaq:~$ gnome-clocks
Снимок экрана от 2022-02-01 12-31-27.png
Снимок экрана от 2022-02-01 12-31-27.png (28.53 КБ) 874 просмотра
P.S. Обращаем внимание, что эта картинка (и обратные реакции мышка-клавиатура) "летает" через удалённый 1000 км. транзитный сервер 185.200.243.3 (это и есть форум https://linux-ru.ru :lol: ).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 28 фев 2022, 17:37

Через некоторое продолжительное время, и в связи с война ..., делаю:

Код: Выделить всё

olej@R420:~$ ssh -p 2222 olej@185.200.243.3
ssh: connect to host 185.200.243.3 port 2222: Connection refused
И когда зайду на транзитный хост (туннель):

Код: Выделить всё

olej@277938:~$ sudo netstat -pnlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      24801/zabbix_agentd 
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      13333/mysqld        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      560/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      24881/exim4         
tcp6       0      0 :::9292                 :::*                    LISTEN      509/nodejs          
tcp6       0      0 :::80                   :::*                    LISTEN      17323/apache2       
tcp6       0      0 :::22                   :::*                    LISTEN      560/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      24881/exim4         

Код: Выделить всё

olej@277938:~$ sudo netstat -pnlt | grep :2222
Туннель не работает...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 28 фев 2022, 17:39

Olej писал(а):
28 фев 2022, 17:37
Туннель не работает...
Тут причин может быть несколько:
1. я просто после экспериментов с туннелем его остановил (но это мало похоже на правду)
2. истёк срок тайм-алив SSH соединения, которое обеспечивает туннель
3. ... да я и сам - в деталях - забыл как оно должно работать

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: туннель SSH к удалённым хостам

Непрочитанное сообщение Olej » 28 фев 2022, 17:59

Olej писал(а):
28 фев 2022, 17:39
3. ... да я и сам - в деталях - забыл как оно должно работать
Как я помню, логика там такая:
1. на целевом хосте, на который (и только на него!) устанавливается реверсный туннель SSH, выполняю:

Код: Выделить всё

$ ssh -fN -R 185.200.243.3:2222:localhost:22 olej@185.200.243.3
olej@185.200.243.3's password: xxxxxx
Здесь:
- 185.200.243.3 - белый IP транзитного хоста, через который устанавливается туннель с любого клиента;
- 2222 - TCP порт по которому будут подключаться позже клиенты;
- olej - имя от которого устанавливается туннель (должен быть зарегистрирован и резрешено SSH на транзитном хосте);
- password - пароль этого пользователя на транзитном хосте;

2. И проверить что на файерволе транзитного хоста - нужный TCP порт всё ещё открыт:

Код: Выделить всё

olej@277938:~$ sudo -i

root@277938:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] WWW Full                   ALLOW IN    Anywhere                  
[ 3] SMTP                       ALLOW OUT   Anywhere                   (out)
[ 4] 6666                       ALLOW IN    Anywhere                  
[ 5] 6665                       ALLOW IN    Anywhere                  
[ 6] 8080                       ALLOW IN    Anywhere                  
[ 7] 10050                      ALLOW IN    Anywhere                  
[ 8] 10050/tcp                  ALLOW IN    Anywhere                  
[ 9] 2222                       ALLOW IN    Anywhere                  

Ответить

Вернуться в «Сети»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 15 гостей