В недавней версии Upstart появились новые необычные системные функции запуска заданий при входящем соединении через сокет-мост. Я хотел бы запустить мой sshd при первом подключении к порту 22.
Теперь у меня есть: start on socket PROTO=inet PORT=22
в моем ssh.conf, и у меня запущены задания upstart-socket-bridge и upstart-udev-bridge.
Задание ssh начинается нормально, когда я подключаюсь к своему ящику через порт 22, но sshd не отвечает мне. Как будто он не получает и не может принять это. Повторная попытка подключения не поможет, даже sshd сейчас работает и должен нормально принимать подключения. Upstart все еще возится с этим!
Справочные страницы событий сокетов говорят:
Когда обнаруживается входящее соединение, файловый дескриптор, представляющий сокет, передается в задание, позволяющее ему принять (2) соединение. Кроме того, переменная среды UPSTART_JOB будет содержать имя события («сокет»), а переменная среды UPSTART_FDS будет содержать номер дескриптора файла, соответствующего прослушивающему сокету.
blockquote>Значит ли это, что для того, чтобы воспользоваться этим преимуществом, ssh нужна особая поддержка для передачи сокета FD? Если это так, то это все портит веселье: /
Для использования моста сокетов требуется исправленный демон, который может обрабатывать данный сокет.
Из man socket-event
:
Когда обнаруживается входящее соединение, дескриптор файла, представляющий сокет, передается в задание, о котором идет речь, чтобы позволить ему принять (2) соединение. Кроме того, переменная среды UPSTART_JOB будет содержать имя события («сокет»), а переменная среды UPSTART_FDS будет содержать номер дескриптора файла, соответствующего прослушивающему сокету.
blockquote>Хотя обычно sshd просто создает сокет и запускает на нем listen (), а затем accept (), sshd просто нужно прочитать переменную окружения UPSTART_FDS и принять accept ().
Я бы настоятельно рекомендовал запускать sshd как обычный сервис, а не запускать его по требованию. sshd вполне способен самостоятельно управлять соединениями во всех случаях, кроме самых крайних.
Если вам абсолютно необходимо запустить sshd по требованию, для устранения неполадок помогут следующие команды:
ps auxw | grep ssh
, grep для ssh в списке запущенных процессов. netstat -tlp
, дает список портов TCP, которые в данный момент прослушивает служба. SSH должен быть указан здесь, если нет, sshd не настроен должным образом. ssh -vvv
(запуск от клиента), подробный отладочный вывод из вашего ssh-сеанса, помогает точно определить точку сбоя. nmap <hostname>
(запускается с клиента - требует установки пакета nmap), список открытых портов на хосте. Если SSH не указан здесь, но указан в выводе netstat
, возможно, у вас проблема с брандмауэром.