У меня есть несколько устройств, которые могут обслуживаться через сервер.
Поскольку устройства подключаются через сеть GPRS с заблокированными входящими подключениями, я проверяю их на сервере каждые несколько минут. Сервер ответит, если обратный туннель SSH необходим команде поддержки, и обработает доступный порт на сервере.
Как только этот порт будет обработан на клиентском устройстве, устройство откроет обратный туннель ssh для учетной записи с ограниченными правами (оболочка недоступна из-за директивы command="/sbin/nologin"
в файле authorized_keys
) с этой командой:
ssh -fN -R $AVAILABLE_PORT:localhost:22 srvUsername@srvHost -i Indentity
На сервере я вижу, что доступный порт использовался с netstat -tulpn
с таким выводом:
tcp 0 0 127.0.0.1:PORT 0.0.0.0:* LISTEN -
tcp 0 0 ::1:PORT :::* LISTEN -
И этот порт будет прослушиваться, пока я не уничтожу процесс ssh на клиентском компьютере, который его открыл.
Но время от времени (в основном во время проблем с сетью), даже если я убиваю процесс или выключаю клиентский компьютер, этот порт будет продолжать прослушивать сервер.
Есть ли способ закрыть этот сокет со стороны сервера без перезапуска службы ssh?
Соединения GPRS являются нестабильными, поэтому я могу столкнуться с ситуацией, когда я исчерпал все доступные порты и должен ждать, пока они не истекут. Также я полагаю, что клиенты успешно завершают процесс ssh, когда соединение больше не требуется. Я хотел бы сделать это на стороне сервера.