Skip to content

sshtunnel

andyceo edited this page Mar 29, 2017 · 4 revisions

SSH-туннель

Здесь мы рассматриваем построение сетевых туннелей через ssh. Типичный пример: когда надо сделать так, чтобы рабочий компьютер было видно с домашнего, при условии, что они оба за NAT.

С использованием промежуточного сервера с IP=8.8.8.8 последовательность действий будет такой:

  1. Сначала на рабочей машине необходимо поставить ssh-демона:

     sudo aptitude install ssh
    

    подробнее здесь.

  2. Затем, в консоли рабочей машины, пробрасываем туннель до сервера (промежуточная машина, не за NAT)

     ssh -fCNR 2222:localhost:22 andyceo@8.8.8.8
    

    Промежуточный сервер спросит пароль пользователя, и после этого от его имени установит обратное ssh-соединение с рабочей машиной. В этом примере на промежуточном сервере 8.8.8.8 будет открыт порт 2222 (он будет слушаться программой sshd), и все соединения на этот порт, по зашифрованному SSH-соединению будут направляться на порт 22, интерфейс localhost, рабочей машины (той, с которой мы запустили эту команду).

  3. На домашней машине логинимся на сервак:

     ssh andyceo@8.8.8.8
    
  4. И будучи уже на сервере, набираем:

     ssh -p2222 localhost
    

    после этого ssh нас спросит пароль на рабочей машине. Все!

Дополнительные примеры

Допустим, у нас есть сервер, который стоит в офисе. На нем установлен сайт http://example.com/, который доступен только из локальной сети (локальный IP сервера - 192.168.1.1). Т.е. на сайт нельзя зайти из интернета, только из офиса. Трафик из внешней сети на порт 80 запрещен через iptables.

Можно следующим образом пробить туннель:

nc -z localhost 8080 || ssh -f -N -L localhost:8080:192.168.1.1:80 -c blowfish example.com

Эту строчку можно поставить в crontab, и тоннель будет восстанавливаться всякий раз, когда соединение по какой-либо причине пропадет.

Также, нужно прописать в /etc/hosts следующую строку:

127.0.0.1 example.com

для того, чтобы при обращении в браузере по адресу http://example.com/, браузер запрашивал наш локальный туннель.

После этого, можно зайти на сайт на продакшене следующим образом: http://example.com:8080/

Либо, можно у себя и на сервере настроить виртуальный хост (alias) вида example.local, который будет хоститься в локалхосте или внутренней сети, тогда в /etc/hosts нужно будет прописать

127.0.0.1 example.local

и заходить на сайт следующим образом: http://example.local:8080/

Опции SSH, используемые в примерах

  • -R - обратное соединение, основная опция
  • -C - компрессия
  • -N - не выполнять удаленную команду. Удобно только для проброса портов (только протокол версии 2)
  • -f - убирает ssh в фоновое выполнение, сразу по старту (удобно, чтобы не занимать терминал)

Автор решения и бессменный вдоховитель - Александр Графов, axel@drupal.ru

PS: дополнительная информация:

В файл конфига /etc/ssh/ssh_config нужно добавить следующие строки (в конец файла), чтобы на клиенте не появлялось сообщение об ошибке broken pipe:

TCPKeepAlive yes
ServerAliveInterval 30
ServerAliveCountMax 3

TCPKeepAlive yes
ServerAliveInterval 30
ServerAliveCountMax 3

PPS:

ssh-keygen -H -F [localhost]:2221
ssh-keygen -R [localhost]:2221  --- осторожно!

Ссылки

Sidebar is under construction

Clone this wiki locally