Зачем нужен SSH?
Каждый системный администратор или сетевой инженер хоть раз в своей практике сталкивался с ситуацией, когда нужно получить доступ из публичной сети Интернет к ресурсам своей рабочей сети, скрытой за NAT и защищённой фаерволом.
Конечно, для решения этой задачи можно настроить шифрованный site-to-site туннель или PPTP.
Или же воспользоваться сторонним приложением для организации удалённого доступа, например TeamViewer. Однако есть более простое решение, на реализацию которого уйдет буквально одна минута. К тому же, это решение не требует никакого стороннего программного обеспечения, кроме включённого по умолчанию в 90% Linux/Unix дистрибутивов пакета OpenSSH.
Прочитав эту статью, вы узнаете, как, кроме реализации обычного удаленного доступа, вы сможете организовать socks-proxy, публиковать сервис, связать между собой несколько находящихся за NAT ресурсов через метод двойного туннелирования и многое другое.
SSH-туннель Layer 3 (сетевой уровень): туннелируем udp-трафик
В начале статьи было сказано о том, что ssh-туннель базируется на транспортном протоколе tcp и поэтому отправить в такой туннель udp-трафик не получится. Однако в операционных системах семейства Linux есть возможность создавать tun-интерфейсы, которые работают на сетевом уровне модели OSI и оперируют ip-пакетами.
Такой туннель, который создается с помощью учетной записи root, лучше не использовать на постоянной основе, а только в случае крайней необходимости. При этом необходимо использовать следующие методы, уменьшающие шансы раскрытия пароля root:
- Использовать для root довольно сложный пароль на подобии хэша md5;
- Или настроить авторизацию по ключам.
Для создания туннеля необходимо в конфигурационном файле OpenSSH разрешить туннелирование. Добавьте в файл /etc/ssh/ssh_config следующую строку:
Для того чтобы можно было использовать парольную авторизацию root:
Для подключения к ssh-серверу и создания туннеля через tun-интерфейсы используется следующая команда:
Аргумент -w создает интерфейсы tun0 на клиенте и сервере.
Затем необходимо настроить ip адреса tun интерфейсов и добавить необходимые маршруты.
На клиенте:
На сервере:
Туннели с tun-интерфейсами работают на 3 уровне модели OSI, а значит должны пропускать ICMP и UDP трафик. Поэтому проверку работоспособности туннеля можно выполнить, послав icmp-запрос на какой-либо хост из удаленной сети: ping 172.16.0.100.
Перенаправление локального порта
Перенаправление локального порта позволяет вам перенаправить порт на локальном (ssh-клиент) компьютере на порт на удаленном (ssh-сервере), который затем перенаправляется на порт на конечном компьютере.
В этом типе пересылки клиент SSH прослушивает данный порт и туннелирует любое соединение с этим портом на указанный порт на удаленном сервере SSH, который затем подключается к порту на конечном компьютере. Конечный компьютер может быть удаленным SSH-сервером или любым другим компьютером.
Перенаправление локальных портов в основном используется для подключения к удаленной службе во внутренней сети, такой как база данных или сервер VNC.
В Linux, macOS и других системах Unix, чтобы создать переадресацию локального порта, передайте параметр клиенту :
Используются следующие параметры:
- — IP-адрес и номер порта локального компьютера. Если опущен, клиент ssh привязывается к локальному хосту.
- — IP или имя хоста и порт конечного компьютера.
- — удаленный пользователь SSH и IP-адрес сервера.
В качестве можно использовать любой порт с номером больше . Порты с номерами меньше являются привилегированными и могут использоваться только пользователем root. Если ваш SSH-сервер прослушивает порт, отличный от 22 (по умолчанию), используйте параметр .
Имя хоста назначения должно разрешаться с сервера SSH.
Допустим, у вас есть сервер базы данных MySQL, работающий на машине во внутренней (частной) сети, на порте 3306, который доступен с машины , и вы хотите подключиться к базе данных с помощью клиента MySQL на локальном компьютере. сервер. Для этого вы можете перенаправить соединение, используя следующую команду:
После запуска команды вам будет предложено ввести пароль удаленного пользователя SSH. После входа вы войдете на удаленный сервер, и туннель SSH будет установлен. Также рекомендуется настроить аутентификацию на основе ключей SSH и подключаться к серверу без ввода пароля.
Теперь, если вы базы данных на компьютере , соединение будет перенаправлено на MySQL через компьютер который действует как промежуточный сервер.
Вы можете перенаправить несколько портов в несколько пунктов назначения с помощью одной команды ssh. Например, у вас есть другой сервер базы данных MySQL, работающий на компьютере , и вы хотите подключиться к обоим серверам со своего локального клиента, вы должны запустить:
Чтобы подключиться ко второму серверу, вы должны использовать .
Когда целевой хост совпадает с SSH-сервером, вместо указания IP-адреса или имени хоста назначения вы можете использовать .
Допустим, вам нужно подключиться к удаленному компьютеру через VNC, который работает на том же сервере и недоступен извне. Вы бы использовали следующую команду:
Параметр указывает команде работать в фоновом режиме, а не выполнять удаленную команду. Мы используем потому что VNC и SSH-сервер работают на одном хосте.
Если у вас возникли проблемы с настройкой туннелирования, проверьте конфигурацию удаленного SSH-сервера и убедитесь, что для параметра не задано значение . По умолчанию пересылка разрешена.
Использует
Пример туннелирования приложения X11 через SSH: у пользователя josh есть SSHed с локальной машины foofighter на удаленную машину tengwar для запуска xeyes .
Вход в OpenWrt через SSH с помощью PuTTY, работающего в Windows .
SSH — это протокол, который можно использовать для многих приложений на многих платформах, включая большинство вариантов Unix ( Linux , BSD, включая MacOS от Apple и Solaris ), а также Microsoft Windows . Некоторым из перечисленных ниже приложений могут потребоваться функции, которые доступны или совместимы только с определенными клиентами или серверами SSH. Например, использование протокола SSH для реализации VPN возможно, но в настоящее время только с сервером OpenSSH и реализацией клиента.
Для входа в оболочку на удаленном хосте (заменяет Telnet и rlogin )
Для выполнения одной команды на удаленном хосте (замена rsh )
Для настройки автоматического (беспарольного) входа на удаленный сервер (например, с помощью OpenSSH )
В сочетании с rsync для эффективного и безопасного резервного копирования, копирования и зеркалирования файлов
Для переадресации порта
Для туннелирования (не путать с VPN , которая пакеты между разными сетями или два широковещательных домена в один).
Для использования в качестве полноценного зашифрованного VPN
Обратите внимание, что только сервер и клиент OpenSSH поддерживают эту функцию.
Для пересылки X с удаленного хоста (возможно через несколько промежуточных хостов)
Для просмотра веб-страниц через зашифрованное прокси-соединение с клиентами SSH, которые поддерживают протокол SOCKS .
Для безопасного монтирования каталога на удаленном сервере в качестве файловой системы на локальном компьютере с использованием SSHFS .
Для автоматического удаленного мониторинга и управления серверами с помощью одного или нескольких механизмов, описанных выше.
Для разработки на мобильных или встроенных устройствах, поддерживающих SSH.
Для защиты протоколов передачи файлов.
Протоколы передачи файлов
Протоколы Secure Shell используются в нескольких механизмах передачи файлов.
- Безопасное копирование (SCP), эволюционировавшее из протокола RCP поверх SSH.
- rsync , более эффективный, чем SCP. Обычно работает через SSH-соединение.
- Протокол передачи файлов SSH (SFTP), безопасная альтернатива FTP (не путать с FTP через SSH или FTPS )
- Файлы, передаваемые по протоколу оболочки (он же FISH), выпущенному в 1998 году, который эволюционировал из команд оболочки Unix по SSH.
- Протокол Fast and Secure Protocol (FASP), также известный как Aspera , использует SSH для управления и порты UDP для передачи данных.
Обратный SSH-туннель — выставить свои ресурсы в интернет
Как я уже говорил, точку входа в туннель можно открывать не только со стороны оригинатора ssh сессии, но и с удалённой стороны, то есть с той, к которой мы устанавливаем ssh сессию. Для этого вместо параметра -L используется параметр -R. Для чего это нужно?
Например, для того, чтобы можно было опубликовать локальный сервис для удалённого доступа.
На ноутбуке Алекса запущен Web сервер apache доступный
по адресу 127.0.0.1 с тестовой копией портала компании. Алексу нужно дать доступ к Web серверу своим
коллегам для проведения тестирования интерфейса. Вообще, для подобных целей Алексу неплохо было бы реализовать более надёжную тестовую песочницу. Но так как наш Алекс не более чем виртуальный персонаж этой статьи, он для
демонстрации работы SSH туннеля устанавливает
сессию между своим ноутбуком и маршрутизатором Linux. А с помощью параметра -R открывает порт 8080 на
внутреннем интерфейсе маршрутизатора с адресом 192.168.0.1, который ссылается на сокет 127.0.0.1:80 его тестового Web сервера.
Как видите, на маршрутизаторе процесс sshd открыл локальный сокет 8080
alex@Router:~$
sudo lsof -nPi | grep 8080
sshd
17233 alex 9u IPv4
95930 0t0 TCP 192.168.0.1:8080 (LISTEN)
Давайте посмотрим, что произойдёт с TCP пакетом, отправленным с компьютера 192.168.0.200 в сторону тестового портала, опубликованного на 192.168.0.1:8080:
1. TCP пакет с адресом источника 192.168.0.200 и адресом и портом назначения 192.168.0.1:8080 попадёт в сокет 192.168.0.1:8080, открытый процессом sshd;
2. Процесс sshd, получив пакет, в соответствии с правилом трансляции перепишет адрес и порт назначения с 192.168.0.1:8080 на 127.0.0.1:80 и отправит его внутри SSH сессии стороне-оригинатору 2.2.2.2;
3. Процесс ssh на ноутбуке Алекса, получив пакет и просмотрев адрес его назначения, перепишет адрес отправителя с 192.168.0.200 на адрес своего loopback, и отправит его в локальный сокет 127.0.0.1:80, открытый процессом apache.
Как видите, правила трансляции очень простые. Хост, который открывает сокет для туннеля, занимается трансляцией адреса и порта назначения согласно правилу трансляции. Хост с противоположной стороны туннеля производит подмену адреса и порта источника согласно своей таблице маршрутизации
Таблица маршрутизации необходима, во-первых, для того чтобы отправить пакет в нужную сторону, а, во вторых, для того чтобы произвести
подмену адреса источника на адрес интерфейса, с которого будет отправлен пакет.
Одно важное замечание, которое я оставил на конец статьи.
Если при открытии точки входа в туннель используется localhost вместо адреса реального интерфейса, то его можно опустить, сократив, таким образом, команду с
alex@Alex-PC:~$ ssh -L 127.0.0.1:8080:192.0.0.1:80 alex@1.1.1.1
до
alex@Alex-PC:~ssh -L
8080:192.0.0.1:80 alex@1.1.1.1
Эта важная особенность синтаксиса пригодится нам в следующем примере.
Remote Port Forwarding
Remote port forwarding lets you connect from the remote SSH server to another server. To use remote port forwarding, you need to know your destination server, and two port numbers. You should already know your destination server, and for basic uses of port forwarding, you can usually use the port numbers in Wikipedia’s list of TCP and UDP port numbers.
For example, say you wanted to let a friend access your remote desktop, using the command-line SSH client. You would use port number 5900 (the first VNC port), and destination server localhost:
ssh -R 5900:localhost:5900 guest@joes-pc
The -R option specifies remote port forwarding. For the duration of the SSH session, Joe would be able to access your desktop by connecting a VNC client to port 5900 on his computer (if you had set up a shared desktop).
Как работает SSH-туннелирование
SSH туннель или SSH Port Forwarding, как его называет man(1) ssh – это опциональный функционал протокола, который работает поверх всем знакомой обычной SSH сессии. SSH туннель позволяет послать TCP пакет с одной стороны SSH соединения на другую его сторону и произвести трансляцию IP заголовка по заранее определенному правилу в процессе передачи.
Понять, как работает SSH туннель очень просто: если представить его в виде point-to-point соединения. Так же как и в PPP, любой пакет, попавший в один конец соединения,
будет передан и получен на другом конце туннеля. Дальше, в зависимости от адреса получателя заданного в IP заголовке, пакет будет либо обработан принимающей стороной туннеля (если пакет предназначается непосредственно ей), либо смаршрутизирован дальше в сеть (если адресатом является другой узел сети).
Основное отличие SSH туннеля от PPP соединения в том, что в SSH туннель можно завернуть только TCP трафик. (Примечание: есть несколько хаков, как можно передать UDP через TCP-сокет внутри SSH туннеля, но это решение выходит за рамки данной статьи).
Второе отличие состоит в том, что в point-to-point
соединении входящий трафик может быть инициирован с любой стороны, тогда как для SSH туннеля необходимо явно задать «точку входа» для трафика. «Точка входа» – это параметр вида <адрес>:<порт>,
указывающий какой сокет открыть для входа в туннель (с локальной или удалённой стороны SSH сессии).
Кроме точки входа дополнительно нужно указать правило вида
<адрес>:<порт>, по которому должен
быть переписан заголовок (точнее, адрес и порт назначения) TCP пакета в процессе передачи. Точка входа может задаваться с любого конца туннеля. За этот параметр отвечают ключи –L (local) и –R (remote). Под local
и remote подразумеваются стороны туннеля с точки зрения стороны-оригинатора, то есть того хоста, который устанавливает SSH сессию.
Пока выглядит немного запутанно, поэтому давайте разберём на конкретном примере.
Что такое обратное туннелирование SSH?
Одной из альтернатив перенаправлению портов SSH является обратное туннелирование SSH. Концепция реверсного туннелирования SSH сравнительно проста. Для этого вам понадобится еще один хост (так называемый «хост релея»), находящийся за пределами защищенной домашней сети, к которому вы можете подключиться через SSH из либого места независимо от того, где вы находитесь. Вы можете настроить хост релея на отдельном экземпляре виртуального частного сервера VPS, использующего общедоступный адрес IP. После этого все, что вам потребуется сделать, это настроить постоянный туннель SSH туннель от сервера в вашей домашней сети на хост общественного релея. Благодаря этому вы можете подключаться «в обратном направлении» к домашнему сервера с хоста релея (именно поэтому такой туннель называется «обратным» туннелем). Д тех пор, пока хост релея доступен для вас, вы можете подключиться к домашнему серверу из любого места, где бы вы не находились, причем независимо от того, используется ли в вашей домашней сети ограничивающий NAT или брандмауэр.
Аутентификация: управление ключами OpenSSH
В Unix-подобных системах список авторизованных открытых ключей обычно хранится в домашнем каталоге пользователя, которому разрешен удаленный вход, в файле ~ / .ssh / authorized_keys. Этот файл используется SSH только в том случае, если он не доступен для записи никому, кроме владельца и root. Когда открытый ключ присутствует на удаленном конце, а соответствующий закрытый ключ присутствует на локальном конце, ввод пароля больше не требуется. Однако для дополнительной безопасности сам закрытый ключ может быть заблокирован парольной фразой.
Закрытый ключ также можно искать в стандартных местах, а полный путь к нему можно указать в параметрах командной строки (параметр -i для ssh). SSH-серийник утилита производит открытые и закрытые ключи, всегда парами.
SSH также поддерживает аутентификацию на основе пароля, которая шифруется автоматически сгенерированными ключами. В этом случае злоумышленник может имитировать легитимную сторону сервера, запросить пароль и получить его ( атака «человек посередине» ). Однако это возможно только в том случае, если обе стороны никогда ранее не аутентифицировались, поскольку SSH запоминает ключ, который ранее использовала сторона сервера. Клиент SSH выдает предупреждение перед тем, как принять ключ нового, ранее неизвестного сервера. Парольную аутентификацию можно отключить со стороны сервера.
Single Applications
If you are logging in from a Unix-like operating system, you can forward single applications over SSH very easily, because all Unix-like systems share a common graphics layer called X11. This even works under Mac OS X, although you will need to install and start the X11 server before using SSH.
To forward single applications, connect to your system using the command-line, but add the -X option to forward X11 connections:
ssh -X laptop
Once the connection is made, type the name of your GUI program on the SSH command-line:
firefox &
Your program will start as normal, although you might find it’s a little slower than it would be if it were running locally. The trailing & means that the program should run in «background mode», so you can start typing new commands in straight away, rather than waiting for your program to finish.
If you only want to run a single command, you can log in like this:
ssh -f -T -X laptop firefox
That will run Firefox, then exit when it finishes. See the SSH manual page for information about -f and -T.
If you start an application and it complains that it cannot find the display, try installing the xauth package from the Main repository (click here to install xauth). Xauth is installed by default with desktop installations but not server installations.
If you suspect that programs are running slowly because of a lack of bandwith, you can turn SSH compression on with the -C option:
ssh -fTXC joe@laptop firefox
Using -fTXC here is identical to -f -T -X -C.
Nested Windows
Xephyr is a program that gives you an X server within your current server. It’s available in the xserver-xephyr package in the Main repository (click here to install xserver-xephyr).
Two ssh forwarded desktops on dual monitors, click to enlarge
Setting up Xephyr was explained briefly in the Ubuntu forums.
Port Forwarding Explained
To get the most out of port forwarding, it’s helpful to know a bit about how the Internet works.
The Internet assigns computers virtual «ports», a bit like the USB ports on the back of your computer:
To let a digital camera share pictures with your PC, you connect the USB port on the camera to any USB port on the PC. The computer then talks to the camera about your photos, and shows you the result.
To let a web server share pages with your PC, you connect the web server port on the server to any Internet port on the PC. The computer then talks to the server about your page, and shows you the result.
Unlike a USB port, there is no physical component to an Internet port. There’s no actual wire, or actual hole on the back of your computer. It’s all just messages being sent over the Internet. Like other «virtual» computer concepts, Internet ports are just an analogy that help to explain what your computer is doing. Sometimes, that analogy breaks down:
There are two types of Internet port: normal «TCP» ports and strange «UDP» ports (which won’t be covered here).
Unlike USB ports, every computer has exactly 65,535 numbered TCP ports, some of which have a special purpose. For example, port number 80 is your web server port, so your web browser knows it should connect to port number 80 in order to download a web page.
Connections between Internet ports can be patched together, so a connection from computer A to computer B on port 12,345 could be patched through to port number 80 on computer C. This is known as port forwarding.
Troubleshooting
If you get a message like this when you try to forward a port:
bind: Address already in use channel_setup_fwd_listener: cannot listen to port: <port number> Could not request local forwarding.
then someone is already listening on that port number. You won’t be able to listen on that port until the other person has finished with it.
If forwarding doesn’t seem to work, even though you didn’t get a warning message, then your SSH server might have disabled forwarding. To check, do the following:
grep Forwarding /etc/ssh/sshd_config
If you see something like this:
X11Forwarding no AllowTcpForwarding no
then forwarding is disabled on your server. See for more information.
12 ответов
Как отмечали другие люди, скорее всего, это связано с другим процессом, использующим порт . В Windows выполните команду:
И там должно быть указано все, что портит порт. Конечно, тогда вам придется пойти и вручную убить эти программы в диспетчере задач. Если это все еще не работает, замените строку:
С
Конечно, замените своим реальным IP-адресом или используйте .
Это может быть связано с неверной конфигурацией в вашем .
В моем случае это было так:
вместо
Просто для тех, кто может посмотреть на этот ответ в надежде решить подобную проблему, я получил похожее сообщение, потому что мой IP-адрес изменился.
В сообщении об ошибке указано . Это означает, что вам нужно использовать правильный адрес для одного из ваших сетевых интерфейсов или для приема соединений от всех интерфейсов.
Другие решения о портах работают только после порой сбойной черной магии (например, работа после перезагрузки некоторых компьютеров, но не других), потому что порт совершенно не имеет значения.
Документация по Java для ,
Причина:
Ошибка связана со вторым условием, упомянутым выше. Когда вы запускаете сервер (Tomcat, Jetty и т. Д.), Он прослушивает порт и связывает сокет с адресом и портом. В Windows и Linux имя хоста преобразуется в IP-адрес из Этот файл сопоставления хоста с IP-адресом можно найти в . Если это сопоставление изменилось и имя хоста не может быть преобразовано в IP-адрес, вы получите сообщение об ошибке.
Решение:
Отредактируйте файл hosts и исправьте сопоставление для имени хоста и IP-адреса, используя права администратора.
, например:
Подробнее: java.net .BindException: не может назначить запрошенный адрес.
Для меня это было потому, что предыдущее изменение jmeter.properties все еще было в игре
если вы используете сервер, есть «IP публичной сети» и «IP внутренней сети».
Используйте «IP внутренней сети» в вашем файле /etc /hosts и «IP публичной сети» в своем коде.
если вы используете «общедоступный сетевой IP» в своем файле /etc /hosts, вы получите эту ошибку.
Порт занят другим процессом. Возможно, неопределенный старый запуск вашей программы. Убедитесь, что ваша программа завершилась корректно или убейте ее.
Как говорится в сообщении об ошибке, он не может связываться, что обычно означает, что он используется другим процессом. Из командной строки запустите:
Запросите вывод для используемого порта 9999 в левом столбце.
Я сталкивался с этой ошибкой при копировании конфигураций с одного сервера на другой.
У меня было имя хоста старого хоста в моем свойстве $ {JETTY_BASE} /start.ini jetty.host . Установка правильного значения свойства jetty.host решила проблему для меня.
Надеюсь, это поможет в будущем кому-то, кто будет работать на нескольких серверах одновременно.
если вы были на CentOS?
Вы должны попытаться это сделать.
$ service network restart
или
перезагрузите сервер.
Согласно документации , это в основном:
Поэтому попробуйте следующую команду:
чтобы дважды проверить, если какое-либо приложение использует тот же порт и убить его.
Если это не так, убедитесь, что ваш IP-адрес, к которому вы пытаетесь привязаться, правильный (он правильно назначен вашему сетевому интерфейсу).
Как использовать SSH?
Для использования PuTTY необходимо скачать и инсталлировать приложение, после чего в графическом интерфейсе можно осуществить настройку программы. Приложение имеет 4 вкладки:
- Session. В этой вкладке осуществляется настройка подключения к серверу.
- Terminal. Здесь можно корректировать настройки работы терминала, через который и осуществляется вся работа.
- Connection. В этой вкладке можно задать параметры подключения, выбрать алгоритм шифрования и задать другие настройки соединения.
- Window. В этом окне пользователь может выбрать внешний вид приложения, изменить шрифт и цвет текста.
В PuTTY , как и других приложениях для запуска SSH-протокола, используются два основных метода аутентификации: по паролю и по ключу.При использовании аутентификации по паролю пользователь использует для установки соединения персональный логин и пароль.
В случае использования ключа предварительно генерируются открытый (на устройстве, к которому будут подключаться) и закрытый (на устройстве, с которого будет происходить подключение) ключи для каждого отдельного пользователя. Эти файлы не передаются во время аутентификации, система только проверяет, чтобы владелец открытого ключа владел и закрытым. Этот метод используется для автоматического входа в удаленный ПК.
В PuTTY для управления удаленным ПК используется терминал: и команды, и передача файлов осуществляются только через него.
SSH — один из самых безопасных протоколов для реализации удаленного доступа к ПК. Современные алгоритмы шифрования и широкий выбор инструментов для настройки протокола делают его самым популярным вариантом для удаленного администрирования компьютеров и безопасной передачи данных. Наш виртуальный хостинг сайтов поддерживает работу SSH во всех тарифных планах хостинга.