Error opening terminal unknown

Docker error opening terminal unknown occurs when we try to enter the docker container and run basic bash commands like the top, less, nano, or vim.

Docker error opening terminal unknown occurs when we try to enter the docker container and run basic bash commands.

Here at Bobcares, we have seen several causes for this error while troubleshooting Docker issues as part of our Server Management Services for web hosts and online service providers.

Today we’ll take a look at the cause for this error and how to fix it.

Why does Docker error opening terminal unknown occur

Before getting into the solution part, let us now discuss why does this error occur.

Normally, this error occurs when we open the container using the below command and try to run programs like top, less, nano, or vim.

docker exec -ti <container-name> bash

The reason for this error is that the programs like the top, less or vim uses terminal information to fill the screen and recognize the keys that we hit. In case, if this information is incorrect, the screen will get messed up or keys will not be recognized.

For instance, the error appears as below.

Docker Error Opening Terminal Unknown

How we fix Docker error opening terminal unknown

Recently, one of our customers approached us telling us that he was able to enter the container via sudo docker exec -t -i {container_name} bash command. But after trying to run nano, he received the below error.

Error opening terminal: unknown.

Now, let’s see how our Support Engineers resolve this error.

The easy and quick solution that we provide to our customers is that after entering the container we set the TERM environment variable to xterm.

To enter the container, we run the below command.

docker exec -ti <a-docker-container> bash

Then to set the TERM environment variable to xterm. For that, we ran the following command.

export TERM=xterm

This instantly fixed the error.

[Need any further assistance in fixing Docker errors? – We’re available 24*7]

Conclusion

In short, this Docker error occurs when we open the container and try to run basic bash commands. Today, we saw how our Support Engineers resolve this error to our customers.

Are you using Docker based apps?

There are proven ways to get even more out of your Docker containers! Let us help you.

Spend your time in growing business and we will take care of Docker Infrastructure for you.

GET STARTED

var google_conversion_label = «owonCMyG5nEQ0aD71QM»;

В некоторых docker-контейнерах при запуске консольных приложений, вместо программы может отобразиться ошибка:

Error opening terminal: unknown.

Лечится это проще простого, достаточно выполнить:

export TERM=xterm

И затем повторно запустить приложение.


Post Views:
3 055

Читайте также

  • Error getting container from driver devicemapper: Error mounting: device or resource busy

    Что делать, если во время старта docker-контейнера появляется ошибка вроде такой?

  • Что не так с этим скриптом?

    Очень крутая задача, в которой не всё так просто, как кажется на первый взгляд. Попробуйте найти в ней 2 логические…

  • Что не так с функцией file_put_contents() в PHP?

    Если в кратце, то суть такая: file_put_contents() не атомарен и не гарантирует записи данных файл, а может вообще очистить его…

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

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

Name *

Email *

Website

Сохранить моё имя, email и адрес сайта в этом браузере для последующих моих комментариев.

What’s on your mind?

Related Posts

PHP Composer как предотвратить создание symlink на локальные файлы

Всем известно, что Composer позволяет выкачивать зависимости не только с packagist и различных git-хостингов, но и просто из локальной директории. Но в таком случае существует несколько способов, как именно файлы попадут в директорию vendor. По-умолчанию Read more

Как в Linux консоли добавить в файл сразу несколько строк

Тоже распространённая задача — вставить в файл из консоли сразу несколько строк. Но есть нюанс, в зависимости от выбора способа вставки командный интерпретатор будет, пытаться заменить переменные на их значения, или нет. Т.е. если в Read more

Примеры команды sed для работы со строками файлов

Sed умеет очень круто обрабатывать файлы. Давайте рассмотрим несколько примеров. Например, нужно вставить новую строку в файл после определённой линии: sed ‘3 a new line content’ my.txt Данная команда добавит новую строку в файл my.txt Read more

Содержание

  1. Ошибка при запуске консольного редактора NANO
  2. Error opening terminal when running IFL, TBIView, or OSD Tool Script from Linux Distribution
  3. Thread: Error opening terminal: xterm.
  4. Error opening terminal: xterm.
  5. Re: Error opening terminal: xterm.
  6. Re: Error opening terminal: xterm.
  7. Re: Error opening terminal: xterm.
  8. Re: Error opening terminal: xterm.
  9. Re: Error opening terminal: xterm.
  10. [Solved-5 Solutions] nano error: Error opening terminal: xterm-256color
  11. Error Description:
  12. Solution 1:
  13. Solution 2:
  14. Solution 3:
  15. Solution 4:
  16. Solution 5:
  17. Related Searches to nano error: Error opening terminal: xterm-256color
  18. Arch Linux
  19. #1 2010-04-08 04:52:01
  20. [solved] Error opening terminal: unknown.
  21. #2 2010-04-08 05:55:53
  22. Re: [solved] Error opening terminal: unknown.
  23. #3 2010-04-08 12:05:31
  24. Re: [solved] Error opening terminal: unknown.
  25. #4 2010-04-08 12:11:10
  26. Re: [solved] Error opening terminal: unknown.
  27. #5 2010-04-08 18:35:52
  28. Re: [solved] Error opening terminal: unknown.

Ошибка при запуске консольного редактора NANO

При попытке запуска редактора Nano выводится ошибка: Error opening terminal: Linux ( Linux — результат выполнения uname -s ). Я правильно понимаю, что это связано с виртуальными консолями ( tty ? ). В настоящее время пытаюсь разобраться с этими самыми tty. Помогите кто чем может 🙁

нет, не спасет. Система самосборная: имеется ядро, загрузчик, bash, минимум окружения, сеть

>Я правильно понимаю, что это связано с виртуальными консолями ( tty ? ).

Т.е. с кривыми руками

собирали с чем? ncurses или termcap ?
/usr/share/terminfo
должно содержать базу по терминалам

nano-2.2.5 собирался с опциями по-умолчанию из-под openSUSE 2.6.31.5-0.1: ./configure —prefix= затем make install DESTDIR=.

В новую систему ни ncurses ни termcap не интегрировались.

$ ldd `which nano`
linux-gate.so.1 => (0xb7712000)
libncursesw.so.5 => /lib/libncursesw.so.5 (0xb76a2000)
libc.so.6 => /lib/libc.so.6 (0xb7526000)
libdl.so.2 => /lib/libdl.so.2 (0xb7521000)
/lib/ld-linux.so.2 (0xb7713000)

для ncurses например

ncurses включает собственную базу termcap

$ strace -fv -o /tmp/strace.log nano
sylvia@allure:

$ cat /tmp/strace.log |grep open
27753 open(«/etc/ld.so.cache», O_RDONLY) = 3
27753 open(«/lib/libncursesw.so.5», O_RDONLY) = 3
27753 open(«/lib/libc.so.6», O_RDONLY) = 3
27753 open(«/lib/libdl.so.2», O_RDONLY) = 3
27753 open(«/usr/lib/locale/locale-archive», O_RDONLY|O_LARGEFILE) = 3
27753 open(«/etc/nanorc», O_RDONLY|O_LARGEFILE) = 3
27753 open(«/home/sylvia/.nanorc», O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
27753 open(«/etc/terminfo/x/xterm», O_RDONLY|O_LARGEFILE) = 3
27753 open(«/usr/lib/gconv/gconv-modules.cache», O_RDONLY) = -1 ENOENT (No such file or directory)
27753 open(«/usr/lib/gconv/gconv-modules», O_RDONLY) = 3

сами смотрите, была открыта база termcap /etc/terminfo/x/xterm

для консоли будет /etc/terminfo/l/linux

можно задавать тип терминала в переменной TERM

Источник

Error opening terminal when running IFL, TBIView, or OSD Tool Script from Linux Distribution

Important Note (updated 12/7/10):

The problem described below has been resolved, and can now be fixed by just updating to the latest version of the product in question (IFL, TBIView, OSD Tool Suite, etc.)

Problem:

Image for Linux (IFL), TBIView, or the OSD Tool Script will not run on a Linux distribution, producing an error message similar to the following:

Error opening terminal: linux

Note that depending on what type of terminal is in use, the terminal type in the error message may also be xterm, Eterm, rxvt, or any other terminal type being used. Also note that this problem will only occur when attempting to run IFL, TBIView, or the OSD Tool Script from a Linux distribution. It will not occur when running these programs from the IFL Boot Disk.

Cause:

Starting with the Debian «Squeeze» version of the Debian distribution, as well as some other Debian-based Linux distributions, several symlinks have been removed from the /usr/share/terminfo directory. This causes the affected programs to not be able to find the specific terminfo file they need to open a terminal (such as linux, xterm, Eterm, rxvt, dumb, etc.). This results in the error message shown above, and the affected programs will not be able to run.

Solution:

As root, create a new symlink by using the sequence of commands shown below for the specific terminal type shown in the error message. Note that there are 3 commands for each terminal type, and they should be executed in the order shown below.

1. For error message «Error opening terminal: linux»

mkdir -p /usr/share/terminfo/l

ln -s /lib/terminfo/l/linux linux

2. For error message «Error opening terminal: xterm»

mkdir -p /usr/share/terminfo/x

ln -s /lib/terminfo/x/xterm xterm

3. For error message «Error opening terminal: rxvt»

mkdir -p /usr/share/terminfo/r

ln -s /lib/terminfo/r/rxvt rxvt

4. For error message «Error opening terminal: dumb»

mkdir -p /usr/share/terminfo/d

ln -s /lib/terminfo/d/dumb dumb

5. For error message «Error opening terminal: Eterm»

mkdir -p /usr/share/terminfo/E

ln -s /lib/terminfo/E/Eterm Eterm

September 1, 2010 Updated: September 9, 2021

Источник

Thread: Error opening terminal: xterm.

Thread Tools
Display

Error opening terminal: xterm.

When i type «nano» into the terminal I receive the following message:
Error opening terminal: xterm.

Typing «top» will give this message:
‘xterm’: unknown terminal type.

Word wrap is not working when I push backspace on a multi-line command.

Ctrl+Alt+F6 -> commands work fine.
xterm works fine.
Have tried creating a new user but it has the same problem.
Tried what was suggested here but it doesn’t help.

Any other suggestions out there?

Re: Error opening terminal: xterm.

Not all that familiar with the Unity system, but in Systems > Settings > Preferences, which terminal is set as preferred?

Re: Error opening terminal: xterm.

Just adding to the list of symptoms. When typing «man » The following message will be shown «WARNING: terminal is not fully functional»

I found this command to find out which terminal is preferred:
-ubuntu:

$ gsettings get org.gnome.desktop.default-applications.terminal exec
‘x-terminal-emulator’

Edit: I just changed it to xterm and was about to say I’m happy with that. but It’s hard to copy and paste things to xterm

Last edited by philip10; April 12th, 2015 at 01:45 AM .

Re: Error opening terminal: xterm.

Try my favorite: the Xfce terminal. Copy-paste is easy, lot of customizing options.

Re: Error opening terminal: xterm.

I installed and opened xfce terminal
sudo apt-get install xfce4-terminal

xfce4-terminal
Failed to connect to session manager: Failed to connect to the session manager: SESSION_MANAGER environment variable not defined

xfce4-terminal still opens up but it suffers from the same problems as x-terminal-emulator

Re: Error opening terminal: xterm.

Could you open a terminal run these commands, and post back the results (you can copy/paste the text)?

Источник

[Solved-5 Solutions] nano error: Error opening terminal: xterm-256color

Error Description:

nano error: Error opening terminal: xterm-256color

Solution 1:

  • It seems like we have a problem with the terminal definition.
  • Try using xterm instead of xterm-256color
click below button to copy the code. By — nano tutorial — team
  • or the following terminal setting:
click below button to copy the code. By — nano tutorial — team
  • Also, if we still have problem with nano try using vi which is a simple editor and doesn’t required much from the terminal
click below button to copy the code. By — nano tutorial — team

Solution 2:

click below button to copy the code. By — nano tutorial — team
  • Now we should be able to run x-terminal-emulator or gnome-terminal-emulator and everything should work fine.
  • we are not sure if this is just me but if we press ctrl+alt+T and are confronted with the wrong terminal, just open system settings -> keyboard -> shortcuts -> create a custom shortcut with our preferred terminal on ctrl+alt+t. This will override the system shortcut.

Solution 3:

  • After upgrading to OSX Lion, we started getting this error on certain (Debian/Ubuntu) servers.
  • The fix is simply to install the “ncurses-term” package which provides the file /usr/share/terminfo/x/xterm-256color.
  • This worked for us on a Ubuntu server

Solution 4:

  • The problem can be solved in this way:
  • Download Lion Installer from the App Store
  • Download unpkg:
  • Open Lion Installer app in Finder (Right click -> Show Package Contents)
  • Open InstallESD.dmg (under SharedSupport)
  • Unpack BSD.pkg with unpkg (Located under Packages) Term info will be located in the new BSD folder in /usr/share/terminfo

Solution 5:

  • We can confirm this is a terminfo issue. This is what worked for us.
  • SSH in to the remote machine and run
click below button to copy the code. By — nano tutorial — team

Learn nano — nano tutorial — nano error opening terminal — nano examples — nano programs

World’s No 1 Animated self learning Website with Informative tutorials explaining the code and the choices behind it all.

Источник

Arch Linux

You are not logged in.

#1 2010-04-08 04:52:01

[solved] Error opening terminal: unknown.

What’s going on here? I’ve updated my system a few times, but that’s it. My headless server is doing this too.

Last edited by synthead (2010-04-08 20:35:12)

#2 2010-04-08 05:55:53

Re: [solved] Error opening terminal: unknown.

what $TERM are you trying to run htop in?

Edit:
I’ve got to sleep but here are some ideas that occur to me (htop is working fine on my box), but maybe:

1) TERM isn’t set or is set to term type that htop can’t deal with, htop should be able to deal with «TERM=xterm», also I know it handles «linux» and «screen.linux», because I just started htop in each of those settings.

2) Permissions on the /dev if you’re trying to run htop from a tty, various problems with allocating terminals can occur if something screwy happens, like you mount / read-only, is / mounted read-only?

Last edited by pseudonomous (2010-04-08 06:02:16)

#3 2010-04-08 12:05:31

Re: [solved] Error opening terminal: unknown.

This is from XFCE’s terminal. If I run xterm and run htop out of it, it works. htop isn’t the only app that is complaining about the terminal right now though

Last edited by synthead (2010-04-08 12:05:58)

#4 2010-04-08 12:11:10

Re: [solved] Error opening terminal: unknown.

in /etc/profile
(install xterm again)

logout , login and try again . hmm

#5 2010-04-08 18:35:52

Re: [solved] Error opening terminal: unknown.

It looks like your «TERM» environment variable isn’t getting set, since it’s getting set when you run xterm, it may be a configuration issue with xfce-terminal, xfce-terminal probably has a configuration option to identify as certain terminal type, you should probably set it to «xterm».

Otherwise, you can manually set TERM in

/.bashrc or /etc/bash.bashrc but this might cause you problems if you vt switch and run programs from the console.

Edit, also, you should do this in xfce-terminal and make sure things work afterwards:

Last edited by pseudonomous (2010-04-08 18:37:20)

Источник

Состояние перевода: На этой странице представлен перевод статьи OpenSSH. Дата последней синхронизации: 11 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

OpenSSH (OpenBSD Secure Shell) — набор программ, предоставляющих шифрование сеансов связи в компьютерных сетях по протоколу SSH (Secure Shell). OpenSSH разработан в рамках возглавляемого Тео де Раадтом (Theo de Raadt) проекта OpenBSD как открытая альтернатива проприетарному Secure Shell компании SSH Communications Security.

OpenSSH иногда путают с OpenSSL; они разрабатываются разными командами и имеют различное назначение. Определённая схожесть в названиях возникла из-за приверженности обоих проектов принципам открытого программного обеспечения (open software).

Установка

Установите пакет openssh.

Клиент

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

$ ssh -p порт пользователь@адрес-сервера

Если на сервере разрешена аутентификация только по открытому ключу, см. Ключи SSH.

Настройка

Настройки клиента делятся на две категории: общие для всех исходящих соединений и относящиеся к соединениям только с определёнными хостами. Например:

~/.ssh/config
# глобальные настройки
User пользователь

# настройки отдельного хоста
Host мой-сервер
    HostName адрес-сервера
    Port     порт

С такими настройками следующие команды будут иметь одинаковый эффект:

$ ssh -p порт пользователь@адрес-сервера
$ ssh мой-сервер

Подробнее см. руководство ssh_config(5).

Некоторые настройки не имеют флагов-аналогов для командной строки, но можно указать необходимые опции с помощью флага -o. Например, -oKexAlgorithms=+diffie-hellman-group1-sha1.

Сервер

sshd — демон сервера OpenSSH, который управляется службой sshd.service в соответствии с настройками в файле /etc/ssh/sshd_config. Если вы собираетесь изменить настройки, то стоит сначала запустить sshd в тестовом режиме, чтобы убедиться, что демон запустится без проблем. Отсутствие вывода означает рабочую конфигурацию.

# sshd -t

Настройка

Чтобы изменить настройки, нужно отредактировать/добавить нужные строки в файле настроек, например:

Предоставить доступ отдельным пользователям:

AllowUsers    пользователь1 пользователь2

Предоставить доступ группам пользователей:

AllowGroups   группа1 группа2

Параметр Banner позволяет настроить приветственное сообщение (например, сохранённое в файле /etc/issue):

Banner /etc/issue

Пары открытых и закрытых ключей генерируются службой sshdgenkeys и сохраняются в файле /etc/ssh. Если какие-то ключи отсустствуют, то они создаются заново, даже если опция HostKeyAlgorithms в файле sshd_config разрешает не все алгоритмы шифрования. Всего создаётся четыре пары ключей на основе алгоритмов dsa, rsa, ecdsa и ed25519. Чтобы sshd мог использовать конкретный ключ, укажите следующую опцию:

HostKey /etc/ssh/ssh_host_rsa_key

Если сервер находится в глобальной (WAN) сети, рекомендуется также сменить порт со стандартного 22 на случайное значение, например:

Port 39901

Совет:

  • Альтернативный порт лучше выбирать из числа не занятых другими службами. Инфомацию о портах можно найти в файле /etc/services, а также в статье Список портов TCP и UDP. Смена порта снизит количество попыток входа, выполняемых автоматизированными сканерами и скриптами, которые обычно ожидают SSH-соединение на порте 22. Чтобы полностью исключить такие попытки, можно настроить port knocking.
  • В целях безопасности рекомендуется полностью отключить вход по паролю. Другие полезные способы повышения защищённости SSH-соединения описаны в разделе #Безопасность.
  • OpenSSH может прослушивать несколько портов одновременно. Для этого укажите несколько параметров Port номер-порта в файле настроек.
  • Можно сгенерировать новые пары ключей в дополнение (или взамен) к тем, которые были созданы изначально. Удалите ненужные пары ключей из файлов в каталоге /etc/ssh, после чего выполните команду ssh-keygen -A с правами root.

Управление демоном

Запустите/включите службу sshd.service. Демон SSH будет работать в фоновом режиме и выполнять форк (fork) для каждого входящего соединения [1].

