Advanced SSH: строим туннели

Довольно удобно пробросить пару портов и, например, читать рабочую wiki дома.. Или в дороге.. Или в летнем кафе. Но есть лучший способ построить более надежное решение. Многие просто не понимают, что могут иметь полноценный безопасный доступ к любым желаемым ресурсам, всего лишь создав набор конфигурационных файлов и построив туннели. Вопреки распространенному мнению для этого совсем не нужен VPN. Вам нужен всего лишь открытый порт и слушающий его SSH-демон. Порт может быть 22-й. Или 4010. Это абсолютно неважно.
Мир вокруг меняется и люди хотят работать не только в офисах. Они хотят работать дома, по дороге на работу и просто попивая кофе в любимом кафе. Вдобавок, сейчас стало очень популярным использование виртуальных машин для имитации реального рабочего окружения. Используя ssh-туннели можно использовать удаленный сервер с виртуальными машинами, полностью интегрированный в рабочее окружение.

Немного о конфигах
Man-страница ssh довольно большая и сложная. Я бы хотел сделать “беглый осмотр”, прежде чем мы приступим к основному повествованию. Если вы не очень хорошо знакомы с ssh, то рекомендую прочитать это небольшое вступление. ssh конфигурируется при помощи двух файлов: /etc/ssh/ssh_config – это общесистемный файл, и ~/.ssh/config – это личные настройки пользователя.

Необходимо четко понимать разницу между этими двумя файлами. Например, если вы хотите использовать ssh-туннели в cron-заданиях, то изменения необходимо вносить в глобальный конфиг, а если туннелирование будет использоваться только пользователем (что является наиболее частой ситуацией), то редактировать следует личный конфиг.

Создание базового ssh-конфига
Все очень и очень просто. Вся идея заключается в том, чтобы привязать локальные порты к портам на удаленной машине. Кстати, нелишним будет взглянуть на список портов и использующих их служб Это поможет вам быстро узнать какой порт, к примеру, использует IMAP

Итак.
Ваша рабочая сеть находится за фаерволом и в ней расположены следующие ресурсы, недоступные из внешней сети:

SMTP Server: 192.168.0.100 Port: 25 DNS Name: smtp.pretendco.com
Corporate Wiki: 192.168.0.110 Port: 8080 DNS Name: wiki.pretendco.com
IMAP Mail Server: 192.168.0.120 Port: 143 DNS Name: imap.pretendco.com
Subversion Server: 192.168.0.140 Port: 22 DNS Name: svn.pretendco.com
NFS Server: 192.168.0.150 Port: 2049 DNS Name: nfs.pretendco.com
SMB/CIFS Server: 192.168.0.160 Port: 3020 DNS Name: smb.pretendco.com
SSH Server: 192.168.0.170 Port: 22 DNS Name. dev.pretendco.com
VNC Server/Dev Machine: 192.168.0.180 Port: 5900 DNS Name: vnc.pretendco.com

Все, что необходимо для получения доступа к этим ресурсам извне – это создание общедоступного SSH-сервера с одним открытым портом внутри локальной сети. Давайте предположим, этот сервер называется ssh.pretendco.com и что sshd (SSH демон) слушает порт 5001. Теперь мы можем создать файл конфигурации SSH на основании этой информации.

Поподробнее об опциях
Итак, у нас есть список внутренних ip-адресов, DNS-имен и номеров портов, на которых ждут подключения сервисы, к которым мы хотим получить доступ. Для этого мы создадим собственный конфигурационный файл. У ssh есть огромное количество интересных и полезных опций, для более подробно ознакомления с ними я рекомендую прочитать man-страницу ssh_config. Мы же сосредоточимся на следующих опциях.

# Это самые основы.
# Этот пример даст вам представление о разделении по имени хоста или маске:
Host * (это означает, что секция применима к любому хосту)
Host ssh.pretendco.com (Это означает, что опции применяются только к ssh.pretendco.com)

Hostname
Вы можете создавать вложенные мультихостовые конфигурации, работающие как дома, так и на работе. Например для туннеля localhost:8080 можно легко создать псевдоним:

Host wiki.pretendco.com
Hostname localhost
Port 2200

Это очень удобно, потому что позволяет полностью сэмулировать рабочую сеть у вас дома. Если у вас есть сценарии или конфиги, жестко завязанные на вашу рабочую сеть, то это решение вас очень порадует :)

ServerAliveInterval
Эта опция управляет отсылкой сообщения удаленному серверу с интервалом в N минут для проверки соединения. По умолчанию имеет значение 0.

В действительности, директивы Host и Hostname – это все, что нам понадобится :) Но тем не менее будет очень полезно ознакомиться и с другими опциями, такими как ServerAliveInterval и ServerAliveCountMax.
Итак, базовый запас знаний у нас есть, можно двигаться дальше

Редактируем ~/.ssh/config
Итак, напишем конфиг, используя те знания, которые мы получили парой абзацев выше. Будьте готовы использовать этот файл в качестве шаблона для подключения устройств и сервисов.

Если у вас уже есть файл ~/.ssh/config, то сделайте резервную копию перед началом работы

cd ~/.ssh/
mv config backup_config_file

Теперь вы можете использовать нижеприведенный код в качестве шаблона для вашего config-файла

###SSH Port Forwarding Configuration###

####Global Configuration Options###

#Host * will apply to all hosts
Host *
ServerAliveCountMax 4 #Note default is 3
ServerAliveInterval 15 #Note default is 0

####Port Forwarding Directives###

#Network Reference, Cheat Sheet:
#Refer to http://www.iana.org/assignments/port-numbers for full list of port numbers
#SMTP Server: 192.168.0.100 Port: 25 DNS Name: smtp.pretendco.com
#Corporate Wiki: 192.168.0.110 Port: 8080 DNS Name: wiki.pretendco.com
#IMAP Mail Server: 192.168.0.120 Port: 143 DNS Name: imap.pretendco.com
#Subversion Server: 192.168.0.140 Port: 22 DNS Name: svn.pretendco.com
#NFS Server: 192.168.0.150 Port: 2049 DNS Name: nfs.pretendco.com
#SMB/CIFS Server: 192.168.0.160 Port: 3020 DNS Name: smb.pretendco.com
#SSH Server: 192.168.0.170 Port: 22 DNS Name. dev.pretendco.com
#VNC Server/Dev Machine: 192.168.0.180 Port: 5900 DNS Name: vnc.pretendco.com

#(Note we just made up the name workTunnel.)
#The workTunnel alias holds both the nested ssh server configuration,
#and the actual port forwarding directives.
#Note you can forward to either an IP Address or a hostname.

Host workTunnel
#Work SSH Server To Initiate Tunneling From
Host ssh.pretendco.com
Port 5001

# SMTP Server
LocalForward localhost:2525 smtp.pretendco.com:25

# Corporate Wiki
# Note I am forwarding to an IP address just to show that you can.
LocalForward localhost:8080 192.168.0.110:8080

# IMAP Mail Server
LocalForward locahost:1430 imap.pretendco.com:143

# Subversion Server
LocalForward locahost:2222 svn.pretendco.com:22

# NFS Server
LocalForward locahost:2049 nfs.pretendco.com:2049

# SMB/CIFS Server
LocalForward locahost:3020 smb.pretendco.com:3020

# SSH Server
LocalForward locahost:2220 dev.pretendco.com:22

# VNC Server
LocalForward locahost:5900 dev.pretendco.com:5900

###Hostname alias directives###
#These allow you to mimic hostnames as they appear at work.
#We just take the localhost names from the above section and add alias names.
#Note that you don’t need to use a FQDN; you can use a short name ,such as smtp instead of smtp.pretendco.com.

Host smtp.pretendco.com
HostName localhost
Port 2525

Host wiki.pretendco.com
HostName localhost
Port 8080

Host imap.pretendco.com
HostName localhost
Port 1430

Host svn.pretendco.com
HostName localhost
Port 2222

Host nfs.pretendco.com
HostName localhost
Port 2049

Host smb.pretendco.com
HostName localhost
Port 3020

Host dev.pretendco.com
HostName localhost
Port 2220

Host vnc.pretendco.com
HostName localhost
Port 5900

#End Config File

Использование SSH-туннеля
После настройки вы можете соединиться с основным ssh-сервером, который поддерживает проброшенные порты для ваших сервисов. Я очень рекомендую использовать отладочный вывод, потому как по умолчанию не выводится вообе никаких сообщений:

