ITСooky

IT-рецепты съедобные и не очень!

Заходим на домашний сервер за NAT, извне по ssh, через сервер в интернете!

дата 18.01.2020

Например дома есть сервер и хочется к нему подключаться по 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


2 комментария to “Заходим на домашний сервер за NAT, извне по ssh, через сервер в интернете!”

  1. radioslon:

    «Добавляю новому юзеру этот шелл
    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 тут только для урезания подключающимуся консольных команд, это можно и не делать или делать по другому…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *