Например дома есть сервер и хочется к нему подключаться по ssh (может даже по scp) ну просто посмотреть как он там чего. Раньше я делал это через VPN вот так Удаленный доступ к домашнему серверу FreeBSD через OpenVPN! и даже работало, роутер кабельного провайдера нормально форвардил порты, надо было только знать внешний IP. Но сейчас попробовал пофорвардить порты на роутере мобильного провайдера интернета — и никак, вроде как за это надо платить и работает только если статичный IP покупать…
…а на самом деле и не нужно с роутером связываться, есть такая штука как ssh-туннель. Домашний сервер подключаются к серверу в Интернете, который настроен форвардить все(обозначенные) подключения на домашний! Для этого способа нужен свой сервер VDS/VPS… но у кого сейчас его нет, у всех! Да даже просто Amazon Cloud какой-нибудь подойдет!
Много всего перечитал, но пожалуй очень сильно помогла вот эта статья evgslb.blogspot.com спасибо, правда я её пол дня читал не мог понять как это должно работать!
Как это работает
Нам нужен Linux сервер доступный в интернете с прямым статическим IP. Я долго не мог понять, но на нем особыхнастроек делать не надо, нужно только чтобы был один пользователь, который может подключаться к этому серверу по ssh! Далее на все трех машинах должен быть установлен ssh на Linux он стоит всегда, есть мнение что можно и на Windows через Putty. На той к которой надо подключаться, на ней надо запустить ssh туннель на прием, а на той что будет подключаться ssh-туннель на выход! Запускается эти туннели коммандой подключения к серверу в интернете.
Настраиваем сервер для подключения туннелей клиентов
У меня старинный сервер Centos 6.8 все странности может из-за этого!
Захожу на сервер по ssh
Создаю пользователя user1tunnel
/usr/sbin/adduser user1tunnel
создаем ему пароль
user1tunnel passwd
Тут я немного обеспокоился а что если кто-то зайдет под этой учеткой и начнет чего то делать на сервере. Для этого я делал для пользователей оболочку lshell на которой все урезано вот как тут Настройка, переезд, тестирование нового VPS на CentOS 6! делайте также!
Добавляю новому юзеру этот шелл
chsh -s /usr/bin/lshell user1tunnel
При этом центос ругается что этого шелла нет в каком то файле, просто добавил его в тот файле и повторил
Теперь надо проверить настройки ssh вот тут
/etc/ssh/shhd_config
должно быть включено
AllowTcpForwarding yes GatewayPorts yes
и там же еще понадобиться в будущем вот это
PubkeyAuthentication yes AuthorizedKeysFile /home/%u/.ssh/authorized_keys
и пользователь должен быть писан в
AllowUsers uservasya usersasha userarsen user1tunnel
Перегружаем ssh, мое ssh подключение при этом не рвется
/sbin/service sshd restart
Так же важно тут задать, вот эти параметры они должны помогать рвать зависшие сессии, ну которые были некорректно завершить
ClientAliveInterval 15 ClientAliveCountMax 3
Работает это только в SSH 2 если ничего не происходить, то сервер у клиента спрашивает «Ты живой» 3 раза каждые 15 секунды, рвет если нет ответов! Должно помочь против занятого порта, такое случается долго висишь потом, отваливаешь, перезаходишь а сервер гвоорит
Warning: remote port forwarding failed for listen port 12345
Настраиваю того к кому надо подключаться по ssh
На домашнем компе у меня Ubuntu 18.04 Desktop, к нему и хачу подключаться! Причем при этом способе, с ssh-tunnеl не надо знать какой у меня IP, он же меняется!
В консоле исполняем
ssh -f -N user1tunnel@123.45.67.89 -R 12345:localhost:22
пока так, нужно вводить руками пароль
f — значит исполнять в фоном режиме
123.45.67.89 — ip сервера где мы настроил пользователя и ssh
R — значит туннель на вход
12345 — вообще любой порт, главное свободный на сервере, и главное знать его тому кто будет подключаться
После выполнения это команды уже можно зайти с сервера на этот комп по ssh вот так
ssh -p 12345 vasya@localhost
где vasya это имя пользователя на компе к которому подключаемся
Проверяем слушается ли порт… и сетевые команды не срабатывают но видно что команда исполняется вот так
ps -aux | grep ssh
Подумаю над этим после
Настраиваю того с кого надо подключаться по ssh
Пусть это тоже будет Linux
Cначала надо сделать туннель
ssh -f -N user1tunnel@123.45.67.89 -L 12345:localhost:12345
все тоже самое но L
И подключаемся из консоли
ssh -p 12345 vasya@localhost
Тут же все отлично слушается, в отличии от на том к кому
netstat -ntlp | grep 12345
вот что видим
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN 8166/ssh tcp6 0 0 ::1:12345 :::* LISTEN 8166/ssh
Как сделать так чтобы ssh-tunnel не рвался и сам переподключался
Делаю как тут, удивительно что такой контент есть на ютюбе
Устанавливаю
sudo apt-get install autossh
Идем в домашнею папку .ssh и там генерируем ключи, мы под пользователем vasya
cd /home/vasya/.ssh/
ssh-keygen -t rsa
имя даю vasya без пароля
А у меня один раз, ключили заработали только когда я их второй раз сгенерировал… если вообще непонтяно почему не работает, сгенерируйте еще раз ключи!
vasya.pub надо закинуть на сервер
sudo scp ./vasya.pub user1tunnel@123.45.67.89:/home/user1tunnel/
На удаленном сервере выполняем
mkdir /home/user1tunnel/.ssh
cat ./vasya.pub >> ~user1tunnel/.ssh/authorized_keys
chown -R user1tunnel:user1tunnel /home/user1tunnel
Теперь на локальном компе можем заходить без пароля вот так
ssh user1tunnel@123.45.67.89
Теперь будем запускать autossh важно что его надо запускать в фоне, а в фоне пароль не ввести, поэтому и пришлось все прописывать
autossh -M 0 -f -N user1tunnel@123.45.67.89 -R 12345:localhost:22
Работает, сразу кидается в фон ключем -f, для диагностики можно его убрать
Теперь добавляем в кроне чтобы сам запускался на загрузке
crontab -e
Тут надо прописать еще и где брать ключ, а то не запуститься
@reboot autossh -M 0 -f -N user1tunnel@123.45.67.89 -R 12345:localhost:22 -i /home/vasya/.ssh/vasya
Как подключатся не из Linux
Народ использует Putty, в одном окне открывает тунель, во втором подключаетя к локальному порту для перенаправлния — у меня это не заработало!
Самое надежно зайти на сервер по Putty а там сделать
ssh -p 12345 vasya@localhost
специально для этого в lshell разрешил использовать ssh
Так же в Windows 10 + Windows Subsystem for Linux (включается в компонентах windows) + Ubuntu 18.04 LTS(которая устанавливается из магазина Windows) можно делать все как в Linux поднимать тонель и коннектиться по ssh
ssh -f -N user1tunnel@123.45.67.89 -L 12345:localhost:12345
ssh -p 12345 vasya@localhost
«Добавляю новому юзеру этот шелл
chsh -s /usr/bin/lshell user1tunnel
При этом центос ругается что этого шелла нет в каком то файле, просто добавил его в тот файле и повторил» Ничего не понял, кого куда добавил?
Эх! Не помню что там была в Centos 6 за проблема и решение…
Cейчас на Centos 8 нет такой проблемы
chsh -s /usr/bin/lshell user1tunnel
Changing shell for user1tunnel.
Shell changed.
Есть проблема с установкой lshell потому что его уже нет в стандартном репозиотрии, но руками можно поставить (способ из интернета)
cd /tmp
wget https://kojipkgs.fedoraproject.org//packages/lshell/0.9.16/5.fc23/noarch/lshell-0.9.16-5.fc23.noarch.rpm
yum localinstall lshell-0.9.16-5.fc23.noarch.rpm
lshell тут только для урезания подключающимуся консольных команд, это можно и не делать или делать по другому…