ssh -v workTunnel

Если все настроено правильно, то вы должны увидеть что-то вроде этого:

………………..
debug1: Local connections to localhost:2200 forwarded to remote address svn.pretendco.com:22
debug1: Local forwarding listening on ::1 port 2200.
debug1: channel 0: new [port listener]
debug1: Local forwarding listening on 127.0.0.1 port 2200.
debug1: channel 1: new [port listener]
debug1: Local connections to localhost:2222 forwarded to remote address dev.pretendco.com:22
debug1: Local forwarding listening on ::1 port 2222.
debug1: channel 2: new [port listener]
debug1: Local forwarding listening on 127.0.0.1 port 2222.
………………….

Совет: стоит отметить, что очень многое зависит от правильной настройки хостнеймов. Вы можете использовать ресурсы, закрытые фаерволлом также, как если бы вы находились за ним. Например, для получения доступа к закрытой зоне можно просто набрать:

svn list svn+ssh://svn.pretendco.com/project

Если необходим доступ к сервису, который работает не по ssh-протоколу (например к вашей локальной wiki, которая работает на порту 8080), можно прописать алиасы в файле /etc/hosts:

# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost wiki
::1 localhost6.localdomain6 localhost6

Вы и так могли получить к ней доступ, используя:

http://localhost:8080

но с внесенными нами изменениями все стало немного попроще:

http://wiki:8080

Если вам очень захочется (рекомендуем подумать), то можно сделать проброс портов на “привелигированный” порт, например 80. Если у вас запущен сервис за фаерволлом на 80 порту, то можно воссоздать рабочее окружение полностью. Для этого надо отредактировать файл конфигурации ssh. Имейте в виду, что вам понадобятся привилегии суперпользователя:

# Internal Web Server running on port 80
LocalForward locahost:80 web.pretendco.com:80

Теперь вы можете получить доступ, просто набрав:

http://web

Заключение
Вы научились создавать сложные конфигурации для ssh, строить туннели и получать с их помощью доступ к закрытым извне сервисам.

Но имейте в виду, что эти решения не идеальны. Например, вы не сможете использовать созданный конфиг-файл где-то еще, потому что он адаптирован для другой машины. Однако есть довольно простое решение (помните, что это относится к хостам, перечисленным в вашем конфиге):

1. Вы можете добавить в ваш стартовый скрипт (.bashrc или .zshrc Зависит от используемой вами оболочки) проверку хостнейма (например, домашний это компьютер или рабочий) и, в зависимости от этого, подгружать необходимый конфиг-файл.
2. Вы можете создать альтернативный конфиг и использовать его в пути или на работе при помощи

ssh -F ~/.ssh/remoteConfig

3. Ну и самое простое – это создать алиас для пункта 2.

alias stunnel=’ssh -v -F ~/.ssh/remoteConfig workTunnel’

Теперь вы можете запускать туннель при помощи одной простой команды

stunnel

Оригинал: http://www.redhatmagazine.com/2007/11/27/advanced-ssh-configuration-and-tunneling-we-dont-need-no-stinking-vpn-software/


 

Система Orphus

 


 

Comments: 7

  1. Max February 5th, 2008 at 5:16 pm

    Спасибо.

  2. SirYorik February 8th, 2008 at 8:52 pm

    перевод переводом, но понятней от этого не стало, равно как и оригинальная статья.
    сам-то пробовал это применить?
    простой вопрос. с какого конца туннеля запускать указанный конфиг?

  3. SirYorik February 8th, 2008 at 9:08 pm

    http://souptonuts.sourceforge.net/sshtips.htm

    это вот на порядок понятнее

  4. boombick February 8th, 2008 at 11:19 pm

    Спасибо за комментарий, поставил в очередь на перевод :)

  5. VitahA August 31st, 2008 at 9:03 am

    Все мы люди

  6. SSH проброс портов « It_blog’s November 24th, 2008 at 10:24 pm

    [...] Оригинал О том как сделать постоянный проброс портов для нескольким приложений читать Здесь [...]

  7. GigaHooker January 7th, 2011 at 12:30 am

    So lot of spam.. WHY?!
    Moderator, WTF??????

Add a Comment