Welcome, anonymous (IP: 23.20.162.200). Sign in
Blog

Переподключение к SSH
Каюсь, случался у меня простой сервера, и не раз, — то забыл ноутбук на зарядку поставить, и ушёл спать, то у провайдера интернет не работает, а резервного интернета у меня нет, то электрики свет отключили и ладно, ведь роль сервера выполняет ноутбук, но опять же коммутатор провайдера в подъезде не имеет резервного питания, а я снова без резервного интернета... Со временем все эти баги исправляются.

В моём случае роль сервера выполняет слабенький ноутбук на целероне, а до VDS просто проброшены ssh-тоннели на необходимые порты, таким образом доступны все сервисы. Когда интернет не работает, то ssh-тоннели отваливаются, и каждый раз приходится вручную запускать их. Решил это исправить.

Однострочник, реализующий перезапуск ssh.
sssh() { while true; do ssh "$@"; [ "$?" -ne "255" ] && return; sleep 1; done }


Функция в бесконечном цикле будет перезапускать соединение по ssh, но при условии, что ssh-сессия завершилась «некорректно», то есть, если пользователь сам завершил ssh-сессию, то переподключения не произойдёт и это очень удобно. Для проверки работоспособности можно выполнить kill -9 $$ и logout.

Впредь нужно использовать sssh (Sticky SSH) вместо ssh, если необходимо сохранять подключение к серверу постоянно активным.

Так же следует помочь серверу с отключением зависших ssh-сессий. Демон ssh должен проверять состояние клиентов и автоматически отключать их, если они не отвечают на ping-запросы. Бывает, что во время внезапного отключения от сети ssh не успевает послать запрос серверу на закрытие соединения и ssh так и продолжает висеть открытым соединением на сервере, и плохо тем, если ssh занимает порт.

Обязательно включите проверку соединений на сервере.
# sed -i 's/^[#]TCPKeepAlive .*/TCPKeepAlive no/g' /etc/ssh/sshd_config
# sed -i 's/^[#]ClientAliveInterval .*/ClientAliveInterval 10/g' /etc/ssh/sshd_config
# sed -i 's/^[#]ClientAliveCountMax .*/ClientAliveCountMax 3/g' /etc/ssh/sshd_config


Для клиента следует использовать аналогичные опции, чтобы ssh проверял состояние подключения к серверу. Таким образом команда для подключения к серверу с пробросом портов имеет следующий вид.
# sssh \
	-R 5222:localhost:5222 \
	-R 5269:localhost:5269 \
	-o ConnectTimeout=1 \
	-o ServerAliveInterval=10 \
	-o ServerAliveCountMax=3 \
	-o ExitOnForwardFailure=yes \
	-i /home/spoofing/.ssh/id_rsa_ \
	spoofing@188.120.228.201


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

И вот как это выглядит.
Last login: Fri May 29 08:23:41 2015 from 83.143.32.17
[spoofing@spfng ~]$ su -
Password: 
[root@spfng ~]# reboot

Broadcast message from spoofing@spfng.com
        (/dev/pts/0) at 8:24 ...

The system is going down for reboot NOW!
[root@spfng ~]# Connection to 188.120.228.201 closed by remote host.
Connection to 188.120.228.201 closed.
ssh: connect to host 188.120.228.201 port 22: Connection timed out
ssh: connect to host 188.120.228.201 port 22: Connection timed out
ssh: connect to host 188.120.228.201 port 22: Connection timed out
ssh: connect to host 188.120.228.201 port 22: Connection timed out
Last login: Fri May 29 08:24:13 2015 from 83.143.32.17
[spoofing@spfng ~]$ 

Author: Spoofing , @ , WWW
Published on: 2015-05-29 12:15:19
Views: 2455
Comments: 6
Comments
Write a Comment:
 (Your comment will appear after it is approved)
 (Not over than 9000 characters)

anonymous
2015-06-16 11:07:47
А почему не запустить сервисы на VDS?
Spoofing , @ , WWW
2015-06-16 11:47:53
VDS физически находится в другом месте; не доверяю приватную информацию неподконтрольному серверу.
anonymous
2015-06-18 14:11:14
А почему не использовать просто autossh?
anonymous
2015-12-01 17:32:22
mosh, ё-моё
anonymous
2016-02-29 14:16:22
ssh: connect to host 188.120.228.201 port 22: Connection timed out
ssh: connect to host 188.120.228.201 port 22: Connection timed out
ssh: connect to host 188.120.228.201 port 22: Connection timed out
ssh: connect to host 188.120.228.201 port 22: Connection timed out
1000 и 1 способ влететь в fail2ban
anonymous
2017-07-28 13:28:33
 (Comment pending approval)
Copyright © Spoofing. All rights reserved.