Примечание: sshd.socket был удалён из openssh в версии 8.0p1-3. Он использовал активацию сокета systemd, вследствие чего оказался уязвим к DoS-атакам (см. FS#62248). Если sshd.socket будет включён во время обновления до openssh 8.0p1-3, то юниты sshd.socket и sshd@.service будут скопированы в каталог /etc/systed/system и включены заново. Это сделано с единственной целью — не поломать существующие конфигурации, в остальном же рекомендуется перейти на использование sshd.service.

Важно: Если вы продолжаете использовать sshd.socket, обратите внимание на следующие моменты:

  • Юнит sshd.socket может внезапно прекратить работу (например, из-за исчерпания свободной памяти), а опцию Restart=always для юнитов сокетов задать нельзя [2].
  • Использовании активации сокета может привести к отказу в обслуживании (denial of service), если слишком большое количество соединений приведёт к невозможности новых запусков службы (см. FS#62248).

Примечание: Для sshd.socket нельзя задать параметр ListenAddress, поэтому будут разрешены соединения с любых адресов. Для создания аналогичной ListenAddress настройки отредактируйте файл sshd.socket, указав порт и IP-адрес в параметре ListenStream (например, ListenStream=192.168.1.100:22). Также нужно добавить параметр FreeBind=true в раздел [Socket], иначе проявится та же проблема, что и при задании ListenAddress: если сеть не успела вовремя включиться, сокет не запустится.

Совет: При использовании активации сокета для каждого соединения создаётся временный экземпляр sshd@.service (каждый со своим названием). Следовательно, ни sshd.socket, ни обычный sshd.service не будут логировать попытки установления соединения. Логи экземпляров сокетов можно просматривать командами journalctl -u "sshd@*" и journalctl /usr/bin/sshd с правами root.

Безопасность

Удалённый вход в систему через SSH удобен для осуществления административных задач, но представляет определённую проблему с точки зрения безопаности. SSH часто подвергается атакам полным перебором и нуждается в соответствующей конфигурации, чтобы не дать посторонним войти в систему.

ssh-audit предлагает автоматизированный анализ серверных и клиентских настроек. Следующие статьи и инструменты могут также быть полезными:

  • Статья Mozilla Infosec Team
  • Утилита ssh_scan
  • SSH Hardening Guides

Вход только по открытому ключу

Если клиент не может выполнить вход по открытому ключу, SSH-сервер по умолчанию предоставляет возможность аутентификации по паролю. Это позволяет злоумышленнику получить доступ с помощью полного перебора паролей. Самый надёжный способ защиты от такой атаки — полностью отключить вход по паролю и оставить только аутентификацию с помощью ключей SSH. Для этого нужно отключить следующую опцию в файле настроек демона:

/etc/ssh/sshd_config
PasswordAuthentication no

Важно: Перед заданием этой настройки следует убедиться, что аутентификация по открытому ключу включена для всех аккаунтов, которым может потребоваться SSH-доступ. Для этого используются файлы authorized_keys. Подробнее см. SSH keys#Copying the public key to the remote server.

Двухфакторная аутентификация и открытые ключи

С помощью опции AuthenticationMethods можно настроить использование различных способов аутентификации, например, применение открытых ключей совместно с двухфакторной аутентификацией.

Программы аутентификации

В статье Google Authenticator описана настройка Google Authenticator.

Для Duo установите duo_unixAUR, в котором есть полная поддержка модуля pam_duo.so. Подробнее о настройке параметров доступа (Integration Key, Secret Key, API Hostname) см. документацию Duo Unix.

Настройка PAM

Для использования PAM с OpenSSH, отредактируйте следующий файл:

/etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey keyboard-interactive:pam

После этого можно будет выполнять вход в систему или по открытому ключу, или в соответствии настройками аутентификации PAM.

Наоборот, если вы хотите настроить вход по открытому ключу и через PAM, используйте в качестве разделителя AuthenticationMethods запятую, а не пробел:

/etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive:pam

При входе по ключу и PAM аутентификацию по паролю можно отключить:

/etc/pam.d/sshd
#отключение удалённного root
auth      required  pam_securetty.so

#требуется google authenticator
auth      required  pam_google_authenticator.so

#но пароль не нужен
#auth      include   system-remote-login
account   include   system-remote-login
password  include   system-remote-login
session   include   system-remote-login

Защита от атак полным перебором

Принцип атаки полным перебором прост: атакующий многократно пытается выполнить вход на страницу или веб-сервер, используя большое количество случайных комбинаций имён пользователей и паролей.

Подробнее см. ufw#Rate limiting with ufw и Настройка межсетевого экрана#Атака полным перебором в случае экрана iptables

Кроме того, программы вроде fail2ban или sshguard помогают защититься от атак перебором, блокируя попытки подбора паролей.

  • Разрешайте входящие SSH-соединения только для доверенных адресов
  • Используйте fail2ban или sshguard для автоматической блокировки IP-адресов, которые провалили попытку аутентификации слишком много раз.
  • Используйте pam_shield для блокировки IP-адресов, которые выполняют слишком большое количество попыток входа за определённый период времени. В отличие от fail2ban и sshguard, pam_shield не различает успешными и неудачными попытками входа.

Ограничение входа от имени суперпользователя

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

Reason: В текущей версии OpenSSH вход от root отключён по умолчанию. Некоторые части этого раздела могут быть избыточны.
(Discuss in Talk:OpenSSH (Русский))

Предоставление возможности входа через SSH от имени суперпользователя без какой-либо защиты считается плохой практикой. Существует два способа ограничения этой возможности для повышения безопасности.

Отключение

Утилита sudo выборочно предоставляет права суперпользователя для действий, которым они необходимы, без входа в учётную запись root. Благодаря этому можно заблокировать аккаунт root, чтобы отключить возможность входа в него через SSH. Это потенциально является средством защиты от атак перебором, поскольку атакующему придётся подбирать ещё и имя учётной записи в дополнение к паролю.

Чтобы отключить вход от имени суперпользователя через SSH, получите его права и отредактируйте секцию «Authentication» файла /etc/ssh/sshd_config. Просто измените значение #PermitRootLogin yes на no и раскомментируйте строку:

/etc/ssh/sshd_config
PermitRootLogin no
...

Перезапустите демон SSH.

Теперь вы не сможете войти в систему через SSH от имени суперпользователя, но по-прежнему будете иметь возможность входить от имени обычного пользователя и использовать команды su и sudo для администрирования.

Ограничение

Некоторые автоматические задачи, вроде удалённого резервного копирования системы, требуют полного root-доступа. Чтобы иметь возможность безопасно его использовать, вместо отключения укажите конкретные команды. Для этого отредактируйте файл ~root/.ssh/authorized_keys, создав префиксы для соответствующих ключей, например:

command="/usr/lib/rsync/rrsync -ro /" ssh-rsa …

Теперь при входе с использованием соответствующего ключа пользователь получит права root, но сможет выполнять только те команды, которые перечислены между кавычками.

При этом остаётся возможность входа в систему с использованием имени суперпользователя. Это можно исправить, добавив следующую строку в файл sshd_config:

PermitRootLogin forced-commands-only

Это не только ограничит список команд, которые могут выполняться через SSH от имени суперпользователя, но и отключит использование паролей, оставляя возможность входа в root-аккаунт только по ключу.

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

PermitRootLogin prohibit-password

Для дополнительной защиты можно запретить пользователям добавлять новые открытые ключи, по которым можно будет выполнить соединение.

Задайте файлу authorized_keys права только на чтение для владельца и отключите остальные:

$ chmod 400 ~/.ssh/authorized_keys

Чтобы не позволить пользователям вернуть разрешения, установите бит неизменяемости на файл authorized_keys. После этого пользователь может попытаться перемеименовать каталог ~/.ssh и создать новый каталог с таким же именем и файлом authorized_keys. Чтобы не дать ему это сделать, установите бит неизменяемости и на каталог ~/.ssh.

Примечание: Если понадобится добавить новый ключ, то придётся удалить бит неизменяемости файла authorized_keys и дать ему права на запись. В конце нужно будет вернуть настройки обратно.

Советы и рекомендации

Шифрованный туннель SOCKS

Эта возможность будет полезна для обладателей ноутбуков, которые часто подключаются к небезопасным беспроводным сетям в общественных местах. Для создания туннеля необходимо предварительно запустить сервер SSH в каком-нибудь безопасном месте, например, дома или на работе. Также будет весьма кстати какая-нибудь служба динамического DNS вроде DynDNS, которая избавит вас от необходимости запоминать IP-адрес.

Шаг 1: установить соединение

Для установления соединения необходимо лишь выполнить команду:

$ ssh -TND 4711 пользователь@хост

где пользователь — ваше имя пользователя на сервере SSH, работающием на машине хост. Сервер запросит пароль, после чего будет установлено соединение. Флаг N отключает интерактивное приглашение командной строки, а флаг D позволяет пользователю выбрать локальный порт для прослушивания. Флаг T означает, что сервер не станет выделять псевдо-терминал для данного соединения.

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

Шаг 2 (вариант А): настроить браузер (или другие программы)

Чтобы установленное соединение (см. выше) было хоть как-то полезно, нужно настроить браузер и другие программы на использование туннеля SOCKS. В настоящее время SSH поддерживает как SOCKSv4, так и SOCKSv5, вы можете выбрать любой из них.

  • Для Firefox: Preferences > General > Settings…. В открывшемся окне выберите пункт Manual proxy configuration, введите localhost в поле SOCKS host и номер порта в поле Port (4711 для примера выше).
DNS-запросы Firefox автоматически посылаться через туннель не будут, что представляет собой некоторую уязвимость с точки зрения приватности. Чтобы это исправить, также выберите пункт Proxy DNS when using SOCKS v5. Очевидно, что это будет работать, только если вы выбрали пятую версию протокола SOCKS, а не четвёртую.
Перезапустите Firefox, чтобы настройки заработали.
  • Для Chromium: SOCKS можно настроить через переменные окружения или опции командной строки. Например, выберите одну из следующих функций и добавьте её в файл .bashrc:
function secure_chromium {
    port=4711
    export SOCKS_SERVER=localhost:$port
    export SOCKS_VERSION=5
    chromium &
    exit
}

или

function secure_chromium {
    port=4711
    chromium --proxy-server="socks://localhost:$port" &
    exit
}

Теперь откройте терминал, выполните

$ secure_chromium

и наслаждайтесь защищённым туннелем!

Шаг 2 (вариант Б): настроить TUN-интерфейс

Этот вариант выглядит несколько более запутанным по сравнению с предыдущим, но зато вам не придётся настраивать работу через SOCKS-прокси для каждого приложения по отдельности. Данное решение подразумевает настройку локального TUN-интерфейса и перенаправление всего трафика на него.

Подробнее см. VPN over SSH#Set up badvpn and tunnel interface.

Проброс X11

Проброс Х11 — механизм, который позволяет графическим интерфейсам программ удаленной машины-сервера отображаться на локальной машине-клиенте. При этом нет необходимости устанавливать на удаленном узле всю систему Х11, но надо установить хотя бы xauth. xauth — утилита, которая поддерживает конфигурации Xauthority, используемые сервером и клиентом для аутентификации сессии X11 [3].

Настройка

На удалённой системе:

  • Установите пакеты xorg-xauth и xorg-xhost;
  • В файле /etc/ssh/sshd_config:
    • Задайте для опции X11Forwarding значение yes;
    • Убедитесь, что заданы значения AllowTcpForwarding yes, X11UseLocalhost yes и X11DisplayOffset 10 (значения по умолчанию, если ничего не менялось, см. sshd_config(5));
  • Перезапустите службу sshd.

На клиенте:

  • Установите пакет xorg-xauth;
  • включите опцию ForwardX11 либо добавив флаг -X в командной строке, либо задав в файле настроек клиента параметр ForwardX11 yes.

Совет: Если графический интерфейс отображается плохо или вы получаете сообщения об ошибках, включите опцию ForwardX11Trusted (в командной строке это флаг -Y). Это предотвратит управление пробросом Х11 со стороны расширения безопасности X11. Если вы будете использовать эту опцию, обязательно прочитайте предупреждение в начале этого раздела

Использование

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Выполните удалённый вход как обычно, добавив флаг -X, если опция ForwardX11 не включена в конфигурационном файле клиента:

$ ssh -X пользователь@хост

Если вы получаете ошибки при запуске графических приложений, попробуйте опцию ForwardX11Trusted:

$ ssh -Y пользователь@хост

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

$ xclock

Если вы получите ошибки «Cannot open display», попробуйте выполнить следующую команду от имени обычного пользователя:

$ xhost +

эта команда позволит выполнять проброс приложений X11 любому пользователю. Чтобы ограничить проброс конкретным хостом:

$ xhost +имя-хоста

где имя-хоста — это имя конкретного хоста. Подробнее см. xhost(1).

Будьте осторожны с некоторыми приложениями, так как они могут проверять локальную машину на предмет уже работающего приложения. Один из примеров — Firefox: либо закройте работающий Firefox, либо используйте следующий параметр запуска:

$ firefox --no-remote

Если вы получите ошибку X11 forwarding request failed on channel 0 при подключении (и лог-файл сервера /var/log/errors.log будет содержать строку Failed to allocate internet-domain X11 display socket), удостоверьтесь, что пакет xorg-xauth установлен. Если его установка не поможет, попробуйте сделать одно из двух:

  • Включить опцию AddressFamily any в файле sshd_config на сервере;
  • Задать опции AddressFamily в sshd_config на сервере значение inet. Присвоение значения inet может исправить проблемы с клиентами Ubuntu при использовании IPv4.

Для запуска приложений X от имени других пользователей на сервере SSH вам необходимо добавить (команда xauth add) строку аутентификации, взятую из вывода команды xauth list пользователя, вошедшего в систему.

Совет: Полезные ссылки при решении проблем с пробросом X11: [4], [5], [6].

Проброс других портов

В дополнение к встроенной поддержке SSH X11 также можно установить безопасный туннель для любого соединения TCP с использованием локального или удаленного проброса.

Локальный проброс открывает на локальной машине порт, подключения к которому будут перенаправлены на удаленный хост, а оттуда — по заданному направлению. Очень часто этим направлением будет сам удаленный хост, предоставляющий secure shell и, например, безопасное соединение VNC для этой же машины. Локальный проброс осуществляется при помощи ключа -L и задания спецификации проброса в следующей форме: <порт туннеля>:<адрес назначения>:<порт назначения>.

Например:

$ ssh -L 1000:mail.google.com:25 192.168.0.100

будет использовать SSH для входа в систему и открытия шелла на 192.168.0.100, а также создаст туннель от порта 1000 локальной машины на порт 25 mail.google.com. В результате подключения к localhost:1000 будут перенаправлены на порт Gmail SMTP. Для Google всё будет выглядеть так, будто соединение (но вовсе не обязательно — передаваемые по нему данные) исходит от 192.168.0.100; данные будут в безопасности между локальной машиной и 192.168.0.100, но не между 192.168.0.100 и Google, если не предпринять дополнительных мер.

Также:

$ ssh -L 2000:192.168.0.100:6001 192.168.0.100

будет принимать подключения к localhost:2000, которые будут перенаправлены на порт 6001 удаленного хоста. Этот пример хорош для VNC-соединений с помощью утилиты vncserver. Утилита входит в пакет TigerVNC, и, несмотря на очевидную полезность, имеет некоторые проблемы с безопасностью.

Удаленный проброс позволяет удаленному хосту подключаться к произвольному хосту через туннель SSH и локальную машину, предоставляя функционал, обратный локальному пробросу. Это полезно в ситуациях, когда, например, удаленный хост ограничен фаерволлом. Он включается ключом -R и заданием спецификаций проброса в следующей форме: <порт туннеля>:<адрес назначения>:<порт назначения>.

Например:

$ ssh -R 3000:irc.libera.chat:6667 192.168.0.200

поднимет шелл на 192.168.0.200, и соединения из 192.168.0.200 к своему же порту 3000 (т.е. localhost:3000 удалённого хоста) будут посланы через туннель на локальную машину, а затем на irc.libera.chat, порт 6667, что в данном примере позволит использовать программы IRC на удаленном хосте, даже если обычно порт 6667 будет для них заблокирован.

Оба вида проброса могут быть использованы для предоставления безопасного «шлюза», позволяющего другим компьютерам получить преимущества туннеля SSH без непосредственно работающего SSH или демона SSH, при использовании bind-адреса в начале туннеля как части спецификации проброса, например, <адрес туннеля>:<порт туннеля>:<адрес назначения>:<порт назначения>. <адрес туннеля> может быть любым адресом на машине, localhost, * (или blank), который, соответственно, пропускает соединения через заданный адрес, интерфейс loopback или любой интерфейс. По умолчанию проброс ограничен соединениями от машины в начале туннеля, <адрес туннеля> установлен в localhost. Локальный проброс не требует дополнительной настройки, в то время как удаленный проброс ограничен конфигурацией демона SSH удаленного сервера. Смотрите описание опции GatewayPorts на справочной странице sshd_config(5) и опции -L address в руководстве ssh(1) для получения дополнительной информации.

Jump-хост

Может случиться так, что у вас не будет возможности установить связь с удалённой машиной напрямую. В этом случае используется jump-сервер или узел-бастион. Следовательно, необходимо соединить два или более SSH-туннеля в цепочку. Разумеется, ваши ключи должны позволять выполнить авторизацию на каждом из серверов в цепи. Для этого SSH запускается с опциями пересылки аутентификационных данных (-A) и выделения псевдотерминала (-t):

$ ssh -A -t -l пользователь1 бастион1 
  ssh -A -t -l пользователь2 промежуточный-узел2 
  ssh -A -t -l пользователь3 целевой-узел

Несколько проще то же самое можно сделать с флагом -J:

$ ssh -J пользователь1@бастион1,пользователь2@промежуточный-узел2 пользователь3@целевой-узел

Промежуточные хосты в директиве -J разделяются запятыми и располагаются в порядке установления соединения. Часть пользователь...@ необязательна. При работе с опцией -J используется стандартный файл настроек SSH, поэтому при необходимости в нём можно указать настройки соединения для каждого хоста в отдельности.

Опция ProxyJump в файле настроек эквивалентyна флагу командной строки -J, см. ssh_config(5).

Обратный SSH через промежуточный узел

Tango-edit-clear.pngThis article or section needs language, wiki syntax or style improvements. See Help:Style for reference.Tango-edit-clear.png

Reason: SSH-туннелирование давно известно, поэтому неплохо было бы добавить несколько ссылок с подробным описанием. Например, [7], где рассмотрены и некоторые другие варианты.
(Discuss in Talk:OpenSSH (Русский))

Идея заключается в том, чтобы подключиться к серверу через промежуточный узел, причём сервер соединяется с этим узлом через обратный SSH-туннель. Например, это может быть полезно, когда сервер находится за NAT, а промежуточный узел представляет собой публичный SSH-сервер, используемый в качестве прокси. При этом:

  • у клиента должны быть ключи для авторизации и на промежуточном узле, и на целевом сервере;
  • у сервера должны быть ключи дла авторизации на промежуточном узле.

Ниже приведён пример настройки соединения через промежуточный узел. Предполагается, что пользователь1 — аккаунт на клиентской машине, пользователь2 — на промежуточном узле и пользователь3 — на сервере. Сначала необходимо создать обратный туннель:

ssh -R 2222:localhost:22 -N пользователь2@промежуточный-узел

Это действие можно автоматизировать с помощью скрипта, службы systemd или autossh.

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Объяснить, почему недостаточно команды ssh user3@relay -p 2222.
(Discuss in Talk:OpenSSH (Русский))

Соединение со стороны клиента устанавливается командой:

ssh -t пользователь1@промежуточный-узел ssh пользователь3@localhost -p 2222

Удалённую команду для создания соединения с обратным туннелем можно добавить в файл ~/.ssh/authorized_keys на промежуточном узле. Для этого воспользуйтесь полем command:

command="ssh пользователь3@localhost -p 2222" ssh-rsa KEY2 пользователь1@клиент

Тогда установить соединение можно командой:

ssh пользователь2@промежуточный-узел

Обратите внимание, что функция автодополнения SCP в терминале клиента работать не будет, а на некоторых конфигурациях не будет работать и сама передача данных по протоколу SCP.

Мультиплексирование

Демон SSH обычно прослушивает порт 22. Однако трафик, который адресован не на стандартные порты HTTP/S (80 и 443 соответственно), на публичных серверах часто блокируется. Следовательно, в таком случае SSH-соединение невозможно. В качестве возможного решения можно указать демону sshd прослушивать один из портов в белом списке:

/etc/ssh/sshd_config
Port 22
Port 443

Поскольку порт 443 уже прослушивается веб-сервером в ожидании HTTPS-пакетов, в данном случае имеет смысл воспользоваться мультиплексором вроде sslh. Он будет прослушивать мультиплексированный порт и переадресовывать пакеты разным сервисам в зависимости от их назначения.

Увеличение скорости SSH

Среди настроек клиента есть некоторые, которые позволяют увеличить скорость соединения либо глобально, либо для отдельных хостов. Полное описание этих опций можно найти в руководстве ssh_config(5).

  • Используйте быстрый алгоритм шифрования: в современных процессорах с инструкциями AESNI алгоритмы aes128-gcm@openssh.com и aes256-gcm@openssh.com гораздо более производительны, чем стандартный алгоритм OpenSSH, chacha20-poly1305@openssh.com. Выбрать алгоритм можно флагом -c. Чтобы сделать изменения постоянными, добавьте пункт Ciphers в файл ~/.ssh/config, перечислив алгоритмы в порядке уменьшения предпочтительности, например:
    Ciphers aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
  • Включите или выключите сжатие: сжатие может увеличить скорость для медленных соединений, оно включается параметром Compression yes или флагом -C. Однако в качестве алгоритма сжатия используется относительно медленный gzip(1), который в быстрых сетях становится узким местом. Поэтому в локальных и быстрых сетях лучше отключить сжатие параметром Compression no.
  • Объединение соединений: в случае нескольких одновременных сессий к одному хосту можно объединить их в одно соединение:
    ControlMaster auto
    ControlPersist yes
    ControlPath ~/.ssh/sockets/socket-%r@%h:%p
    
где вместо ~/.ssh/sockets можно использовать любой каталог без прав на запись для остальных пользователей.
  • Параметр ControlPersist позволяет задать время ожидания после момента разрыва исходного соединения. Возможны следующие значения:
    • no — соединение разрывается сразу же после отключения предыдущего клиента;
    • время ожидания в секундах;
    • yes — бесконечное ожидание, соединение автоматически разрываться не будет.
  • Время входа можно сократить, если пропустить поиск заголовков IPv6. Для этого используйте опции AddressFamily inet или флаг -4.
  • Наконец, если вы собираетесь использовать SSH для SFTP или SCP, High Performance SSH/SCP поможет значительно увеличить пропускную способность с помощью динамического изменения размера буфера SSH. Установите пакет openssh-hpn-gitAUR, чтобы использовать OpenSSH с этим расширением.

Монтирование удалённых файловых систем при помощи SSHFS

В статье SSHFS описано, как использовать SSH для монтирования удалённых файловых систем в локальный каталог, чтобы иметь возможность выполнять любые операции над смонтированными файлами (копирование, переименование, редактирование в vim и т.д.). Предпочтительнее использовать sshfs, а не shfs, поскольку последний не обновлялся с 2004 года.

Поддержание подключения

По умолчанию сеанс связи SSH автоматически разрывается, если соединение не использовалось в течение какого-то времени. Чтобы сохранить сеанс, клиент может посылать сигналы серверу, если не было получено никаких данных за последнее время, или наоборот, сервер может посылать сообщения через определённые временные интервалы, если он не получал данных от клиента.

  • На сервере параметр ClientAliveInterval задаёт время ожидания в секундах, по истечении которого при отсутствии данных от клиента sshd пошлёт последнему запрос. Значение по умолчанию — 0, «не посылать сообщений». Например, чтобы запрашивать ответ от клиента каждые 60 секунд, задайте параметр ClientAliveInterval 60 в настройках сервера. Также обратите внимание на параметры ClientAliveCountMax и TCPKeepAlive.
  • На клиенте параметр ServerAliveInterval задаёт временной промежуток между запросами на сервер. Например, чтобы посылать запросы каждые 120 секунд, задайте параметр ServerAliveInterval 120 в настройках клиента. Также обратите внимание на параметры ServerAliveCountMax и TCPKeepAlive.

Примечание: Чтобы сохранять соединение, достаточно настоить отправку запросов либо только на клиенте, либо только на сервере. Если вы под вашим управлением находится одновременно несколько серверов и клиентов, правильнее всего будет задать параметр ServerAliveInterval на клиентах, которым нужно сохранять сеансы, а настройки серверов и остальных клиентов оставить без изменений.

Автоматический перезапуск туннелей SSH с помощью systemd

systemd может автоматически создавать SSH-соединения при загрузке/входе в систему, а также перезапускать их при внезапном разрыве соединения.

Ниже представлен пример службы, которая будет создавать SSH-туннель в соответствии с настройками SSH. Если соединение было по какой-то причине разорвано, служба подождёт 10 секунд и перезапустит его:

~/.config/systemd/user/tunnel.service
[Unit]
Description=SSH tunnel to myserver

[Service]
Type=simple
Restart=always
RestartSec=10
ExecStart=/usr/bin/ssh -F %h/.ssh/config -N myserver

запустите/включите пользовательскую службу systemd. В разделе #Поддержание подключения описано, как предотвратить разрыв соединения из-за превышения времени ожидания. Если вы захотите запускать туннель при загрузке системы, то придётся переписать юнит, чтобы сделать его системным.

Autossh — автоматический перезапуск сессий и туннелей SSH

Если сессия или туннель не может поддерживаться в активном состоянии, например, из-за плохого подключения к сети и связанных с ним отключений, используйте autossh для автоматического перезапуска.

Примеры использования:

$ autossh -M 0 -o "ServerAliveInterval 45" -o "ServerAliveCountMax 2" имя_пользователя@example.com

Совместно с SSHFS:

$ sshfs -o reconnect,compression=yes,transform_symlinks,ServerAliveInterval=45,ServerAliveCountMax=2,ssh_command='autossh -M 0' имя_пользователя@example.com: /mnt/example

Подключение через SOCKS-прокси, сконфигурированный при помощи настроек proxy:

$ autossh -M 0 -o "ServerAliveInterval 45" -o "ServerAliveCountMax 2" -NCD 8080 имя_пользователя@example.com

При помощи опции -f autossh может быть запущен в качестве фонового процесса. Однако, в этом случае вы не сможете вводить пароль в интерактивном режиме.

Сессия будет завершена, как только вы введете команду exit, иначе процесс autossh получит сигнал SIGTERM, SIGINT или SIGKILL.

Автозапуск Autossh при загрузке системы при помощи systemd

Если вы хотите, чтобы autossh запускался автоматически, вы можете использовать systemd. Например, вы можете создать файл юнита, подобный этому:

/etc/systemd/system/autossh.service
[Unit]
Description=AutoSSH service for port 2222
After=network.target

[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -NL 2222:localhost:2222 -o TCPKeepAlive=yes foo@bar.com

[Install]
WantedBy=multi-user.target

Здесь AUTOSSH_GATETIME=0 — это переменная окружения, указывающая, как долго ssh должен быть поднят, прежде чем autossh утвердит успешное подключение. Установка значения 0 укажет autossh игнорировать неудачное подключение ssh. Это может быть полезно при добавлении autossh в автозагрузку. Другие переменные окружения доступны на справочной странице autossh(1). Конечно, вы можете сделать этот юнит более комплексным, если вам это необходимо (для получения дополнительных подробностей смотрите документацию systemd); очевидно, вы можете использовать ваши собственные опции для autossh, но учтите, что флаг -f, подразумевающий AUTOSSH_GATETIME=0, не работает с systemd.

Не забудьте запустить и/или включить службу.

Мы также можете отключить ControlMaster, например:

ExecStart=/usr/bin/autossh -M 0 -o ControlMaster=no -NL 2222:localhost:2222 -o TCPKeepAlive=yes foo@bar.com

Совет: Можно создать несколько процессов autossh, если нужно поддерживать несколько туннелей. Просто создайте нужное количество файлов служб с разными именами.

Альтернатива на случай невозможности запустить демон SSH

Для удалённых или headless-серверов, которые полагаются исключительно на SSH, сбой запуска демона SSH (например, после обновления системы) может означать невозможность осуществлять администрирование. Systemd в этом случае может помочь, если воспользоваться опцией OnFailure.

Предположим, что на сервере работает sshd, а качестве запасного варианта выбран telnet. Создайте файл, который показан ниже. Включать telnet.socket не надо!

/etc/systemd/system/sshd.service.d/override.conf
[Unit]
OnFailure=telnet.socket

Это всё. Telnet не будет работать, если запущен sshd. Если же sshd не запустится, то можно будет создать сеанс telnet для устранения неисправностей.

Настройка цвета фона терминала для удалённого хоста

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

К сожалению, это работает не для всех терминалов (только для Zsh).

Настройка для работы в конкретной сети

С помощью параметра Match exec можно создавать настройки хостов для работы в конктретных сетях.

Например, если используется nmcli и соединение настроено (вручную или с помощью DHCP) на использование search-domain:

Match exec "nmcli | grep domains: | grep example.com"
  CanonicalDomains example.com
  # Should you use a different username on this network
  #User username
  # Use a different known_hosts file (for private network or synchronisation)
  #UserKnownHostsFile <network>_known_hosts

Проверка ключей хостов в локальных сетях

У серверов, находящихся в разных приватных сетях, IP-адреса могут совпадать. Нужен какой-то способ их различать.

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: «Лучшее решение» не должно представлять собой совет воспользоваться чем-то другим.
(Discuss in Talk:OpenSSH (Русский))

Лучшим решением будет воспользоваться рекомендациями из раздела #Настройка для работы в конкретной сети и использовать разные параметры UserKnownHostsFile для разных сетей. Второй способ лучше использовать, если вы работаете в новых или экспериментальных сетях — просто игнорируйте ключи хостов (hostkeys) для приватных сетей:

Host 10.* 192.168.*.* 172.31.* 172.30.* 172.2?.* 172.1?.*
    # Disable HostKey verification
    # Trust HostKey automatically
    StrictHostKeyChecking no
    # Do not save the HostKey
    UserKnownHostsFile=/dev/null
    # Do not display: "Warning: Permanently Added ..."
    LogLevel Error

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: В файл known_hosts записывается IP-адрес даже в том случае, если вы используете имя хоста для доступа на сервер.
(Discuss in Talk:OpenSSH (Русский))

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

Выполнение команд во время входа

Если вы работаете в интерактивном сеансе, существует несколько способов выполнить команду при входе в систему:

  • отредактируйте файл authorized_keys на удалённом хосте (см. sshd(8) § AUTHORIZED_KEYS FILE FORMAT);
  • отредактируйте файл ~/.ssh/rc на удалённом хосте, если сервер работает с включённой опцией PermitUserRC;
  • отредактируйте файл настроек командной оболочки, например, .bashrc.

Проброс SSH-агента

Проброс SSH-агента позволяет использовать ваши локальные ключи при подключении к серверу. Рекомендуется включать проброс агента только для отдельных хостов.

~/.ssh/config
Host мойсервер.com
    ForwardAgent yes

После этого настройте агент SSH и добавьте ваши локальные ключи утилитой ssh-add.

Теперь после подключения к удалённому серверу вы сможете работать с другими службами с помощью локальных ключей.

Решение проблем

Проверка

Проверьте следующие моменты, прежде чем искать решение проблем.

  1. Каталог с настройками ~/.ssh и его содержимое должно быть доступно только пользователю (проверьте и клиент, и сервер), а также права на запись в домашнем каталоге должны быть только у пользователя:
    $ chmod go-w ~
    $ chmod 700 ~/.ssh
    $ chmod 600 ~/.ssh/*
    $ chown -R $USER ~/.ssh
    
  2. Убедитесь, что открытый ключ клиента (например, id_rsa.pub) указан в файле ~/.ssh/authorized_keys на сервере;
  3. Убедитесь, что вы не ограничили доступ через SSH параметрами AllowUsers и AllowGroups в настройках сервера;
  4. Проверьте, установил ли пользователь пароль. Иногда новые пользователи не устанавливают пароль до первого входа в систему;
  5. Добавьте параметр LogLevel DEBUG в файл /etc/ssh/sshd_config;
  6. Изучите вывод команды journalctl -xe (запускается с правами root) на предмет сообщений об ошибках;
  7. Перезапустите демон sshd и выполните выход/вход на клиенте и сервере.

Подключение отклонено или проблема тайм-аута

Проброс портов

Если ваша машина находится за NAT или маршрутизатором (скорее всего так и есть, если речь не идёт о VPS или хосте с публичным IP-адресом), убедитесь, что маршрутизатор пробрасывает входящие SSH-соединения на неё. Узнайте внутренний IP-адрес сервера командой ip addr и настройте маршрутизатор пробрасывать TCP на SSH-порт этого адреса. Подробности смотри на portforward.com.

SSH запущен и прослушивает?

Утилита ss покажет все процессы, прослушивающие TCP-порты:

$ ss --tcp --listening

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

Имеются ли правила фаервола, блокирующие соединения?

Iptables может блокировать подключения к порту 22. Проверьте это следующей командой:

# iptables -nvL

Просмотрите вывод на предмет правил, которые могут блокировать нужные вам пакеты (цепочка INPUT). Затем, если необходимо, разблокируйте порт командой вида:

# iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

Информацию по настройке межсетевых экранов можно найти в разделе Файрвол.

Трафик доходит до вашего компьютера?

Запустите дамп трафика на компьютере, с которым возникли проблемы:

# tcpdump -lnn -i any port ssh and tcp-syn

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

Ваш провайдер или кто-то еще блокирует нужный порт?

Примечание: Пробуйте этот шаг в том случае, если вы знаете, что у вас не запущено никаких фаерволлов, и что вы настроили роутер на DMZ или проброс портов на компьютер. Здесь вы найдете рекомендации по диагностике и возможные решения.

В некоторых случаях провайдер может блокировать порт по умолчанию (SSH порт 22). Чтобы это проверить, создайте сервер на всех интерфейсах (0.0.0.0) и подключитесь удаленно.

Если вы получите сообщение об ошибке вроде этого:

ssh: connect to host www.inet.hr port 22: Connection refused

это означает, что порт не был заблокирован провайдером: просто на сервере не запущен SSH для этого порта (смотрите статью Безопасность через неясность).

Однако, если вы получите сообщение об ошибке вроде этого:

ssh: connect to host 111.222.333.444 port 22: Operation timed out 

это означает, что что-то отклоняет ваш трафик TCP, предназначенный для порта 22. Как правило, этот порт скрыт либо вашим фаерволлом, либо третьей стороной (например, провайдером, блокирующим и/или отклоняющим входящий трафик на порт 22). Если вы знаете, что фаерволл на вашем компьютере не запущен и Гремлины не размножаются на ваших роутерах и свитчах, это означает, что провайдер блокирует трафик.

Чтобы убедиться в этом, вы можете запустить Wireshark на сервере и «прослушать» трафик, предназначенный для порта 22. Поскольку Wireshark является утилитой анализа трафика на уровне 2 , а TCP/UDP используют уровень 3 и выше (смотрите статью TCP/IP), если вы ничего не получаете при создании удаленного подключения, вероятнее всего, что третья сторона блокирует трафик для этого порта на вашем сервере.

Диагностика

Установите либо tcpdump, либо Wireshark из пакета wireshark-cli.

Для tcpdump:

# tcpdump -ni интерфейс "port 22"

Для Wireshark:

$ tshark -f "tcp port 22" -i интерфейс

где интерфейс — сетевой интерфейс для соединения WAN (для проверки выполните ip a). Если вы не получаете никаких пакетов при попытке удаленного подключения, можете быть уверены, что ваш провайдер блокирует входящий на порт 22 трафик.

Возможное решение

Вы можете просто использовать другой порт, который провайдером не блокируется. Откройте файл /etc/ssh/sshd_config и укажите другой порт. Например, добавьте:

Port 22
Port 1234

Также удостоверьтесь, что другие строки «Port» закомментированы. Если просто закомментировать строку «Port 22» и прописать «Port 1234», проблема не будет решена, поскольку sshd будет прослушивать лишь порт 1234. Используйте обе строки для запуска сервера SSH на обоих портах.

Перезапустите сервер sshd.service. Готово! Теперь вам необходимо настроить ваш(и) клиент(ы) на использование другого порта.

Read from socket failed: connection reset by peer

Последние версии openssh иногда выдают подобное сообщение при попытке подключения к старым SSH-серверам. Это можно обойти с помощью различных параметров клиента (подробнее см. ssh_config(5)).

Причиной проблемы может быть алгоритм эллиптических кривых ecdsa-sha2-nistp*-cert-v01@openssh. Его можно отключить, удалив название алгоритма из списка HostKeyAlgorithms.

Если это не помогло, возможно, список алгоритмов слишком длинен. Укажите в параметре Ciphers менее длинный список (короче 80 символов). Аналогично можно попробовать сократить список MACs.

Также стоит изучить обсуждение[устаревшая ссылка 2021-05-17 ⓘ] на форуме openssh.

«[ваша командная оболочка]: No such file or directory» / ssh_exchange_identification problem

Одна из возможных причин — необходимость найти абсолютный путь (который возвращает команда whereis -b [ваша командная оболочка], например) в $SHELL, даже если бинарный пакет вашего интерпретатора находится в одной из записей $PATH.

Ошибки «Terminal unknown» и «Error opening terminal»

Если вы получаете одну из таких ошибок во время входа, это значит, что сервер не может распознать ваш терминал. Приложения ncurses вроде nano могут не запуститься, выдав сообщение «Error opening terminal».

Правильным решением будет установить файл terminfo клиентского терминала на сервер. Тогда консольные программы на сервере будут знать, как правильно взаимодействовать с вашим терминалом. Информацию о текущем terminfo можно получить с помощью команды infocmp, после чего нужно выяснить, какому пакету он принадлежит.

Если установить файл нормально не удаётся, скопируйте его в домашний каталог на сервере:

$ ssh myserver mkdir -p  ~/.terminfo/${TERM:0:1}
$ scp /usr/share/terminfo/${TERM:0:1}/$TERM myserver:~/.terminfo/${TERM:0:1}/

После выхода и отключения от сервера проблема должна решиться.

Хак $TERM

Примечание: Это должно быть последним средством.

Можно задать переменную окружения сервера TERM=xterm (например, в файле .bash_profile). Это заглушит сообщения об ошибках и позволит запуститься приложениям ncurses, но результатом может стать странное поведение и графические баги — кроме случая, если контрольные последовательности вашего терминала совпадают с таковыми у xterm.

Ошибка Connection closed by x.x.x.x [preauth]

Если вы получили такое сообщение об ошибке, убедитесь, что настроен верный HostKey:

HostKey /etc/ssh/ssh_host_rsa_key

id_dsa не используется в OpenSSH 7.0

OpenSSH 7.0 прекратил использование открытых ключей DSA из соображений безопасности. Если вам очень нужно именно эти ключи, воспольуйтесь опцией PubkeyAcceptedKeyTypes +ssh-dss (на странице https://www.openssh.com/legacy.html она не упомянута).

Не удаётся подобрать способ обмена ключами в OpenSSH 7.0

OpenSSH 7.0 прекратил использование алгоритма diffie-hellman-group1-sha1, поскольку он ненадёжный и теоретически может быть взломан т.н. атакой Logjam (см. https://www.openssh.com/legacy.html). Если этот алгоритм будет нужен какому-то хосту, ssh выдаст соощение об ошибке следующего содержания:

Unable to negotiate with 127.0.0.1: no matching key exchange method found.
Their offer: diffie-hellman-group1-sha1

Лучшим решением будет обновить сервер и отключить использование устаревших алгоритмов. Если это сделать невозможно, вы можете заставить клиент включить алгоритм параметром KexAlgorithms +diffie-hellman-group1-sha1.

Сеанс tmux/screen прерывается при разрыве соединения SSH

Если ваши процессы прерываются при завершении сеанса SSH, возможно, что вы используете активацию сокета и systemd принудительно её убивает. В этом случае есть два решения. Первый — не использовать активацию сокета и заменить ssh.socket на ssh.service. Второй — задать параметр KillMode=process в разделе Service файла ssh@.service.

Параметр KillMode=process может также быть полезен при работе с классическим ssh.service, т.к. он не позволяет убить процесс сессии SSH или процессы screen и tmux при остановке или перезагрузке сервера.

Сеанс SSH не отвечает

SSH реагирует на команды управления XON и XOFF. Он остановится, если вы случайно нажали Ctrl+s. Нажмите Ctrl+q, чтобы продолжить сеанс.

Broken pipe

Если вы пытаетесь установить соединение и получаете ответ Broken pipe на packet_write_wait, попробуйте подключиться в режиме отладки. Посмотрите, если ли в выводе сообщений об ошибках:

debug3: send packet: type 1
packet_write_wait: Connection to A.B.C.D port 22: Broken pipe

Строчка send packet указывает на то, что ответный пакет получен не был. Следовательно, проблема заключается в QoS. Чтобы уменьшить потерю пакетов, задайте значение параметра IPQoS:

/etc/ssh/ssh_config
Host *
    IPQoS reliability

Значение reliability (0x04) должно решить проблему. Также можно задать значения 0x00 и throughput (0x08).

Демон медленно запускается после перезагрузки

Если демон запускается необычно долго после перезагрузки (несколько минут), особенно для headless- и виртуализированных серверов, это может быть связано с нехваткой энтропии [8]. Для решения этой проблемы установите Rng-tools или Haveged. Однако обратите внимание на вопросы безопасности, которые обсуждаются в посвящённых этим утилитам статьях.

Завершение неотвечающего SSH-соединения

Если клиентский сеанс больше не отвечает и не завершается командами вызвавшей программы (например, командной оболочки), то завершить его можно последовательным нажатием клавиш Enter, ~ и ..

~ является управляющей последовательностью псевдотерминала (см. ssh(1) § ESCAPE CHARACTERS), которую можно нажимать несколько раз в зависимости от того, какой сеанс необходимо завершить. Например, если вы установили соединение от А к Б, а затем от Б к В, и сеанс Б-В больше не отзывается, завершить его можно нажав Enter и введя ~~.. После этого останется только рабочий сеанс с Б.

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

Если клиент выдаёт предупреждение, что ключ ssh-сервера изменился, убедитесь, что новый ключ действительно принадлежит оператору сервера. Если всё в порядке, удалите старый ключ из файла known_hosts командой ssh-keygen -R $SSH_HOST и используйте новый.

Смотрите также

  • Защита от атак перебором
  • Управление ключами OpenSSH: Часть 1 на IBM developerWorks, Часть 2 и Часть 3 на funtoo.org
  • Secure Secure Shell

Понравилась статья? Поделить с друзьями:
  • Error opening terminal sipp
  • Error opening terminal screen xterm 256color
  • Error opening terminal rxvt unicode
  • Error opening terminal linux
  • Error opening streaming file paks win64 pc all opt starpak