Протестируем SSH соединение 5 простыми способами

Материал из support.qbpro.ru

1. Метод:


Используем bash утилиту timeout для проверки соединения SSH

  • Утилита /usr/bin/timeout устанавливается по умолчанию в большинстве дистрибутивов, которые входят в состав coreutils rpm в Linux

Проверьте, установлен ли coreutils на вашем сервере

# rpm -q coreutils
coreutils-8.22-24.el7.x86_64

Мы можем использовать эту утилиту для проверки соединения SSH, проверив состояние порта 22. Синтаксис:

# timeout <value> bash -c "</dev/tcp/<server>/<port>"

Здесь server2 – мой целевой хост, я выполню команду со значением тайм-аута 5 с на порт 22

# timeout 5 bash -c "</dev/tcp/server2/22"

Если статус вывода равен 0, это означает, что тестовое соединение ssh прошло успешно

# echo $?
0

Или, если вы получили «connection refused» с ненулевым состоянием вывода, то тестовое соединение SSH не удалось

# timeout 5 bash -c "</dev/tcp/server2/22"
bash: connect: Connection refused
bash: /dev/tcp/10.10.10.10/22: Connection refused
# echo $?
1

Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22

# cat /tmp/check_connectivity.sh
#!/bin/bash

server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout

timeout $connect_timeout bash -c "</dev/tcp/$server/$port"
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi

2. Способ:


Использование nmap для проверки соединения SSH

  • Nmap широко используется для проверки состояния порта, поэтому мы можем использовать Nmap для проверки порта 22 на целевом хосте.

Nmap не устанавливается по умолчанию в большинстве дистрибутивов, и вы должны установить его перед использованием В средах RHEL / CentOS используйте yum или dnf для установки nmap

  1. yum -y install nmap

Синтаксис:

# nmap <server> -PN -p ssh | egrep 'open|closed|filtered'

Где:

-Pn Рассматривать все хосты как онлайн - пропускает исследование хоста
-p ssh Проверять только SSH-порт по умолчанию
open означает, что приложение на целевой машине прослушивает соединения / пакеты на этом порту
closed порты не имеют никакого приложения, слушающего их, хотя они могут открыться в любое время
filtred означает, что брандмауэр или другое сетевое препятствие блокирует порт, так что Nmap не может определить, открыт он или закрыт. 

Здесь server2 – мой целевой хост, и мы ищем статус порта с помощью nmap

nmap server2 -Pn -p ssh | egrep -io 'open|closed|filtered'
closed

или в случает открытого порта:

nmap server2 -Pn -p ssh | egrep -io 'open|closed|filtered'
open

Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22

# cat /tmp/check_connectivity.sh
#!/bin/bash

server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout

status=`nmap $server -Pn -p $port | egrep -io 'open|closed|filtered'`
if [ $status == "open" ];then
   echo "SSH Connection to $server over port $port is possible"
elif [ $status == "filtered" ]; then
   echo "SSH Connection to $server over port $port is possible but blocked by firewall"
elif [ $status == "closed" ]; then
   echo "SSH connection to $server over port $port is not possible"
else
   echo "Unable to get port $port status from $server"
fi

* Способ 3:


Используем netcat или nc для проверки соединения SSH Мы можем использовать утилиты nc и ncat для проверки состояния портов целевых хостов и тестирования SSH-соединения. nc и ncat предоставлены пакетом nmap-ncat rpm Чтобы проверить, установлен ли nmap-ncat на вашем сервере:

  1. rpm -q nmap-ncat

nmap-ncat-6.40-19.el7.x86_64 Синтаксис:

# nc --wait <value> <server> <port> < /dev/null &> /dev/null

Здесь мы определили период ожидания соединения 5 секунд, который вы можете изменить в зависимости от вашей среды

nc --wait 5 server2 22 < /dev/null &> /dev/null
echo $?
0

Про ненулевое состояния вывода мы знаем, что SSH-соединение не будет установлено у соответствующего целевого хоста

 nc --wait 5 server2 22 < /dev/null &> /dev/null
# echo $?
1

Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22

# cat /tmp/check_connectivity.sh
#!/bin/bash

server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout

nc --wait $connect_timeout $server $port < /dev/null &> /dev/null
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi

4. Способ:


Используем SSH для проверки SSH-соединения. Я знаю, что мы ищем альтернативы SSH для проверки SSH-соединения, но если у вас настроена конфигурация с подключением без пароля, вы также можете использовать SSH для этой проверки Мы будем использовать ConnectTimeout, чтобы убедиться, что наш SSH не застревает в ожидании подключения В этом случае используется StrictHostKeyChecking, чтобы избежать любых запросов безопасности Если BatchMode имеет значение yes, запрос парольной фразы/пароля будет отключен Если вы не используете аутентификацию без пароля, тогда этот метод не будет очень полезен, так как команда запросит пароль и этот вариант не сможет быть автоматизирован Здесь мы используем ‘exit 0’ в качестве удаленной команды, которая будет вызываться при успешном SSH коннекте

# ssh -q -o BatchMode=yes  -o StrictHostKeyChecking=no -o ConnectTimeout=5 server2 'exit 0'
# echo $?
0

Хотя, если выходное значение вывода не равно нулю, мы знаем, что тестовое соединение SSH не удалось

# ssh -q -o BatchMode=yes  -o StrictHostKeyChecking=no -o ConnectTimeout=5 server2 'exit 0'
# echo $?
255

Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22

# cat /tmp/check_connectivity.sh
#!/bin/bash

server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout

ssh -q -o BatchMode=yes  -o StrictHostKeyChecking=no -o ConnectTimeout=$connect_timeout $server 'exit 0'
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi

5. Способ: используем telnet для проверки соединения SSH Telnet – еще один очень удобный инструмент для проверки состояния порта. /usr/bin/telnet предоставляется пакетом telnet rpm, которая является частью репозиториев по умолчанию, и вам не нужно никакого стороннего репозитория для установки Проверьте, установлен ли telnet

# rpm -q telnet
telnet-0.17-65.el7_8.x86_64

Синтаксис

# telnet <server> <port>

Но поскольку нашей конечной целью является автоматизация, мы настроим синтаксис так:

# echo quit | telnet <server> <port> 2>/dev/null | egrep -qi Connected

Давайте использовать это для тестирования SSH-соединения в Linux. Если мы видим вывод grep “Connected“, то порт 22 доступен и соединение SSH возможно

# echo quit | telnet server2 22 2>/dev/null | egrep -qi Connected
# echo $?
0

Обратный вариант:

# echo quit | telnet server2 22 2>/dev/null | egrep -qi Connected
# echo $?
1

Пример shell скрипта Мы можем использовать этот инструмент в скрипте оболочки для проверки соединения SSH на порту 22

# cat /tmp/check_connectivity.sh
#!/bin/bash

server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout

echo quit | telnet $server $port 2>/dev/null | egrep -qi "Connected"
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi